最近大神Brendan Gregg写了一篇Linux Load Averages的blog,花了一上午膜拜了一下,受益良多。
只要用过Linux的人,相信都用过uptime命令
查看Linux当前1分钟,5分钟,15分钟的系统平均负载。且慢,系统负载到底是什么意思?很多人压根儿没想过这问题,能说得上来的人很少,而能说对的人肯定凤毛麟角。
Brendan Gregg原来是Unix/BSD
圈子的,来到Netflik
后慢慢转向Linux
平台了。Brendan Gregg发现Linux
平台上面的Load averages
和BSD
平台不大一样,这勾起了他究其原因的兴趣。于是Brendan Gregg出手了,抽丝剥茧,顺藤摸瓜,把这个问题里里外外扒了个遍,读起来真是酣畅淋漓,大呼过瘾啊!
Brendan Gregg先从布满灰尘的旧纸堆里,找出了load averages
最开始的实现,并根据源代码解释了具体含义(水平太烂,没怎么看懂)。然后话题转向了Linux,Linux的load averages除了计算原有的runnable tasks,还加上了uninterruptible state tasks。Brendan Gregg称这个变动为mystery
,因为根据Linux现有代码没找到任何解释。
所以Brendan Gregg开始了寻根问祖。
- 搜索Linux的Git库,试图寻找这个patch是怎么加上去的,无果
- 找Linux更老的repo,无果
- 查询最开始的kernel版本,发现变动的版本。但是只解释了有变动,没有具体说明
- 扒kernel的邮件列表归档,但是管理员把旧的归档删掉了
- 幸好有些kernel-devel的归档还在。查了98000封email,还是没找到原始patch
Brendan Gregg有点怀疑这个patch记录已经丢失了,所以现在load averages
才那么的mystery
。功夫不负有心人,终于在oldlinux.org找到了当年的patch,这个patch已经过去24年了!!
提一下oldlinux.org,这个是赵炯师兄研究早期Linux版本的一个网站,师兄还出过一本内核的书籍《Linux内核完全剖析》,剖析Linux0.11/0.12版本的,很多人就是看这本书开始学习内核的吧。当然我叫师兄纯粹是傍大款。
Brendan Gregg发了邮件问了patch的提交者Matthias,Matthias一小时后就回复了邮件。Brendan Gregg感到很开心,大大的点了赞。难道大神在BSD有什么伤心往事?Brendan Gregg觉得Matthias言之有理,系统负载不仅仅表示CPU负载,还包括其它系统资源。
Brendan Gregg又回到现在的kernel代码,通过🔥图分析了当前kernel代码里面的TASK_UNINTERRUPTIBLE,并结合具体的例子,论证了Linux的load averages,更加合理的说明了当前系统的负载(水平太差,又需要再学习)。最后Brendan Gregg又给出了更多的工具,去定位CPU资源的具体消耗情况。
终于,Brendan Gregg终于解决了一个历史悬案,Linux的load averages到底代表什么意思。不过让我敬佩的是,一个很简单,很细微的小问题,大神都不放过,有疑问打破沙锅问到底。这种对技术的追求,这种求知欲,这种钻研精神,才是让我顶礼膜拜的。身为程序员,谁说我不追星,谁说我没有偶像,这就是我的偶像,单纯的做着纯粹的事。啥时候才能有幸和偶像一起共事哇!