Apache 2.2는 결국 모든 메모리를 사용합니다(작업자 mpm).

Apache 2.2는 결국 모든 메모리를 사용합니다(작업자 mpm).

저는 Apache 2.2 서버를 조정하고 있습니다(MySQL + Courier + Mongo + Postgre와 공유됨). 서버는 쿼드 코어 Xeon 2개(총 16개 코어)와 12GB ECC RAM(향후 24GB로 업그레이드)을 갖춘 베어 메탈(가상화 없음)입니다. MySql은 innodb_buffer를 2G로 설정했으며 정상적으로 작동합니다. Mongo와 Postgre는 개발을 위해 거의 손대지 않았습니다.

문제는 Apache가 사용 가능한 모든 메모리를 소모하고 결국 모든 스왑을 사용한다는 것입니다(따라서 더 많은 메모리를 사용하므로 MySql이 충돌함). 작업자 MPM 및 mod_security가 포함된 Apache 2.2가 있습니다. 다시 시작할 때마다 약 8G의 여유 RAM이 확보됩니다.

나는 몇 가지를 이해하려고 노력하고 있습니다.

  • top작업자 서버에 표시된 프로세스 간의 관계는 무엇입니까 ? 나는 최대 10개의 프로세스를 볼 것으로 예상했습니다(작업자 설정의 ServerLimit - 기본 프로세스를 고려하지 않음).
  • 각 THREAD 또는 각 PROCESS에 사용되는 RES 메모리 양이 있습니까?
  • 아래 mod_status 출력에는 오랜 시간 동안 유지되는 READING 요청이 많이 있습니다. ExtendedStatus를 활성화하여 어떤 클라이언트가 있는지 검색해 보았으나 유용한 정보를 찾을 수 없습니다. 제안 사항이 있습니까?
  • 실제 메모리 사용량을 기준으로 400개의 동시 연결을 처리하려면 어느 정도의 RAM이 필요합니까? (모드 상태에 이미 250이 고갈된 것으로 표시됨)
  • MaxClients/ServerLimit을 높이는 대신 ThreadsPerChild를 높이는 것은 어떻습니까?
<IfModule 작업자.c>
시작서버 2
최대 클라이언트 250
최소 예비 스레드 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
서버한도 10
</If모듈>

TOP 쇼(아파치에만 해당):

상단 - 16:30:21 최대 46일, 23:12, 사용자 2명, 로드 평균: 0.94, 0.97, 1.31
작업: 총 460개, 실행 중 1개, 수면 459개, 정지 0개, 좀비 0개
CPU: 2.8%us, 0.5%sy, 0.0%ni, 96.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
메모리: 총 12187448k, 사용된 10686748k, 사용 가능한 1500700k, 버퍼 67104k
스왑: 총 1048568k, 사용된 275904k, 무료 772664k, 캐시된 2371208k

  PID 사용자 PR NI VIRT RES SHR S %CPU %MEM TIME+ 명령
24252 wwwrun 20 0 2216m 161m 7484 S 20.2 1.4 0:09.25 httpd
24750 wwwrun 20 0 1264m 51m 6196 S 9.9 0.4 0:00.93 httpd
23996 wwwrun 20 0 2136m 279m 7292 S 6.0 2.4 0:16.76 httpd
23326 wwwrun 20 0 2216m 276m 7376 S 2.7 2.3 0:16.81 httpd
23582 wwwrun 20 0 2208m 293m 7132 S 2.3 2.5 0:27.30 httpd
23688 wwwrun 20 0 1904m 208m 7304 S 1.0 1.8 0:13.62 httpd
19507 wwwrun 20 0 2182m 229m 8096 S 0.7 1.9 0:18.65 httpd
23616 wwwrun 20 0 1908m 239m 7092 S 0.7 2.0 0:18.48 httpd
18304 wwwrun 20 0 2160m 334m 11m S 0.3 2.8 0:47.38 httpd
23637 wwwrun 20 0 1830m 231m 7556 S 0.3 1.9 0:20.56 httpd
24457 wwwrun 20 0 2196m 174m 6568 S 0.3 1.5 0:04.11 httpd
15694 wwwrun 20 0 2199m 295m 7504 S 0.0 2.5 0:20.54 httpd
15783 wwwrun 20 0 2172m 244m 10m S 0.0 2.1 0:17.45 httpd
16577 wwwrun 20 0 2128m 354m 7436 S 0.0 3.0 0:28.21 httpd
18290 wwwrun 20 0 277m 9880 964 S 0.0 0.1 0:00.05 httpd
18379 wwwrun 20 0 2208m 211m 6864 S 0.0 1.8 0:08.57 httpd
18480 wwwrun 20 0 2096m 305m 7540 S 0.0 2.6 0:17.72 httpd
18791 wwwrun 20 0 1920m 251m 7244 S 0.0 2.1 0:20.24 httpd
19348 wwwrun 20 0 2060m 310m 7388 S 0.0 2.6 0:22.07 httpd
19619 wwwrun 20 0 2206m 235m 7340 S 0.0 2.0 0:15.30 httpd
19999 wwwrun 20 0 2178m 144m 7132 S 0.0 1.2 0:05.50 httpd
20697 wwwrun 20 0 2002m 193m 7276 S 0.0 1.6 0:08.12 httpd
20838 wwwrun 20 0 1890m 127m 7260 S 0.0 1.1 0:07.44 httpd
21407 wwwrun 20 0 1988m 290m 7708 S 0.0 2.4 0:39.33 httpd
22252 wwwrun 20 0 2216m 295m 7732 S 0.0 2.5 0:27.04 httpd
22723 wwwrun 20 0 2020m 187m 7444 S 0.0 1.6 0:39.80 httpd
22753 wwwrun 20 0 1850m 206m 7448 S 0.0 1.7 0:10.62 httpd
23174 wwwrun 20 0 1990m 229m 7332 S 0.0 1.9 0:07.71 httpd
23383 wwwrun 20 0 1504m 76m 6372 S 0.0 0.6 0:01.25 httpd
23720 wwwrun 20 0 1906m 225m 7080 S 0.0 1.9 0:20.12 httpd
24778 wwwrun 20 0 970m 30m 5604 S 0.0 0.3 0:00.80 httpd

