Skip to main content

有的人走了,但他的代码还闪耀着光芒

【程序员的那些事导读】:2019 年 1 月 2 日,Linux 内核邮件列表发布了一则悲伤的消息:Linux 内核开发者李少华因癌已于 2018 年圣诞节期间离世。


下面是李少华的好友 Coly Li 最近写的一篇文章。

www.weibo.com/ttarticle/p/show?id=2309404323330038621366#_0

追思心中璀璨的明星:杰出内核开发者李少华

2018 年最后一天,我在商场溜娃,忽然看到少华妻子的朋友圈提到李少华于 12 月 28 日离开了我们。我知道少华前阵子身体不好但有好转,这心痛的消息来得太突然,眼泪一下就出来了。家人也发现了我忽然情绪低沉,我忍不住眼泪颤抖的说“少华走了”。

李少华是我们这一辈 Linux 内核开发者之中的杰出代表,应该说是目前华人圈最优秀和最重要的 Linux 内核开发者之一,他除了是内核子系统 MD(软raid)的维护者之外,在块设备层、I/O 调度器、NVMe、内存管理、电源管理等领域都做出了非常重要的工作。他的代码和对内核的改进,融合在整个内核在 IO 和存储站的方方面面,真的是通过很具体的工作,贡献了正能量,让这世界变得更美好了些许。

和少华家人联系后得知,在最后的时候,少华还时不时的提起“我有了一个新的想法”,“这段代码路径还可以再优化改进”。这是一个多么纯粹的人,对系统软件技术充满的虔诚的纯真的热爱,我心想恐怕也只有这般专注,才能成为一个改变世界的人。很多人活一辈子,恐怕也没有少华这三十几年来的闪亮和耀眼。一辈子活成这样,从个人来说,没有遗憾,是我们心目中的英雄!

我和少华最直接的工作交集,我印象最深的有两件事情。

第一件事情是我在解决 MD raid1在 NVMe SSD 上的读写性能瓶颈时,少华认为我的修改可能会在多层 MD 设备堆叠的时候引入死锁,而我认为不会。我们在邮件列表里来回讨论了很多次,他指导我来理解MD代码中的一些细节,最终我们发现 MD raid1 在发射 IO 的时候会从另外一个 raid1d() 线程来处理,所以不会在 generic_make_request() 里面发生死锁,少华鼓励我“这是很好的讨论”,然后接受了我的 patch。而后来少华还发现了我的 patch 里的其他问题,直接就修掉了。在少华的帮助下,除了我们将 MD raid1 的读性能提升了好几倍之外,我也对 MD 的基本原理有了更深刻的认识。

第二件事情是有用户报告 MD raid0 在 NVMe SSD 上做 trim 的时候时间非常久,我自己测试在 15T 的 NVMe raid0 设备上格式化 xfs 文件系统(加trim)需要 300 多秒,绝大多数时间都用在 trim 这里了,这是很不正常的。少华分析这是因为 raid0 会将上层发来的 discard bio 按照 stripe 大小做切分,然后再发送到 raid0 组成的不同硬盘上去,所以当 raid0 容量比较大的时候,原本的一个 discard bio 可能会被切分成几百甚至上千万个小 bio 来处理,这性能一下就降低了。

我们的思路是将切分后的 bio 再根据每一个 raid0 的组件设备拼接起来,最后可以组成连续的一个或者极少数几个 bio,然后再将拼接后的bio发送到每一个组件设备上去,这样就可以降低几百万个 bio 了。我先写了一个很复杂的 patch,来准确的将所有切分的 bio 按照每个设备一个 bio 的方式拼接起来。虽然拼接出来的 bio 最少,但是代码非常难读懂。少华后来做了一个实现,大概几十行代码,做了一个次优化版本:

raid0_handle_discard()核心代码片段

少华的代码,通过一个很优雅的循环,就完成了将分布在不同组件设备上的 bio 的拼接,并且在绝大多数通常情况下,拼接效果和我的复杂代码一样,速度还更快!最后我测试出来,少华的这个代码可以将在 raid0 上格式化 xfs 文件系统的速度从 300 多秒降低到 20 多秒。当我阅读少华的 patch 时,心中充满的欣赏和愉悦,能看到一段更优雅和高效的代码,真的是非常愉悦的事情,而且这种好心情可以持续很久,每每想起都会觉得开心。

