如何分析Linux版本升级后的资源开销增加原因?
起因一个运行十余年的Linux平台应用,最近要从原来的RHEL 5.4(2.6.18)升级到RHEL6.4(2.6.32),以便适应超过32核CPU。在重新编译运行后发现,应用CPU开销从原来的150%增加到500%。通常来说,Linux内核版本升级不会降低原有程序的性能,甚至应该所提升才对。以下是对资源消耗增加其原因进行分析的过程。 一般同一源代码的应用在不同Linux操
起因一个运行十余年的Linux平台应用,最近要从原来的RHEL 5.4(2.6.18)升级到RHEL6.4(2.6.32),以便适应超过32核CPU。在重新编译运行后发现,应用CPU开销从原来的150%增加到500%。通常来说,Linux内核版本升级不会降低原有程序的性能,甚至应该所提升才对。以下是对资源消耗增加其原因进行分析的过程。
一般同一源代码的应用在不同Linux操作系统版本上性能不一致的原因,可以从以下几个方面排查:
1、 编译器差异性 是否由于不同平台编译器版本或默认编译选项不同,导致编译出不同执行效率的二进制代码。验证的方法也很简单,由于Linux操作系统对可执行程序可以向前兼容,将低版本操作系统(RHEL 5.4)上编译出的程序放到新版本操作系统运行即可。如果无法运行,只能将两边的编译链同步到一个版本上了。
2、 CPU降频操作系统可能支持这一特性,导致使用TOP命令统计出来的CPU占用率不准确,具体的解决方法可以参照http://www.servernoobs.com/avoiding-cpu-speed-scaling-in-modern-linux-distributions-running-cpu-at-full-speed-tips/
3、 依赖库的差异性 可以用ldd命令查看应用依赖那些库,逐个进行同步。
4、 调度算法 从2.6.23版本开始Linux抛弃了时间片,采用CFS算法。个人认为这个算法会改变程序原有的吞吐率,应该不会影响CPU的开销。具体的介绍参见http://blog.chinaunix.net/uid-24452782-id-3221481.html
http://unix.stackexchange.com/questions/37391/high-cpu-usage-with-cfs
5、 系统调用的差异性由于内核升级,一些系统调用的实现改变了,由此可能造成资源消耗的增加。正因为分析这种差异性非常复杂,所以把它写在了最后。通常我们可以在保证相同输入的前提下,采用strace和oprofile工具分析、比较两个操作系统上的各种调用。或者在gdb模式下,采用随机ctrl+c大法,通过info thread发现中断位置较多的函数。但我目前还没找到成体系的排查方法,很多情况下还是要靠运气和经验。常见的比如线程同步锁的机制(在某些操作系统下读写锁退化为互斥锁)、文件IO机制(http://blog.chinaunix.net/uid-20448327-id-3833365.html)、sleep函数(http://blog.csdn.net/littlefang/article/details/44680975)等。
来自 littlefang-镇关西拳打鲁智深 的CSDN博客,转载请注明
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)