一. 性能优化概述
•一般来说,程序性能不佳,有可能是如下三个原因:
–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排序
–用指针代替数组
–用移位运算代替乘除运算
•分析数据结构内存对齐,字符以及二进制的格式选用。