2012-12-17 1 views
0

갑자기 응용 프로그램에서 서버의 CPU와 메모리를 망치고 있습니다. 이 "pegging"이 시작된 이후 코드를 변경하지 않았습니다. strace로 파고 들어 어떤 일을했는지 ​​알아 내려고했지만 출력이 실제로 의미하는 것을 해독하는 데 도움이 필요합니다. 나는 100 % CPU 사용량으로 몇 분 동안 실행 중이던 약 1GB의 메모리를 사용하여 1.5GB의 메모리를 사용하고 strace -c를 실행했다. 나는 다음과 같은 결과를 얻었다. 나는 clone과 wait4 명령에 오랜 시간을 할애하고 있습니다. 아무도 내게이 정보로 이동하는 방향을 줄 수 있습니까?cpu pegged, memory pegged, strace output

% 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와 메모리를 필요로하는 프로세스의 strace를 수행하면 해당 디렉토리에서 brk이 계속 읽 힙니다. 아래 strace에서 exceprt입니다.

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와 메모리를 필요로하는 프로세스의 strace를 수행하면 해당 디렉토리에서 brk이 계속 읽 힙니다. 아래 strace에서 exceprt입니다. – Josh

답변

0

글쎄, 상단부터 살펴 보도록하겠습니다. 클론과 wait4가 많다는 것은이 애플리케이션이 훨씬 더 많은 작업을 수행해야한다는 것을 의미합니다.

디렉토리 크기는 이미지 파일에서 동적으로 할당 된 메모리로 읽는 경우 더 많은 메모리를 얻기 위해 brk을 호출해야합니다. 간단합니다.

나에게 묻는다면 몇 가지 포크 또는 스레딩을 꺼내십시오.

+0

좋아, 나는 클론을 얻었고 모양을 알아 냈다. strace의 아래쪽 부분에 관해서는 위에서 썼다. 그것은 쓰기가 SQL select이고 읽기가 그것의 출력 인 것 같습니다. strace의 전체 출력에서 ​​수백 줄의 읽기와 수백 줄의 brk (0xff2cc ..)를 볼 수 있습니다. 또한, 읽기 선은 그들이 많은 시간을 얻는 것보다 더 많은 것을 읽을 것으로 예상하는 것처럼 보입니다. 예를 들어. 16384) = 11488 16384 바이트를 찾고있는 것처럼 보입니다. (16184, "\ 1 \ 0 \ 0 \ 1 \ 0244 \ 0 \ 0 \ 2 \ 3def \ 4live \ 4File \ 4File \ tCla" 및보고 11488. 16k * 500 읽습니다 .8mb – Josh