奔跑吧,Deepiner
不记得是哪位名人说过,当一个人开始频频回顾往日时光的时候,就表示这个人开始变老了。所以出于怕死充嫩的本能,我一直不愿回忆过去,以避免暴露出油腻中年危机程序员的本质。但在《deepin集结》编辑大人坚忍不拔、孜孜不倦地追稿下,拖延症晚期患者的我也不得不把自己的琐事从这几年的岁月中整理出来,以飨大家。
不过,其实我更想说的是关于我们这个团队的事,而不仅仅是我个人。因为只有在和团队一起合作的过程中,一个人才会发现自己的短板、无力、以及爬上树后暴露出来的红屁股,也才会明白和一个紧密合作、充满活力的团队在一起奋斗,能创造出多少最初谁都难以想象的奇迹,并且能够对自己的成长带来多大的帮助。
说实话,在最开始接触计算机的时候,我就是一个蒟蒻。在那个古老的年代,我们使用的还是传说中的Apple II,开机进去以后就是用Basic语言来编程。时到今日,我唯一记得的就是每行代码都必须有标号,还有PRINT、GOTO、RUN等指令。但我当时对程序究竟是怎么跑起来的特别迷惑,导致编起程序来简直是一头雾水。
我至今还记得最后的考试题目是要打印一个杨辉三角形,要不是当时dwd同学的热心帮助,说不定就会打破本人中学生涯中的零挂科记录了。这是我第一次在编程上体会到团队的好处。
至于首次接触Linux,那已经是在清华26号楼的时候了。
一次在走廊尽头的寝室里,某哥们正在噼里啪啦地敲键盘,屏幕上显示的不是熟悉的Windows窗口,而是一片黑乎乎的背景,上面绿色的字符在不停地刷屏。我好奇地看着这个当时还比较小众的系统,真的蛮有传说中黑客的感觉的。不过看上去用起来挺麻烦,都是手工输入命令,那我要是真用起来还不得要了老命了。
ATM迁移
工作以后,东奔西走,不知不觉又转回到Linux都已经是好些年以后的事情了。在公司刚开始商业化不久的2015年,正好迎来了ATM机转用Linux操作系统的机会。
在这里我先介绍下背景,平时我们存取款的ATM机,使用Windows操作系统的占了90%以上,而其中一大半仍在运行Windows XP。其实从技术层面上来说,Windows与Linux都可以完美支撑ATM业务,但在实践中,要更换操作系统首先需要通过实例给用户以信心。
在ATM机系统中,前端系统可以大致划分为SP与AP两部分,其中SP主要负责进行设备管理(如出钞机芯、存款机芯、密码键盘等);AP则负责提供前台的用户界面与控制。因为在可行性验证阶段无法改动现有的代码,因此在此期间,深度团队决定使用deepin-wine技术对AP进行迁移,但同时因为技术的限制,无法对设备驱动进行迁移,因此暂时只对部分设备,例如密码键盘(PIN)、读卡器(IDC)、打印机(PTR)等设备进行迁移。
整个迁移过程断断续续持续了约4个月的时间,我一直奔波在北京和杭州之间,其他负责开发的同事则是在武汉和杭州之间奔波,加班熬夜更是家常便饭。在这个期间,深度团队首先需要熟悉ATM系统现有结构与各部分的接口,其次需要适配完全没有接触过的外设,同时还要负责给前端界面使用到的IE各模块填坑,最后更要熟悉业务流程,以通过系统测试。
终于,在以ch同学为首的deepin团队的努力下,各设备都在深度操作系统上正常运行了起来,与此同时,读卡、查询等业务流程也都一一通过了测试验收。
我们的团队用短短几个月的时间,实实在在地证明了ATM机上操作系统迁移的初步可行性。
接下来我们需要和更多的干系方讨论,这将不再仅仅是技术的问题了,还需要对ATM行业现有的XFS标准进行相应的改造,在尽量保持兼容性的同时,我们需要将XFS标准与Windows解绑,这将涉及到多个厂商共计上万台ATM机的迁移改造规划。将近十个公司的人整整开会讨论了一周,终于得到了一个初步的标准草案和技术框架,涉及到API、SPI、以及多个设备标准的改写。
其中深度团队负责API/SPI接口规范的修改,并承担开发对应的管理器系统,需要对下接口SP,对上承接AP。在其后的一个半月内我们发布了第一版,并在随后的两个月内使用增量迭代的方式快速开发,发布了八个版本更新,稳定了上下接口、功能与性能,修复了多个软件缺陷,并提供了多个演示程序与开发指导文档,给其他厂商后续的开发迁移打下了坚实的基础。要是没有Iceleaf和其它同事加上的数千行QML代码,还有不断骚扰sonald学来的Qt开发知识,我一个人肯定累趴下了也搞不定的。
当然,后期的系统定制、内核panic问题的修复、涉及多个厂商的开发培训等工作的工作量更大。记得有一个问题是某个设备驱动会导致偶发的系统死机,但是驱动厂商又不愿意提供源码,ch硬是把驱动强行反汇编出来,再将汇编代码手工转译最终查出的bug,并给出了相应的解决方案。其他问题还有例如SP/AP不当耦合导致系统挂起、dbus-daemon内存溢出、I卡驱动导致屏幕撕裂等,zx带领的深度开发和支持团队真可说是逢山开路,遇水搭桥,搞定了所有技术问题,这才终于修成了正果。
云打印
说到系统迁移,那真的是一个大坑。我们在建设生态上首先基于包最多的Debian来做,让大家可用的软件基数更大,其次自己也在不停地造轮子,开发了DDE等一系列软件,此外还主动联系搜狗、网易等大厂,向他们要授权,由我们来把对应的Windows软件重新开发,做出Linux版给大家做贡献,再就是把Windows、Android、H5等应用迁移过来了。但在Linux下有一个众所周知的问题,那就是外设驱动比Windows少太多,不说被Linus大爷树中指的N卡,就说打印机等办公设备,其实驱动也少很多。
在某个月黑风高的夜晚,deepin同学突然有了个通过网络来解决打印机问题的想法,然后andrew、zml、synh、wmd、我、叶子等同学开始盖楼灌水,分析cups、ppd、postscript、samba等一系列技术,果然是互相激发容易有想法,于是我一边陪着小朋友上奥数课,一边写原型,一晚上就用shell+golang做了一个特别粗糙的可用版本,成为了后来深度云打印的雏形,iceyer小组则在短短两三个月之内就做出了云打印产品,不仅功能丰满了许多,还顺手修了好多bug,着实厉害,当然zx和ch团队后来推出的普适打印栈技术,那就更强了。
可以完全脱离网络支持原生打印,已经大大超出了我们最初最好的设想。
驱动优化
当然,做操作系统也免不了和内核、处理器打交道。其中,龙芯是国产领域的主要处理器之一。在去年的某个项目里刚好接触到了龙芯3a1000,该系统有个关键的指标就是数据处理的吞吐量。
在之前的系统上,数据处理的吞吐量是每秒500Mbps,由于刚开始无法接触到驱动程序源码,只能根据系统表现与测试程序的代码对可能产生影响的系统参数进行调整,包括编译参数例如:CONFIG_HZ、CONFIG_NO_HZ、CONFIG_IRQ_TIME_ACCOUNTING,运行参数例如sched.下的各参数,测试程序使用的内核函数如msleep、schedule、usleep_range等,而内核代码更是从2.6.32一直追踪到3.10……
看材料、读代码、插桩、测试,中间haitao负责构建系统和集成各方补丁,我则负责写片段代码,两个人一起跑客户、调设备和熬夜加班,终于在一个多月后,把问题定位到了。原来,设备驱动程序在从外设到内部数据处理之间的数据转换环节使用了一个低效的C语言实现,但实际上在内核中有更高效的指令集实现,仅需要修改一行代码,就能把系统吞吐性能从500Mbps提高到了740Mbps,当我们告诉设备厂商和用户问题原因和解决方案的时候,大家真感觉神了,原来只需要这么小的改动就能提高50%的性能。当时我的心里确实是挺高兴的,不仅是因为解决了一个悬疑已久的技术问题,还因为真的是帮到了所有人,而不是技术自嗨。
文件快搜
在写程序方面,我应该算是一个oldschool,如果硬要在程序漂亮的界面和更高的运行性能之间做一个选择的话,十有八九我会选择后者。这导致在深度内部曾经流传过一个段子,说是我喜欢用Windows记事本编程,天地良心,那玩意儿连语法高亮都没有,也忒挫了吧,我最多也就是用vim或者nodepad++来写程序而已……
去年刚好在某项目期间有个空隙,终于有时间可以琢磨下怎么提高Linux下文件名搜索的速度了,由于之前就了解过Windows下类似的软件everything和Linux下的rlocate,又抽时间写了几个kprobes的demo程序热身,我就这样开始写anything了。
由于几年前就搞过搜索引擎,所以一上手就直接用上了一个简单的切词,然后是基于哈希链表的倒排索引,加上用kprobes勾住了VFS的相关内核函数监听文件系统的变更,再设计一个线性树保存文件树,经过hualet和synh对代码与文档的测试与review,三周内我就出了一个anything的原型。
在cli界面下测试,和find比起来,简直跑得飞快,两者的时间比大概是10s : 0.1ms,相差4~5个数量级。接下来我又在deepin同学的催命下,把倒排索引改成了直接基于线性树的搜索,仍然能保持3个数量级的性能优势,匆忙结束了原型开发后,我转过头来又要继续接着赶项目。
当然,这个原型确实也挺粗糙的,zccrs和肥猫修复了包括内核版本兼容、缓存区越界、缓存区动态扩展导致地址错误等好几个bug,anything才达到了产品质量,能真正融合进文件管理器中,也终于在今年和大家见面了。
其实我自己心里不免有点小得意,不过反过头来看,还是有蛮多东西要继续完善的,比如要把kprobes改成ftrace减少对于内核不可睡眠的要求,把内核模块改成eBPF减少对内核的依赖,或者把索引全落盘提高软件的伸缩性……就像千年前的湖北人屈原说的,路漫漫其修远兮,吾将上下而求索。
软件的优化与重构是永不停歇,永远可以做的更好的。
尾声
有一位伟人曾说,你的知识边界就像一个圆,随着知识的增长,你接触到未知疆域的边界也在不断增长,从而使得你谨记保持谦逊。其实何止知识如此,在深度,接触到了这么多高手,sonald、synh、ch、肥猫、hualet、iceyer、zccrs、zx……
平时低调的他们让你感觉不出什么来,只有遇到问题一筹莫展,并在他们的帮助和激励下解决了问题的时候才会恍然大悟,果然是“低调为王”、“高手在身边”,要不然,是善战者无赫赫之功?
很庆幸能和这些战友为伍,一个人单独可以跑得很快,多个人一起则可以跑得更远。那么,就让我们一起奔跑吧,deepiner。
【相关链接】