此次IBM实习,我所在IBM团队负责研究的是一个名为THOR的程序性能分析工具与课题。该课题面向多核平台的JAVA多线程程序,旨在帮助开发人员发现和分析程序的主要耗时瓶颈所在。该课题始于2006年,历经了3年多的时间,已经形成了一套比较完备的系统。
在并行程序性能分析领域,存在很多的性能分析工具,比如Intel的Parallel Visual Studio, IBM的TPROF, 微软的WPF等,这些工具主要针对C/C++语言程序,而THOR系统则主要针对JAVA多线程程序,相比这些工具在数据采集方面要彻底全面些。该课题的提出,一方面由于多核的出现和快速发展,多线程编程将越来越普及,另一方面,JAVA作为一门跨平台的语言,IBM的很多软件产品都是基于JAVA实现的,开发一套面向多核平台的JAVA的多线程程序工具,帮助软件开发人员发现JAVA程序运行过程中存在的瓶颈,显得十分必要和重要。在该课题的进行当中,得到了来自IBM其他产品部门,如WAS的大力支持和赞助,最终该研究成果将运用到IBM的现有产品当中。
THOR系统主要由数据采集和可视化分析软件两部分组成。数据采集部分细分四个层次,分别为:JAVA应用层、JVM层、OS操作系统层和CPU层。其中JAVA应用层主要采集有关JAVA应用程序线程相关信息,如线程的迁移以及线程的状态;JVM层主要采集与虚拟机有关的垃圾回收器(GC)和JIT线程信息,主要支持IBM和SUN两种虚拟机;OS操作系统层负责采集native线程的一些信息,支持Linux和AIX两种操作系统;CPU层通过事件触发机制读取一些与性能有关的寄存器信息,支持IBM POWER和INTEL型的CPU。除了支持本地单机数据采集,THOR还提供了专门的远程分布式数据采集的方法和工具。可视化分析软件为Eclipse插件,对采集出来的二进制数据文件进行整理和可视化显示,用户通过该软件的图形可视化显示可以形象的感受到有关线程迁移、线程转移、CPU利用率等信息。
THOR系统属于计算机领域一个门槛非常高的课题,涉及到的底层知识很多,主要包括虚拟机、操作系统及内核、CPU及其指令集等知识。对于每一个底层知识,都得花上很长一段时间才能真正有所认知和了解,而这些知识在学校是很难有机会是接触的。所以,对于我来说,在刚进入实习阶段,就感觉到特别的吃力,基本上什么都不知道。虽然该课题是与多线程有关的,但从THOR程序的源码实现角度看,涉及到并行相关的东西其实不是很多,而主要是集中在那些很底层软硬件等平台的认识和了解方面,我基本上感觉不到自己在从事该课题时存在的优势。在实习很长的一段时间内,我对Mentor们所做的东西脑子里基本是一片混乱,好多时候对Mentor所交待的活不明白其目的和意义所在,对于THOR源程序,由于涉及到的细节技术和标准等知识太多,阅读和理解起来格外的吃力。回想自己之前写过的一些程序,基本上处于一种杂乱状态,好多时候在写程序的时候,单纯的只是为了实现功能、解决一个问题而编写程序,毫无任何规范和技巧可言,因而写出来的程序基本上不可维护和扩展,无法达到复用的要求。看着Mentor们写的程序,那简直是一门艺术,特别地规范和具有技巧性,通过反复阅读他们的代码,能够学到很多东西,对提高自身编程能力特别有帮助。对于该课题,他们创造出来了很多新的名词,这也严重影响了我对于整个系统的了解和认知,好多新创概念让我经常与一些已有的技术专业词汇混淆一团。
在整个实习期间,我主要进行了一些实验测试、脚本编写相关的工作。在学校,由于从来没有过在linux环境下拿C语言编写真正的系统程序,在大规模程序编写方面缺乏经验和一些基本功,研究THOR程序的过程中显得格外的吃力。前期,Mentor给我的任务主要是负责进行一些实验性的工作。虽然实验很多时候让人有点程序测试的直观感觉,但作为科研实验,还是有些不同的。因为实验一方面试图验证程序是否存在一些bug,更重要的在于当程序正确的情况下,如何正确采集和获得一些想要的数据,然后对其进行分析。这次实验,让我大开了眼界,从中感悟和学到了很多有价值的东西。要做试验,首先得能够将程序运行起来,而要让THOR程序正确运行起来,需要做一些基本的环境变量的设置以及参数的配置工作,过程有点复杂,但作为一个可扩展的系统,形成这些设置是必要的。通过Mentor的一点一滴的指导和讲解,以及自己的反复尝试运行,让我对于他们程序编写的精妙渐入理解和认知,当时正值自己也在进行着学校课题EasyPDP的实验,通过比较,发现自己在科学试验方面极度缺乏经验,在实验方式方法上把握不好,“体力劳动”尤为明显。Benchmark的发现,也是让我大开眼界和值得学习的地方。为了验证程序和获取一些性能数据,使用公认开源的benchmark标程来测试运行,显得更加具有说服力和对比性,这是一种新的方式方法,让我豁然间对于科研仿佛有了新的感知。Linux脚本的强大,让我深切感知,在实验过程中的很多琐碎的细节操作,如环境变量的设置,参数的初始化等,可以以脚本的方式将其封装起来,是一种“体力劳动”到“脑力劳动”的体现,而这,其实也是需要经验的,其中带有很强的技巧和艺术魅力,可以通过自身反复尝试总结和借鉴他人成果获取。实验结果的整理与管理,也是一项非常重要且需要经验的活儿。根据需要,写一些小的脚本处理程序来负责整理数据是甚为必要的,能大大简化你的不必要的体力劳动。随着实验数据量的增加,以及不同数据版本的出现,如何分类管理好这些数据也不是一件容易的事,管理不好必将造成一团糟,而这需要的是一些合理的实验计划和管理经验。对于实验数据的分析,是一项很富有挑战性的工作。一方面,要求你必须具备一个很好的专业背景知识,比如对于benchmark的理解,相关底层知识的掌握。数据分析的过程其实也是对数据现象的解释过程,能够面对不同的应用数据结果,从应用自身特征以及其他相关知识方面,给予一个合理的科学解释,甚至能够发现一些规律和结论;另一方面,要求你必须基本一个很好的数据分析能力,针对种数据,能够以图形表格等更为直观的方式将其展现出来,在数据之间,发现彼此的关联,进行数学模型。要做好这两点,不是一朝一夕的事情,需要在反复磨练中不断地总结积累。实习中期,我参与了THOR程序部分代码段的编写和调试工作。THOR整个程序特别的底层,在技术路线方面,每一部分都严格的遵循着一套标准,要读懂和修改这些程序,则需要对这些标准有充分地了解。在我负责的虚拟机相关部分,之前我一直认为能够定位到源代码的某一个函数甚至某一行,属于编译器的事,需要对编译器有足够的了解,通过研究标准,发现其实没必要对于与编译器有过多地了解,标准本身就提供了一些事件函数接口能达到这一点,让我一下子也大开了眼界,很多让我们看来一些不可思议的现象和结果,其程序实现也不是咱所想象的那么难,但需要你有相关的技术了解和积累。内核程序的调试,让我彻底产生了恐惧。Mentor给我交代了一个他们之前没有改好的内核程序,让我来负责调试。对于内核程序,主要涉及到一些中断和寄存器读取相关的操作,稍有不慎,很容易便造成整个机器的死机,调试起来相当的费事。在那段时间调试中,经常出现死机现象,特别是开始运行几次地好好的,然后突然中途某一次的就出现了异常。每次死机,都不得不到机房去手动重起服务器,后来我干脆直接下到机房去调试程序了。虽然我反复查看相关文档和对比其他程序,无论如何修改程序,这种死机现象一直存在,直到实习结束这个问题始终都没有解决。
在最近的一次和小Mentor的聊天中,得知THOR这个课题做得差不多,将要结束了,而他们目前要做的工作,就是协助开发人员将其植入到IBM的产品当中去。
>

