高性能 Go 服务的内存优化(译)

原文地址: Allocation Efficiency in High-Performance Go Services, 没有原模原样的翻译, 但不影响理解。 关于工具 我们的第一个建议就是: 不要过早优化。Go 提供了很棒的性能调优工具可以直接指出代码上哪里消耗了大量内存。没必要重复造轮子,建议读者阅读下 Go 官方博客上的这篇很赞的文章;里面会一步步教你使用 pprof 对 CPU 和内存进行调优。在 Segment 我们也是用这些工具去找到项目的性能瓶颈的。 用数据来驱动优化。 逃逸分析 ...阅读全文

2018.11.06 08:21 达菲格
阅读:4394 评论:0

Go 的调度器追踪

## 简介 我喜欢 Go 语言的一个原因就是因为它可以生成分析和调试信息。当程序在执行的时候 Go 有一个特殊的环境变量 GODEBUG,它在运行阶段可以生成调试信息。你可以获取程序回收器和调度器的概要信息以及详细的信息。更主要的是你不需要添加任何的额外工作重新编译就可以完成调试 在这篇文章里,我将通过一个简单的 Go 程序演示如果使用调度跟踪信息。如果你对调度器有一定的了解那么它对你是用的。我建议先阅读下面两篇文章: 并发、goroutines 和 GOMAXPROCS ...阅读全文

2019-03-30 17:07:19 flyup_chen
阅读:2758 评论:0

浅谈 Go 语言 select 的实现原理

Home Menu 浅谈 Go 语言 select 的实现原理 30 Mar 2019 Select Channel 并发编程 Golang Go实现原理 概述 结构 现象 非阻塞的收发 随机执行 编译期间 直接阻塞 独立情况 非阻塞操作 发送 接收 通用情况 运行时 初始化 循环 总结 相关文章 Reference 很多 C 语言或者 Unix 开发者听到 select 想到的都是系统调用,而谈到 I/O 模型时最终大都会提到基于 select、poll 和 epoll 等函数构建的 IO 多...阅读全文

2019-03-31 11:14 draveness.me
阅读:2482 评论:0

聊一聊golang的结构体标签

前言Golang的结构体标签可能每一个Gopher都在用,尤其是在json处理的地方用。比如: 123456type NetConf struct { Master string `json:"master"` Mode string `json:"mode"` MTU int `json:"mtu"` Debug bool `json:"debug"`} 毋庸置疑,这个 NetConf 结构体实体变量在转换 json 的时候,Master 字段会变为 json 字符串中的 “master “。...阅读全文

2019-04-14 00:00 国南之境
阅读:8996 评论:1

Go 测试高级窍门和技巧

