웹 서버의 메모리 누수

웹 서버의 메모리 누수

그래서 최근에 서버 성능 문제가 발생했습니다. 현재 우리는 4GB 및 160GB 디스크 공간을 갖춘 Fedora 서버를 실행하고 있습니다. 디스크의 모든 파일을 거의 모두 사용했습니다. 우리는 각각 여러 백업이 포함된 여러 웹사이트를 운영하고 있습니다. 하지만 실제로 트래픽이 발생하는 웹사이트는 단 하나뿐이었습니다. 방문자가 많은 전자상거래 사이트입니다.

최근 로딩 시간이 느려지고 사용 가능한 메모리가 매우 낮아졌습니다(1GB 미만). 서버를 다시 시작하면(이제 하루에 3번 다시 시작해야 합니다) 모든 것이 잘 될 것입니다. 처음에는 2.2GB의 메모리를 확보했지만 3~4시간 후에는 메모리가 고갈되고 로드 시간이 천천히 증가하는 것을 확인할 수 있습니다. 이것이 어디서 오는 것인지, 더 나은 서버로 업그레이드해야 하는지 모르겠습니다. 나는 단지 업그레이드하고 싶지 않으며 MySQL 요청의 어딘가에 병목 현상이 발생하고 있다는 것을 깨닫습니다.

어떤 아이디어나 제안이라도 대단히 감사하겠습니다.

편집하다-

3개의 가상 호스트를 사용하면 60,000개가 넘는 파일이 있습니다.

             total       used       free     shared    buffers     cached
Mem:          4003       3372        630          0        398       1717
-/+ buffers/cache:       1256       2746
Swap:         8189          0       8189

21:21:49 up 46 min,  1 user,  load average: 3.75, 4.20, 4.03

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  2      0 592728 409640 1838360    0    0   165   411  953  473  9  8 47 36  0

상위스샷입니다.

 1356 mysql     20   0 1374m 219m 5320 S  5.6  5.5  14:06.21 mysqld
15796 root      20   0  103m  20m  440 D  1.0  0.5   0:04.42 sendmail
 1081 root      20   0  103m  20m  440 D  0.7  0.5   0:21.73 sendmail
24013 root      20   0 97416  22m 2648 D  0.7  0.6   0:15.15 mailq
 1525 root      20   0  247m 7980 3472 S  0.3  0.2   0:06.88 vlogger (access
 1530 apache    20   0  539m  13m 3008 S  0.3  0.3   0:03.56 httpd
 2399 apache    20   0  539m  12m 2748 S  0.3  0.3   0:00.85 httpd
 5763 root      20   0  121m 4932 3868 S  0.3  0.1   0:00.07 sshd
12326 apache    20   0  539m  12m 2992 S  0.3  0.3   0:00.38 httpd
12421 apache    20   0  539m  12m 2988 S  0.3  0.3   0:00.45 httpd
16396 apache    20   0  538m  12m 2284 S  0.3  0.3   0:00.09 httpd
17050 root      20   0 15368 1256  868 R  0.3  0.0   0:00.09 top
    1 root      20   0 37336 4104 1908 S  0.0  0.1   0:02.82 systemd
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.03 ksoftirqd/0
    5 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/0:0H
    6 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kworker/u:0
    7 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/u:0H
    8 root      RT   0     0    0    0 S  0.0  0.0   0:00.11 migration/0
    9 root      RT   0     0    0    0 S  0.0  0.0   0:00.01 watchdog/0
   10 root      RT   0     0    0    0 S  0.0  0.0   0:00.14 migration/1
   12 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/1:0H
   13 root      20   0     0    0    0 S  0.0  0.0   0:00.02 ksoftirqd/1
   14 root      RT   0     0    0    0 S  0.0  0.0   0:00.01 watchdog/1
   15 root      RT   0     0    0    0 S  0.0  0.0   0:00.15 migration/2
   17 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/2:0H
   18 root      20   0     0    0    0 S  0.0  0.0   0:00.03 ksoftirqd/2
   19 root      RT   0     0    0    0 S  0.0  0.0   0:00.01 watchdog/2
   20 root      RT   0     0    0    0 S  0.0  0.0   0:00.11 migration/3
   22 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/3:0H
   23 root      20   0     0    0    0 S  0.0  0.0   0:00.02 ksoftirqd/3
   24 root      RT   0     0    0    0 S  0.0  0.0   0:00.01 watchdog/3
   25 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 cpuset
   26 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 khelper
   27 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kdevtmpfs
   28 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 netns
   29 root      20   0     0    0    0 S  0.0  0.0   0:00.00 xenwatch

답변1

1분마다 sar를 시작하고 ps 테이블을 출력합니다. 내 자세한 답변 보기여기.

다음에 서버가 충돌할 때를 sar -r추적하는 데 사용됩니다.언제그런 일이 일어난다. 이제 ps-cronjob 또는 내 출력을 사용하십시오.github의 ps용 Perl 래퍼, 어떤 프로세스가 원인일 수 있는지 알아보세요.

서버가 12:00:00에서 13:00:00 사이에 폭발했다고 가정합니다. 사용 sar -r -s 12:00:00 -e 13:00:00. 그러면 데이터가 급증하는 것을 볼 수 있습니다. (더 쉬운 경우 플로팅을 수행하는 Java 기반 유틸리티가 있지만 일반적으로 문제를 일으킬 가치는 없습니다.) 12시 15분에 최고점(또는 최저점)이 보인다고 가정해 보겠습니다. 이제 ps 열 출력에서 ​​시간 범위(예: 12:00~12:15)를 검색하고 pid, 시간 순으로 정렬한 다음 메모리 열을 살펴보세요.

awk '/^=== .* 12:00:/,/^=== .* 12:16:/' /var/log/sa/ps/today |
 sort -k 1n -k 16 

(정렬 옵션에서는 시간이 16열에 있다고 가정하지만 그럴 수도 있고 아닐 수도 있습니다.) 이제 awk를 통해 이 출력을 다시 필터링하여 출력 라인 간의 차이점을 찾을 수 있습니다.

... | awk 'lastpid && lastpid==$1 && last != $0 { print} /^[0-9]/ { lastpid=$1;last=$0; }'

꽤 조잡한 필터입니다. mysql, postgresql 및 snmpd와 같이 명령줄이 계속 변경되는 일부 프로세스의 경우 이는 별로 도움이 되지 않지만 awk를 조정하여 범인을 찾는 데 도움이 되기를 바랍니다.

관련 정보