如何定位 golang 进程 hang 死的 bug

之前在 golang 群里有人问过为什么程序会莫名其妙的 hang 死然后不再响应任何请求。单核 cpu 打满。 这个特征和我们公司的某个系统曾经遇到的情况很相似,内部经过了很长时间的定位分析总结,期间还各种阅读 golang 的 runtime 和 gc 代码,最终才定位到是业务里出现了类型下面这样的代码: package main import "time" func main() { var ch = make(chan int, 100) go func() { for

企业级应用与屎一样的代码

最近在部门内组织了一场撕逼大会,几个 golang 组坐在一起聊一聊未来的应用应该怎么写。感觉收获颇丰。 在企业内部做开发的时候,实际上 99% 的程序员都不太在意代码的质量问题。这个比例我没有任何夸大,从上一家公司出来(倒闭)来到滴滴,又转过一次部门。经手了很多系统,个个也都是国内顶级公司(BAT)来的程序员们,但是代码写出来个顶个的垃圾。不管是维护还是阅读,都非常得痛苦。 一年多以来我一直在思考原因,刚开始的时候想法很极端,认为这些程序员就是基础不过关。但是在和很多人沟通的过程中发现,实际上大部分人都还比较聪明,并且务实而理智,分得清优劣,而不像是我刚来的时候想像的那个样子。 那为什么最终的结果却是写出了无数的垃圾代码呢?又经过了一段时间的思考,我大概总结出以下一些原因: 1.

pprof 和火焰图

发现有同事还不会用 pprof 来排查性能问题。希望看完这篇文章以后能学会。 go 里自带的 pprof 是非常强大的工具。平常可以用来排查线上的 cpu 问题,内存问题。官方的 pprof 使用起来非常简单。如果你的进程是个 web 服务,只要: import _ "net/http/pprof" 然后你的 web 应用就有了生成 profile 的能力。当线上出现问题的时候,如果是进程 cpu 占用过高,我们可以先用

关于 ofo

昨天看到大佬们讨论摩拜和 ofo 谁会成,马化腾提到 ofo 使用的是 token 锁。又想起来半年前和同事们讨论过 ofo 这种离线的会变化的锁密码是怎么实现的。那时候也没有细想,不过现在看着 token 锁这个词。。想起来之前写过的这一篇:关于token [http://xargin.com/about-token/]。原理应该都是一样的。 这里我们假装 geek。用上一篇讲的 token 原理可以很简单地设计出一套 ofo 这样的系统。先来看看 ofo 的系统有哪些组成要件: 车牌号

如何使你的 golang 项目达到 awesome go 的入选标准

这两天想把之前写的工具提交到 awesome go 的 repo 里,所以特意研究了研究 awesome go 的入选 quality standard。 首先你的代码应该要在 goreportcard 上跑个结果: goreport [https://goreportcard.com/report/github.com/cch123/elasticsql] goreportcard 其实就是几种 lint 工具跑出来的一个结果集合。先不说代码必须要过 golint 和 go vet,