2017 年 2 月 1 日 · 5 min 阅读 这篇文章基于我在 [维尔纽斯的 Golang 交流会](https://www.meetup.com/Vilnius-Golang/) 上的演讲。 我读了很多博客,看了很多演讲并把所有这些窍门和技巧都集中在一个地方。首先我想感谢那些提出这些想法并把它们分享到社区的人。我从下面的这些工作中借鉴了资料和示例: - [Andrew Gerrand - Testing Techniques](https://talks.golang....阅读全文

2019-06-16 18:55:05 krystollia
阅读:2197 评论:0

Go内存分配那些事,就这么简单!

原文链接:mp.weixin.qq.com/s/3gGbJaeuv… 新老朋友好久不见,我是大彬,这篇文章准备了很久,不是在拖延,而是中间做了一些其他事情,耽搁了一些。 这篇文章主要介绍Go内存分配和Go内存管理,会轻微涉及内存申请和释放,以及Go垃圾回收。 从非常宏观的角度看,Go的内存管理就是下图这个样子,我们今天主要关注其中标红的部分。 友情提醒: 文章有点长,建议先收藏,后阅读,绝对是学习内存管理的好资料。 本文基于go1.11.2,不同版本Go的内存管理可能存在差别,比如1.9与1.1...阅读全文

2019年07月07日 我是大彬
阅读:1931 评论:0

Golang 大杀器之跟踪剖析 trace

image 原文地址:Golang 大杀器之跟踪剖析 trace 在 Go 中有许许多多的分析工具,在之前我有写过一篇 《Golang 大杀器之性能剖析 PProf》 来介绍 PProf,如果有小伙伴感兴趣可以去我博客看看。 但单单使用 PProf 有时候不一定足够完整,因为在真实的程序中还包含许多的隐藏动作,例如 Goroutine 在执行时会做哪些操作?执行/阻塞了多长时间?在什么时候阻止?在哪里被阻止的?谁又锁/解锁了它们?GC 是怎么影响到 Goroutine 的执行的?这些东西用 PP...阅读全文

阅读:2960 评论:0

细说Golang的JSON解析

之前一直写一些动态语言,觉得解析JOSN还是很简单的,往往只需要几行代码就能拿到解析好的JSON对象。Go语言自带的json包可以让你在程序中方便的读取和写入 JSON 数据。生成JSON场景相对简单一些,json.Marshal()会根据传入的结构体生成JSON数据。解析JSON会把数据解析到结构体中,由于JSON格式的自由组合的特点,尤其是那些结构复杂的JSON数据对新手来说声明接受JSON数据的结构体类型就会陷入不知从何下手的困扰。 最近工作中由于要解析JS和PHP程序持久化的JSON数据...阅读全文

阅读:1502 评论:0

使用 Go Modules(模块)进行依赖项迁移

## 介绍 本篇文章是 Go Modules 系列文章的第 2 部分。第 1 部分请参阅 [Go Modules 的使用方法(中文翻译版)](https://studygolang.com/articles/19334) [Using Go Modules(EN)](https://blog.golang.org/using-go-modules) Go 项目使用各种各样的依赖关系管理策略,像 `dep` 和 `glide` 这样的第三方依赖项[vendor](https...阅读全文

2019-08-28 10:30:46 polaris
阅读:4914 评论:2

Go 问答之如何阅读 Go 源码

我的知乎回答,问题是关于如何阅读 Go 源码。地址。胡扯了些自己的想法。 Go 的源码在安装包的 src/ 目录下。怎么看它的源码呢?直接看吧!没人教的情况下,只能自己撸了。当然,这种内容一般也不会有人教。 怎么撸? Go 源码中,应该可分为与语言息息相关的部分,和官方提供的标准库。与语言实现相关的肯定是最难的,不是那么容易理解。可以先主要看标准库,其他的可以先大概了解下。 先把源码目录整体扫一遍,大概看看涉及了哪些模块,然后再挑自己喜欢的部分进行更深一步的学习与研究。建议每个目录都简单写个 h...阅读全文

2019年08月28日 波罗学
阅读:4975 评论:2

Go微服务全链路跟踪详解

在微服务架构中,调用链是漫长而复杂的,要了解其中的每个环节及其性能,你需要全链路跟踪。 它的原理很简单,你可以在每个请求开始时生成一个唯一的ID,并将其传递到整个调用链。 该ID称为CorrelationID¹,你可以用它来跟踪整个请求并获得各个调用环节的性能指标。简单来说有两个问题需要解决。第一,如何在应用程序内部传递ID; 第二,当你需要调用另一个微服务时,如何通过网络传递ID。 什么是OpenTracing? 现在有许多开源的分布式跟踪库可供选择,其中最受欢迎的库可能是Zipkin²和Ja...阅读全文

2019-09-25 09:02:33 倚天码农
阅读:6562 评论:2

Module 第 1 部分:为什么和做什么

## 引言 Module 针对自 Go 语言初版发布以来即成为开发者痛点的三个关键问题提供了完整的解决方案,使得开发者: * 能够在 GOPATH 工作区之外使用 Go 代码; * 能够对依赖包进行版本控制并识别可以使用的最兼容版本; * 能够使用 Go 原生工具来管理依赖包; 随着 Go 语言 1.13 版本的发布,这三个问题已经成为了“过去时”。在过去的两年中,Go 语言团队花费了很多精力才让所有人达到这一步。在本文中,我将重点介绍从 GOPATH 到 module 的...阅读全文

2019-11-10 19:39:50 zhoudingding
阅读:2735 评论:0

Uber Go 语言编码规范

Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司,也是 Go 语言的早期 adopter。其开源了很多 golang 项目,诸如被 Gopher 圈熟知的 zap、jaeger 等。2018 年年末 Uber 将内部的 Go 风格规范 开源到 GitHub,经过一年的积累和更新,该规范已经初具规模,并受到广大 Gopher 的关注。本文是该规范的中文版本。本版本会根据原版实时更新。 版本 当前更新版本:2019-11-13 版本地址:commit:#71 如果您发现任何更新、问题...阅读全文

2019年11月15日 知识铺
阅读:2226 评论:1

Go Modules 终极入门

Go modules 是 Go 语言中正式官宣的项目依赖解决方案,Go modules(前身为vgo)于 Go1.11 正式发布,在 Go1.14 已经准备好,并且可以用在生产上(ready for production)了,Go官方也鼓励所有用户从其他依赖项管理工具迁移到 Go modules。 而 Go1.14,在近期也终于正式发布,Go 官方亲自 “喊” 你来用: 因此在今天这篇文章中,我将给大家带来 Go modules 的 “终极入门”,欢迎大家一起共同探讨。 Go modules 是...阅读全文

阅读:3156 评论:1

Go 项目标准布局(结构)

https://github.com/golang-standards/project-layout 项目总结了 Go 项目的布局,这是Go应用程序项目的基本布局,并不是Go核心开发团队定义的官方标准;但是,这是Go生态系统中的一种常见的项目布局模式。 Go目录 /cmd 该目录用于存放 Go 项目的入口,即 main.go。一般来说,我们应该在 cmd 目录下创建子目录,子目录名称代表可执行程序的名称(例如/cmd/myapp)。上面列出的优秀开源项目基本上遵循了这一规则。 一般来说,该目录中...阅读全文

2020-03-03 15:33:24 DevilRoshan
阅读:6371 评论:0

Go 1.14中值得关注的几个变化

可能是得益于2020年2月26日Go 1.14的发布,在2020年3月份的TIOBE编程语言排行榜上,Go重新进入TOP 10,而去年同期Go仅排行在第18位。虽然Go语言以及其他主流语言在榜单上的“上蹿下跳”让这个榜单的权威性饱受质疑:),但Go在这样的一个时间节点能进入TOP 10,对于Gopher和Go社区来说,总还是一个不错的结果。并且在一定层度上说明:Go在努力耕耘十年后,已经在世界主流编程语言之林中牢牢占据了自己的一个位置。 图:TIOBE编程语言排行榜2020.3月榜单,Go语言重...阅读全文

