2012-12-17 34 views
0

我一直在努力的一个应用程序突然袭击了服务器的cpu和内存。自从“挂钩”开始以来,我没有任何代码更改。我做了一些深入的研究,试图弄清楚发生了什么,但是我需要帮助来破译输出的真正含义。我用一个运行几分钟的pid,CPU使用率为100%,使用大约1.5GB的内存,并运行strace -c。我得到了以下输出。我在克隆和wait4命令中花费很长时间。任何人都可以给我一个方向移动这个信息?cpu pegged,内存挂起,strace输出

% time  seconds usecs/call  calls errors syscall 
------ ----------- ----------- --------- --------- ---------------- 
54.10 1.011982  252996   4   clone 
30.67 0.573741   51  11296   brk 
11.98 0.224099  56025   4   wait4 
    1.96 0.036701   53  687   munmap 
    0.68 0.012642  1580   8   mremap 
    0.58 0.010928   2  4886   5 read 
    0.01 0.000135   0  2854   fstat 
    0.01 0.000112   0  845  25 open 
    0.00 0.000073   0  935  115 lstat 
    0.00 0.000044   0  97  23 access 
    0.00 0.000043   0  464  40 stat 
    0.00 0.000037   0  466   write 
    0.00 0.000037   0  466   gettimeofday 
    0.00 0.000035   0  840   close 
    0.00 0.000000   0  173   poll 
    0.00 0.000000   0  210   lseek 
    0.00 0.000000   0  688   mmap 
    0.00 0.000000   0   5   rt_sigaction 
    0.00 0.000000   0   5   rt_sigprocmask 
    0.00 0.000000   0  16   writev 
    0.00 0.000000   0  55   setitimer 
    0.00 0.000000   0   2   socket 
    0.00 0.000000   0   2   2 connect 
    0.00 0.000000   0   4   accept 
    0.00 0.000000   0   6   shutdown 
    0.00 0.000000   0   4   getsockname 
    0.00 0.000000   0  10   setsockopt 
    0.00 0.000000   0   2   getsockopt 
    0.00 0.000000   0   8   semop 
    0.00 0.000000   0  38   fcntl 
    0.00 0.000000   0  168   flock 
    0.00 0.000000   0  12   getdents 
    0.00 0.000000   0  25   getcwd 
    0.00 0.000000   0  10   chdir 
    0.00 0.000000   0   2   unlink 
    0.00 0.000000   0   2   chmod 
    0.00 0.000000   0  15   umask 
    0.00 0.000000   0   7   times 
    0.00 0.000000   0   2   1 futex 
    0.00 0.000000   0   4   epoll_wait 
    0.00 0.000000   0   6   openat 
    0.00 0.000000   0   4   pipe2 
------ ----------- ----------- --------- --------- ---------------- 
100.00 1.870609     25337  211 total 

NEW ---附加信息

我有这方面的一些详细信息。我的应用程序的用户上传图像。图像上传到的目录现在有80k加上已经上传的图像文件。当我做了一大堆占用cpu和内存的进程时,我在那个目录下面读了很多内容,接着是brk。下面是strace的一个例子。

poll([{fd=18, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout) 
write(18, "e\2\0\0\3SELECT \"File\".\"ClassName\", "..., 617) = 617 
read(18, "\1\0\0\1\0244\0\0\2\3def\4live\4File\4File\tCla"..., 16384) = 11488 
read(18, "\0010\0010\00266\10MMSImage\343\0\0D\10MMSImage\02320"..., 16384) = 13032 
read(18, "\373\0011\0010\0010\003122\10MMSImage\345\0\0|\10MMSImag"..., 16384) = 11584 
read(18, "257\373\0011\0010\0010\003179\10MMSImage\345\0\0\255\10MMSI"..., 16384) = 16384 
read(18, "nswer_Image/0_9373043939_1321407"..., 16384) = 16384 
read(18, "or question #1054.Eassets/UserCo"..., 16384) = 16384 

那么晚了一点一吨BRK的

brk(0x7f2ba285e000)      = 0x7f2ba285e000 
brk(0x7f2ba291e000)      = 0x7f2ba291e000 
brk(0x7f2ba295e000)      = 0x7f2ba295e000 
brk(0x7f2ba299e000)      = 0x7f2ba299e000 
brk(0x7f2ba29de000)      = 0x7f2ba29de000 
brk(0x7f2ba2a1f000)      = 0x7f2ba2a1f000 
brk(0x7f2ba2a5f000)      = 0x7f2ba2a5f000 
brk(0x7f2ba2a9f000)      = 0x7f2ba2a9f000 
brk(0x7f2ba2adf000)      = 0x7f2ba2adf000 
brk(0x7f2ba2b1f000)      = 0x7f2ba2b1f000 
brk(0x7f2ba2b5f000)      = 0x7f2ba2b5f000 
brk(0x7f2ba2b9f000)      = 0x7f2ba2b9f000 
brk(0x7f2ba2bdf000)      = 0x7f2ba2bdf000 
brk(0x7f2ba2c1f000)      = 0x7f2ba2c1f000 
brk(0x7f2ba2c5f000)      = 0x7f2ba2c5f000 
brk(0x7f2ba2c9f000) 

任何人知道什么可以在那里走了。目录中是否有太多文件或类似的东西?硬盘是否必须过多地寻找目录?

+0

我对此有更多信息。我的应用程序的用户上传图像。图像上传到的目录现在有80k加上已经上传的图像文件。当我做了一大堆占用cpu和内存的进程时,我在那个目录下面读了很多内容,接着是brk。下面是strace的一个例子。 – Josh

回答

0

那么,让我们从头开始。大量的克隆和wait4意味着这个应用程序执行更多的分支或线程操作,那么它应该做的事情。

至于目录大小,如果您正在从映像文件读取到动态分配的内存中,则必须调用brk以获取更多内存。那很简单。

只要拿出一些叉子或线程,如果你问我。

+0

好吧,我得到了克隆和形式的东西。至于上面输入的strace的下半部分(写入然后读取)。它看起来像写是一个SQL选择和读取是它的输出。在strace的完整输出中,您可以看到数百行读取数据,然后数百行brk(0xff2cc ..)。另外,读取的行看起来像是期望读取的内容比获取大量时间更多。例如。阅读(18,“\ 1 \ 0 \ 0 \ 1 \ 0244 \ 0 \ 0 \ 2 \ 3def \ 4live \ 4File \ 4File \ tCla”...,16384)= 11488 看起来像是在寻找16384字节并看到11488. 16k * 500读取.8mb – Josh