Hack实战之——Server源代码级性能诊断(一)
本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/12290147
作为一名geek型的技术人员,需要对Server程序、操作系统内核有一定的把握。
本文实战Hack一个坑爹的C程序,通过实战,教会大家如何诊断C代码的性能问题。
1 #include <stdio.h> 2 3 int deep_fuck(){ 4 int i = 0; 5 for (i = 0;i < 100;){ 6 i = i + 0; 7 } 8 return 0; 9 } 10 11 int main(){ 12 deep_fuck(); 13 return 0; 14 }这是一段很简单的代码,总共14行。明眼人一看,就知道这个函数是坑爹的。
[root@localhost c]# gcc -g fuck.c -o fuck[root@localhost c]#
我们来看一下个可执行文件跑起来之后是什么样子的。

常规的方法能看到是fuck这个可执行文件(进程)消耗了大量的CPU,但是,到底是这个进程里的哪段代码消耗了CPU呢?
如果你第一印象是哪个进程消耗了CPU了,说明你是个搞运维的。
如果你第一印象想到是哪一段代码(甚至是哪一行代码)消耗了大量的CPU,那么你就快成一名geek了。
那通过什么样的方法可以查看到是哪个函数消耗了CPU呢?
我们尝试一下方法。
首先我们通过oprofile采集一下当前操作系统内的CPU消耗总体情况。
[root@localhost c]# opcontrol --resetSignalling daemon... done[root@localhost c]# opcontrol --startProfiler running.[root@localhost c]# opcontrol --dump[root@localhost c]# opcontrol --stopStopping profiling.
然后我们看一下分析报告。
[root@localhost c]# opreport -l|head -n 20warning: /no-vmlinux could not be found.warning: [vdso] (tgid:1677 range:0xb7848000-0xb7849000) could not be found.warning: [vdso] (tgid:2284 range:0xb7746000-0xb7747000) could not be found.warning: [vdso] (tgid:2491 range:0xb78b7000-0xb78b8000) could not be found.warning: [vdso] (tgid:2493 range:0xb78b8000-0xb78b9000) could not be found.warning: [vdso] (tgid:2905 range:0xb774e000-0xb774f000) could not be found.CPU: CPU with timer interrupt, speed 0 MHz (estimated)Profiling through timer interruptsamples % image name app name symbol name42709 93.2307 fuck fuck deep_fuck2880 6.2868 no-vmlinux no-vmlinux /no-vmlinux20 0.0437 ld-2.5.so ld-2.5.so dl_main16 0.0349 bash bash /bin/bash9 0.0196 libc-2.5.so libc-2.5.so fork9 0.0196 libglib-2.0.so.0.1200.3 libglib-2.0.so.0.1200.3 /lib/libglib-2.0.so.0.1200.39 0.0196 libpcsclite.so.1.0.0 libpcsclite.so.1.0.0 /usr/lib/libpcsclite.so.1.0.06 0.0131 ld-2.5.so ld-2.5.so _dl_start5 0.0109 ld-2.5.so ld-2.5.so _dl_load_cache_lookup5 0.0109 libc-2.5.so libc-2.5.so _IO_iter_begin5 0.0109 libc-2.5.so libc-2.5.so _int_malloc4 0.0087 iscsid iscsid /sbin/iscsid4 0.0087 libc-2.5.so libc-2.5.so _int_free4 0.0087 libc-2.5.so libc-2.5.so mbrtowc4 0.0087 libc-2.5.so libc-2.5.so strcmp4 0.0087 libdbus-1.so.3.4.0 libdbus-1.so.3.4.0 /lib/libdbus-1.so.3.4.04 0.0087 libgobject-2.0.so.0.1200.3 libgobject-2.0.so.0.1200.3 /lib/libgobject-2.0.so.0.1200.3
看见了吗?
这里不再是fuck这个可执行文件了,而是deep_fuck这个函数了!比之前用top查看出来的结果精确了太多!从苦逼的运维到geek的差距。
当然了,这里我还没有精确到哪一行代码,这里就不细说了。
另外,oprofile这个工具是在CPU层面做监控的,相比于top、iostat、vmstat等工具,其精确度要高很多。