您的位置:首页 > 运维架构 > Linux

linux下程序性能优化

2013-06-02 22:22 253 查看
一. 性能优化概述

•一般来说,程序性能不佳,有可能是如下三个原因:
–A.程序运输量大,导致CPU过于繁忙,CPU是瓶颈
•解决办法就是在设备上运行TOP命令,如果某个进程的CPU利用率很高,则说明CPU是瓶颈。


–B. 程序需要做大量的IO,读写文件,内存操作等,CPU更多是出于等待,I/O部分是系统的瓶颈。
•1.可以通过命令# vmstat 查看当前系统虚拟内存以及缓存使用情况,从而判断应用程序是否占用了大量内存。
•2.也可以通过命令# iostat 详细的监控磁盘的IO状态。
–程序之间互相等待,结果CPU利用率很低,但程序运行速度依然很慢,那么程序之间的共享和死锁制约了程序的性能。如果系统CPU利用率不高,那么也不存在大量的IO操作,那么很可能是线程之间的相互等待造成的,这时需要对程序进行大概重构。

二. IO 优化

•分析应用输入源以及输出对象
–一般来说,CPU寄存器访问速度>L1,L2,L3缓存>内存访问>IO访问
–如果读写文件较大时,我们可以考虑用多线程去读写该文件,多线程可以大大降低文件的读写时间
•考虑IO对象的位置
•分析IO对象的初始化以及清理过程
•减少非必要的IO

三; 程序并发与负载均衡 

•分析应用线程之间的共享资源
•最小化资源的保持程序的并发和通讯

•多线程之间仅可能保持负载均衡
•在多核系统下由于LINUX内核调度器具有软亲和力(affinity)的特性,这意味这、着进程通常不会在处理器之间频繁的切换。在实际应用中,如果不存在数据竞争的影响,应用的不同部分分布到不同的CPU上,可以带来更高的收益。

四. 关键路径分析

•分析业务处理流程,检查关键路径的潜在瓶颈。
•分析关键路径上的函数调用,关注高耗时的函数以及异常调用频率。
•使用Oprofile实现应用性能监控。

•int main(int argc, char *argv[])
•{  int x,y;
•    for(i = 0; i < 200; i ++) {
•        for(j = 0; j <  30 ; j++) {
•              y= slow_multiply(i, j);        
    }

•    }
•}
•int slow_multiply(x, y)
•{
•    returnx * y;
•}
•[root@localhost test]# gcc multiply.c -g -o multiply
•[root@localhost test]# opcontrol --init
•[root@localhost test]# opcontrol --vmlinux=/usr/src/linux-2.6.37.2/vmlinux
•[root@localhost test]# opcontrol --reset
•[root@localhost test]# opcontrol --start
•root@localhost test]# opcontrol --stop
•Stopping profiling.
•[root@localhost test]# opcontrol --shutdown
•Killing daemon.
•[root@localhost test]# opcontrol --deinit
•Unloading oprofile module
•[root@localhost test]# opannotate --source ./multiply
•            
•  :{ /* slow_multiplytotal:     36 92.3077 */
•               :       int i, j, z;
•    2769.2308 :        for (i = 0, z = 0; i < x; i++)
•     820.5128:               z = z + y;
•     1 2.5641 :        return z; 
如上可知上述函数耗时较多。

五. 算法及数据结构优化 

•分析程序中耗时多的算法的复杂度,尽量降低程序的复杂度。
–如果程序中有个函数耗时呈指数级的增长,则要考虑改进算法
–Swith语句中根据发生的频率来进行case排序
–用指针代替数组
–用移位运算代替乘除运算
•分析数据结构内存对齐,字符以及二进制的格式选用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  性能优化