마지막으로 mod_status 출력은 다음과 같습니다.

   서버 버전: Apache/2.2.23(Unix) mod_ssl/2.2.23 OpenSSL/1.0.0-fips 도메인 서버 PHP/5.3.24(Suhosin-Patch 포함) mod_perl/2.0.5
          펄/v5.10.1

   서버 구축 날짜: 2013년 5월 15일 10:17:30
     ________________________________________________________________________________________________________________

   현재 시간: 2014년 5월 12일 월요일 16:41:08 BRT
   재시작 시간: 2014년 5월 12일 월요일 15:36:37 BRT
   상위 서버 세대: 1
   서버 가동 시간: 1시간 4분 31초
   총 액세스: 36446 - 총 트래픽: 1.6GB
   CPU 사용량: u213.3 s13.65 cu0 cs0 - 5.86% CPU 로드
   9.42개 요청/초 - 442.8kB/초 - 47.0kB/요청
   현재 처리 중인 요청 249개, 유휴 작업자 0개

WWRRKRKRRKRRWRRRWWWWCRR................................................
RWWWWRRWRRRRKKKRRWRRRRRWWR................................................
WRWRCRRWRRWWRKRRWWRRWRWWW................................................
WRWKKWWWWRWKRRWRCRRRWWWWWW................................................
WRWRWCRKCWWWRWWRRWWCRWRWW................................................
WRWKRWRRKKRKRRRRCWWKWWWWRW................................................
RWWKWRRWKRRRWWRRWWCRRRRRRW................................................
WWWRRWRKWWWKRWWWWWWWWKRRW................................................
RRRRRRRK.WKRRWRWWKRRWRRKR.....................................
KCRRRRWRWWWKRWWWRRKWRWWRK................................................

업데이트 1:

작업자 설정을 조작하여 mod_security2를 비활성화하려고 시도했지만 결국 Apache는 거의 20G의 RAM을 소비하게 되었습니다(서버 충돌을 방지하기 위해 13G 스왑 파일을 추가했습니다).

마지막으로 KeepAlive를 비활성화하고 MaxRequestsPerChild를 100으로 유지했습니다. 이제 Apache는 2-3G를 사용하고 있으며 아래 상태 출력과 같이 요청이 정리되고 있습니다.

   현재 시간: 2014년 5월 13일 화요일 17:07:48 BRT
   재시작 시간: 2014년 5월 13일 화요일 16:49:14 BRT
   상위 서버 생성: 0
   서버 가동 시간: 18분 33초
   총 액세스: 6637 - 총 트래픽: 133.2MB
   CPU 사용량: u34.43 s3.05 cu0 cs0 - 3.37% CPU 로드
   5.96개 요청/초 - 122.5kB/초 - 20.5kB/요청
   현재 처리 중인 요청 14개, 유휴 작업자 86개

..................아르 자형............................... ..............
__RR__R_R__RC_RWC_____................................
R_WC__R___R_________________________________________..................
................................................. ..............
................................................. ..............
................................................. ..............
................................................. ..............
................................................. ..............
................................................. ..............
................................................. ..............

답변1

KeepaliveTimeout매달린 "읽기" 작업자를 줄이는 데 도움이 됩니다.

MPM은 여러 스레드가 포함된 여러 프로세스를 사용하여 들어오는 트래픽을 처리하므로 일반적인 Apache 작업이 표시됩니다.

이 기본 조정은 필요에 따라 더 잘 작동할 수 있습니다.

ServerLimit 12
StartServers 2
MaxClients 500
MinSpareThreads 25
MaxSpareThreads 50
ThreadsPerChild 50

이렇게 하면 총 10개의 프로세스가 생성( MaxClients/ ThreadsPerChild)되어 서버의 메모리 사용량이 크게 줄어듭니다. CPU 가용성으로 인해 더 적은 수의 프로세스에 더 많은 스레드를 감당할 수 있습니다.

이러한 변수를 변경하려면 Apache를 완전히 중지한 후 다시 시작해야 합니다.

답변2

작업자 서버와 함께 상단에 표시된 프로세스 간의 관계는 무엇입니까? 나는 최대 10개의 프로세스를 볼 것으로 예상했습니다(작업자 설정의 ServerLimit - 기본 프로세스를 고려하지 않음).

top이는 작업자 MPM을 실행하는 Apache 서버 와는 다릅니다 . 저는 두 개의 서버를 실행하고 있습니다. 하나는 작업자 MPM이고 다른 하나는 프리포크 MPM입니다. 작업자를 사용하면 topApache 프로세스가 로 나열되고 httpd.worker프로세스 수는 mod_status를 통해 표시되는 활성 서버 수(점이 아닌 항목이 있는 점선) 수와 일치합니다. 프리포크를 사용하면 프로세스가 로 나열되며 httpd숫자는 유휴/활성 작업자 수(점이 아닌 각 항목)와 대략 일치합니다.

따라서 다음 mod_status 출력이 제공됩니다.

..................R.............................................
..............._RR__R_R__RC_RWC__...............................
R_WC__R___R_....................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................

topprefork를 실행하는 서버에서는 대략 31개의 httpd프로세스가 표시되어야 하고, top작업자를 실행하는 서버에서는 3개의 httpd.worker프로세스가 표시되어야 합니다.

관련 정보