再后来我接手了 bcache 子系统的维护工作,和少华一起密切合作的机会就少了很多。但我一直在关注他在内核里的工作,看到他继续在做的很多优秀的工作。非常切合实际的说,少华是为 Linux 内核做贡献的最杰出和最重要的中国人之一,从全球华人的范围来看他的工作重要性也能够进入前 20 位。而他还这么年轻,还不到 40 岁,实在是我们这辈人之中的璀璨明星,能和他一起工作是我的骄傲和荣幸!

在写这些文字的时候,不禁回想起从最初认识少华,那时他在 Intel OTC 我在 SUSE Labs,他在做性能相关,我在做文件系统。然后2009 年我们在 CLSF[1] 会议上第一次见面,然后 2010 年他和其他 Intel 朋友一起帮忙在 Intel 紫竹园区举行第二届 CLSF。再后来他离开了 Intel 去了存储领域创新独角兽公司 Fusion IO,在 PCIe SSD、IO 调度器和块设备层做了大量的优秀工作。在我加入阿里组建淘宝内核组的时候,他已经决定去 Facebook 内核团队,和 Jens Axboe、Chiris Mason、Tanjun Heo 等国际顶级内核黑客一起工作,很遗憾没有机会和他做同事。少华一直是我们这一批人中最耀眼最杰出的极少数几个人。我在 2016 年遇到参加 Kernel Summit 的 Tanjun Heo 的时候,他特意反复几次的提到,少华非常优秀,在块设备层做了很多优秀的工作。能够被顶级黑客这样评价的人,少之又少,而我认识的国人之中大概也就两三个人吧。当时我意识到,经过长期不懈的努力工作,在 Linux 内核开发领域,少华已经跻身全球最好的 IO 栈开发者之列了。

从 git log 里看到少华的大量的贡献,我感觉到少华虽然人离开了我们,但是他的代码,仍然散发着他的才华,继续在为世界做贡献。在今后的工作中,我们还会继续阅读他的代码,就像和他在谈心,对于熟悉他的人而言,这虽然心酸,也是和老朋友对话的最好的方式。而我也知道,他的代码以及他所维护的 MD 子系统,在工业届被广泛应用。譬如现在火热的 PD-1/PD-L1 生物制药领域,通过大数据的方式来分析 DNA 特征,其中的信息处理系统中 Linux 内核和高性能 IO 栈肯定被广泛地使用到了。少华虽然离开了我们,他为这个世界留下的贡献,仍然在为创造更美好的世界发挥价值。

我们都会离开这个世界,或早或晚,命不在长短而在价值,活得有价值是很幸运的。很痛心少华过早离开了我们,但我也很羡慕他的人生活出了精彩,他自己的不懈奋斗为这操蛋的世界带来了更多的光亮。这光亮,对家人对朋友,都是鼓励和激励,让我们继续在这操蛋的世界里,为更好的世界努力不懈,也享受生活中点滴的幸福。感激少华,你短暂的一生所创造的温暖和快乐,让我感受到这世界多一点的善意和希望。

CLSF[1]: China Linux Storage, Memory management & File system Workshop

Comments

Popular posts from this blog

CKA Simulator Kubernetes 1.22

  https://killer.sh Pre Setup Once you've gained access to your terminal it might be wise to spend ~1 minute to setup your environment. You could set these: alias k = kubectl                         # will already be pre-configured export do = "--dry-run=client -o yaml"     # k get pod x $do export now = "--force --grace-period 0"   # k delete pod x $now Vim To make vim use 2 spaces for a tab edit ~/.vimrc to contain: set tabstop=2 set expandtab set shiftwidth=2 More setup suggestions are in the tips section .     Question 1 | Contexts Task weight: 1%   You have access to multiple clusters from your main terminal through kubectl contexts. Write all those context names into /opt/course/1/contexts . Next write a command to display the current context into /opt/course/1/context_default_kubectl.sh , the command should use kubectl . Finally write a second command doing the same thing into ...

OWASP Top 10 Threats and Mitigations Exam - Single Select

Last updated 4 Aug 11 Course Title: OWASP Top 10 Threats and Mitigation Exam Questions - Single Select 1) Which of the following consequences is most likely to occur due to an injection attack? Spoofing Cross-site request forgery Denial of service   Correct Insecure direct object references 2) Your application is created using a language that does not support a clear distinction between code and data. Which vulnerability is most likely to occur in your application? Injection   Correct Insecure direct object references Failure to restrict URL access Insufficient transport layer protection 3) Which of the following scenarios is most likely to cause an injection attack? Unvalidated input is embedded in an instruction stream.   Correct Unvalidated input can be distinguished from valid instructions. A Web application does not validate a client’s access to a resource. A Web action performs an operation on behalf of the user without checkin...