读书人

Hack实战之Server源代码级性能确诊

发布时间: 2013-10-08 17:12:09 作者: rapoo

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]# 


我们来看一下个可执行文件跑起来之后是什么样子的。

Hack实战之——Server源代码级性能确诊(一)

常规的方法能看到是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等工具,其精确度要高很多。





读书人网 >编程

热点推荐