2012-12-17 51 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