阅读:2600 评论:0

Golang中的Defer必掌握的7知识点

在用Golang开发的时候,defer这个语法也是必备的知识,但是我们除了知道他是在一个函数退出之前执行,对于defer是否还有其他地方需要注意的呢。 本文整理的defer的全场景使用情况,部分场景源自网络,加上自己的额外观点和分析,完成了这份defer的7个隐性必备知识点。 提纲如下: 知识点1: defer的执行顺序 知识点2:defer与return谁先谁后 知识点3:函数的返回值初始化与defer间接影响 知识点4:有名函数返回值遇见defer情况 知识点5:defer遇见panic 知...阅读全文

阅读:2754 评论:2

理解真实世界中Go的并发BUG【阅读笔记】

有几个学生研究归纳了go编程中的并发bugs,发表了一篇(英文)论文。论文原文地址:https://songlh.github.io/paper/go-study.pdf 在此做一个笔记,便于查阅。 文章以六个产品级go应用作为研究对象:Docker、Kubernetes、etcd、gRPC、CockroachDB、BoltDB,总共研究了这些应用中的171个bug,研究它们的根本原因,并重现这些bugs,以及检查它们的修复补丁。最后用两个现有go并发bug检测器测试了这些bug。 文章试图回答...阅读全文

2019-03-07 12:02:13 notjusttech
阅读:1513 评论:0