如何分析Linux版本升级后的资源开销增加原因?

         起因一个运行十余年的Linux平台应用,最近要从原来的RHEL 5.4(2.6.18)升级到RHEL6.4(2.6.32),以便适应超过32CPU。在重新编译运行后发现,应用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/37225/isolating-cause-of-higher-cpu-usage-on-rhel-6-vs-rhel-5

http://unix.stackexchange.com/questions/37391/high-cpu-usage-with-cfs

 

5、  系统调用的差异性由于内核升级,一些系统调用的实现改变了,由此可能造成资源消耗的增加。正因为分析这种差异性非常复杂,所以把它写在了最后。通常我们可以在保证相同输入的前提下,采用straceoprofile工具分析、比较两个操作系统上的各种调用。或者在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博客,转载请注明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值