人物专访:核心黑客系列之一Robert Love
每个星期,我们都采访一个内核编写社区的人,虽然这样的采访会很侧重技术,但是我们的立足点是为了让所有人都能接受。本周我们采访了Robert Love,现在他正在维护“可抢占内核”的升级包和其他一些事。他使用Linux已经7年了,对于现在的内核有很多贡献。所有这些最后用他自己的话来描述。
记者Jeremy Andrews(一下简称“JA”):请谈一点关于你自己和你的背景Robert?
Rebert Love:我现在是Florida大学计算机和数学系的学生,未婚但有一个很可爱的女朋友。我的编程兴趣是操作系统和数学/科学计算。
JA:你何时毕业?还会继续读研吗?
Rebert Love:我想继续留在学校里读研究生,特别是如果社会经济状况还像现在这样的话。
JA:你何时并且如何开始学习Linux的?
Rebert Love:在1994年,我有了第一台运行Linux的个人电脑,那时还是1.0的内核。这也是我第一次实际接触一个类UNIX的系统。有我一台386SX电脑(感谢妈妈!)并且安装了可转换的Windows 95beta版。随着使用Linux越来越多,我最后终于在2.2的时候完全的转移到Linux上来,从那时起,我一直完全的使用Linux。我当时部分的转移到Linux上是由于一个明显的原因:我相信Linux是一个强大和强壮的系统,它有很好的应用程序。但根本的原因是我喜欢和Linux系统以及围绕在它周围的社区交流的能力。
JA:你能比较一个1.0和2.4内核的不同点吗?
Rebert Love:如果它们有几页代码是相同的话,我会感到很惊奇的。所以,每件事都不同。
JA:安装和使用1.0的内核是怎样的?当时有什么软件?
Rebert Love:很幸运,在1994/1995年,Linux发展的很好。当时SLS和Slackware都发行完整版。我最开始使用Slackware2.0。你不得不下载很多磁盘文件集(disk sets)-也许现在也一样。我记得磁盘文件A好像是核心,磁盘文件N提供网络支持等等。(译者:我想那时没有光盘,发布还是用软盘的,所以才有所谓的磁盘文件,也就是一个文件1.44M)那时Linux就有网络,X (XFree86 2.0)也有,还支持很多硬件呢。从今天看来最大的问题就是缺少文档,在加上复杂的安装过程。我记得我怎么做都不能让PPP工作……最终我放弃了。如果我可以让PPP工作的话,我也许那时就转换到Linux上了。
JA:你做了那些贡献?
Rebert Love:现在我大多数时间用来维护可抢占内核的升级包上。它允许低优先级的进程被抢占,即使是在内核空间(译者:现在的内核是不可抢占的,抢占是只发生在内核空间的工作完成,切换回用户空间的时候),这样可以提高系统响应。这个升级包最初是由MontaVista-一个很棒的公司做的,所以我现在和他们以及社区的其他人紧密的工作。它是一个很有趣的项目。我门的目标是使它加入2.5内核中。我很随意的,否则……我修改漏洞,做优化。我写了i815和AMD761 AGP GART代码。我还维护其他可能加入内核或没用的升级包。
JA:如果内核可以被抢占的话,那么内核将发生什么样的变化?
Rebert Love:我们使用的模型是当内核没有被锁时,允许内核在任何时间都能被抢占。在这种思路的设计下,当使高优先级的进程变为可运行(runnable)的事件发生时,系统将抢占当前的任务并运行高优先级的任务。我们必须修改在entry.S中的中断代码,防止一些情况发生和允许从一个中断处理程序返回的时候抢占。但是,就象我们不能允许多处理同时在临界区(critical regions)内一样,我们不能在临界区内执行抢占-所以当保持一个spinlock(holding a spinlock)的时候,我们要避免抢占的发生。低速内核例程(bottom half handler)和调度程序也被修改来防止它们在执行时被抢占。
JA:就目前来说,你认为这个包有多稳定?我在一个单独的Linux服务器上作所有的工作,我经常升级到新内核和新软件。提高整体系统响应时间看上去很吸引人,但是你认为这个升级包可以稳定到可以被“每天都使用(every-day-use)”的服务器用吗?
Robert Love:这个包非常稳定。我很自信的建议每个人都使用它。我们有很多用户并收到了很多反馈。我想所有明显的bug都被改正了。我现在在我的主系统上就在使用这个包。好的一面是我们知道设计和实现是正确的。使用我们最近的包,我想我们可以处理任何问题。
JA:你看到系统响应时间提高的有多明显?
Rebert Love:非常明显。系统响应时间有200%的提高。通过这个可抢占内核的升级包,平均系统响应时间现在是1ms,最大到10ms。现在还有降低响应时间的一些长时间锁,有些长度达到100ms+。幸运的是,它们只在特别的地方发生,比如“VC切换(switching VCs-译者:不知什么意思:-<)”。
JA:还有一个有Andrew Mortan维护的包也要达到同一个目标,你的和他的有什么区别?
Rebort Love:我们的目标是相同的,那是因为内核代码是非抢占的。所以,内核会一直运行直到完成或者显式的自动放弃。如果在内核执行期间,用户空间的事件发生了,它们必须等到内核完成。这就是我们需要解决的问题,也就是降低系统响应时间的原因。Andrew的低响应时间包在整个内核中的策略点放置了基于条件的调度调用。这些调用可以有效的允许长时间的内核操作说“我很好心可以让其他人来运行,有任务需要运行吗?如果有,运行吧!”这样会打断操作,减少这些地方的系统响应时间。我的这个可抢占内核的包同他的工作机制不同,它通过修改内核本身来允许内核代码被抢占。所以上面的问题根本不会发生-如果一个任务要运行,它就会运行-并且系统响应也改善了。
JA:最近在lkml上你谈到将两种包结合的可能性,你现在有作这方面的工作吗?
Rebert Love:这当然值得考虑。因为我们在上锁期间不能抢占,那么长时间的锁就会对系统响应时间造成值得注意的影响。该锁的操作时间就是系统的等待时间了。一个解决办法是像Andrew那样中断锁操作。这就是将他的包融入可抢占内核的部分。或者更实际的办法,做一个应用了他的包的能意识到抢占的版本,当一个锁操作时引发的任何一个基于条件的调度程序也许是很有帮助的。这个方向的一个问题就是确认一个长时间的锁操作。这是preempt-stats包的作用,它测量非抢占时间并报告到底是什么锁产生的。这只是关于长时间锁的一种解决办法。
JA:内核的那些部分会有你说的长时间的锁?
Robert Love:控制台层(console layer)曾经使用了一些很长时间的锁,不过幸运的是Andrew Mortan最近修改了很多。帧缓存(frame buffer)使中断无效了很长时间-避免向它打印很多东西。如果你卷动了很多次屏幕,你将发现需要等待最长500ms。切换虚拟终端很糟糕。blkdev_close()使用了一个长时间的锁。一些模块操作也很耗时。如果VM开始thrashing,将产生很长时间的等待,因为在保持一个锁期间,它做所有的事。VFS也有一些长时间的锁。
JA:你的这个包进入内核2.5有多大可能性?会有写什么困难?
Robert Love:这将取决于Linus对这个包的评价,其他内核编程者的意见。Linus曾经说过他这个主意很感兴趣,我希望这有所帮助。我们有一个很大的用户数据库,那也将有所帮助。我们得到了很多反馈包括展现其提高性能的基准测试结果。关于可抢占内核的争论是因为它降低了系统吞吐量(system throughput)。这是很正确的观点。也是需要我们关注的观点。现在的测试表明会损失0-5%的吞吐量-我想对于200%的响应速度的增加还是很值得!而且,有时候还会增加吞吐量。不管如何,对于那些任何吞吐量的损失都不能接受的系统,可抢占性内核只是一个配置参数而已。
JA:开发时你使用的主要工具?请描述一下你的环境,计算机和使用的方法。
Robert Love:我主要的机器是P3-733,384M内存,U2W SCSI硬盘。我也有一个IBM的ThinkPad和我公寓里各种各样的老机器。我运行最新的RedHat Rawhide和Ximian GNOME。
我使用vi编码因为我不想学习其他OS :-)我一般在X里,所以我通常使用gnome=terminal和gvim窗口打开我的project。我倾向于先广泛的看看,如果需要做做研究,然后开始编码。很少在纸上作设计。我经常依靠lkml和email-我喜欢其他人跳跃性的想法。
JA:你使用其他的操作系统吗?和Linux相比,你喜欢还是不喜欢它们?
Robert Love:我有一个Windows2000的工作站,和一台运行Irix的老式SGI Indy。除此之外,任何事情都是Linus。我使用Windows是为了Powerpoint,以防AbiWord不能剪贴它。我最不喜欢其他操作系统的原因就是它们不是open source的。我不是一个free software的狂热者-虽然我赞成它们的优点,我认为源码开放和围绕它的社区是无价的。
JA:你曾经使用open source的BSD操作系统吗?特别是,你曾经关注过它的内核吗?
Robert Love:我曾经有一台OpenBSD的机器,但是我把它丢到垃圾箱了。(虽然不是因为OpenBSD)其他的我所知道的就是学术性的了,我被Matt Dillon在FreeBSD的工作所打动(他写了VM)。他们的SMPng工作进展的很不错(在SMP扩展性方面,他们落后于Linux)并且他们甚至在考虑实现一个可抢占内核。
JA:你知道他们倾向于使用何种抢占性吗?可能像你的升级包,或者像Andrew的升级包,或者是个结合体?
Robert Love:他们考虑一个完全抢占性内核,就象我的包一样。我不知道对此他们会做了什么,也许在FreeBSD Core开发组已经被讨论过了。
JA:你对当前2.4内核系列有什么看法?你认为它很稳定吗?
Robert Love:我想我们比2.2有很大的提高。在2.3和2.4中完成的工作太棒了。我们做的一些提高,特别是Linus和Ingo作的一些工作真的是棒极了。2.4现在可以完成一些高性能/高扩展性的工作了。这并不是说在这点上我对2.4完全满意,我认为拆分Rik的VM是个错误。如果Linus想在2.5中尝试不同的东西,他都可以。在稳定的系列中,我认为我们需要
更少的改变。我们不能就这么丢掉了花在VM上一年多的工作,还有所有的对应文档和理念。但是看来VM被裁减的很好。我使用Alan的内核,这个内核还坚持Rik的VM,而且我们正在为提高它而努力。谁知道当2.4的内核被传递到Alan手上以后,我们会有什么样的内核。
JA:如果你遇到突然改变内核,你会如何处理?
Robert Love:首先,也许内核会变成不知道什么鬼样子,不管我如何抱怨或者其他人如何反对Linus,他不单单是一个不可思议的高手(hacker)而是一个很棒的管理者,Linux需要他。
对于VM的问题,我将跟随Alan领导的2.4内核。测试和文档化Rik的VM。我想我们需要更好的测试。太多Rik的主意和包都被忽略了。其他包被合并而不复存在了。我们需要一点一点的进行合并VM的工作,同时需要没有冲突的包,测试和结果。我们现在在Alan的代码树中需要这些。对于2.5,当然了,任何事都在发展。丢弃任何可以丢掉的。我认为Andrea的VM性能很好,可能它更好。It is just a bad time to find out, IMHO。
JA:对于2.5内核,你最希望看到什么?从这里你打算何时开始?
Robert Love:当然是一个可抢占的内核 :-)除了那个,我将继续探索更好粒度的锁(finer-grained locking)和整体清除(overall cleanup)。我想块设备,SCSI层和控制台层需要重写。我们关注NAPI and/or 某种形式的中断扼杀(IRQ throtting)。Ben LaHaise的异步I/O工作合并。Keith的新的kbuild看上去不错。我期待这所有这些。我真的认为我们需要重写tty系统,但是我不知道谁会做这个-我肯定不会做的。我想没有人,包括Linus对于2.5开始有一个明确的线索。我最初认为是2.4.0发布(2001/01/04)几个月后-可能是3月,或5月,可是现在还这样,一年又过去了,我猜不到。我怀疑等VM被证明是稳定的并且Alan和Linus可以完全同步的时候,我们将看到2.5.0。我希望这很快发生
JA:你遇到到Linus吗?或者其他内核开发者?
Rebort Love:我没有遇到过任何“著名”的高手。我希望遇到他们,也许某天,在一个会议或是宠物公园吧。
JA:对于希望称为内核高手的人你有什么窍门和灵感?
Rebort Love:读代码,“玩”代码(译者:其实文中多次提到“玩(play with)”词),并且要经常洗澡。对于初学者,O'Reilly有几本很棒的书(“Understanding the Linux Kernel”-Bovet and Cesati,和“Linux Device Driver 2ed“-Rubinend Corbet非常棒)。但是打开内核的钥匙还是读代码。你有整个系统的代码-读它,修改它,学习它。我一年前加入了lkml,但是直到2.3我才第一次真的做出了贡献。在lkml旁观(Lurking on lkml)是观看高手出招的最好办法,你能学到很多。
JA:谢谢你有时间回答所有的问题,由于这次谈话,我一定要下载你的包并升级我的系统
Rebort Love:太好了!请让我知道它工作的如何并且也同时感谢MontaVista的伙计们(可抢占内核最初的开发者)。
后记:与Robert谈完后,我下载了他的包并测试了一下(2.4.10-ac12)。wow! 提高很明显!VMWare和Mozilla这样的程序在加载和退出时我的系统要冻住一段时间的,应用了Robert的包后,我能够同时加载他们两个,而我的系统还可以响应。我注意到当大型程序装载时xmms不再“skips"了。从现在起,我将使用它了,我希望它能更快的融入2.5内核