내 서버에 무슨 일이 일어나고 있는 걸까요? 높은 로드, 많은 유휴 CPU 시간, 낮은 디스크 활용도

내 서버에 무슨 일이 일어나고 있는 걸까요? 높은 로드, 많은 유휴 CPU 시간, 낮은 디스크 활용도

저는 웹사이트를 운영하고 있으며 합법적인 선택이 가능한 일일 이메일 뉴스레터를 구독자에게 보냅니다. 웹 호스팅과 이메일 전송은 모두 동일한 시스템에서 수행됩니다.

내 일일 이메일 뉴스레터를 구독하는 구독자는 약 100,000명입니다. 내 PHP 스크립트는 최근까지 모든 메일에 메일을 보내는 일을 꽤 잘 수행했지만 목록이 늘어나면서 따라갈 수 없습니다.

top을 실행하면 CPU가 2개만 있어도 로드가 매우 높습니다. 일반적으로 최소 6~7개, 때로는 최대 15개입니다. 그러나 sar를 실행할 때 내 CPU는 평균 약 30%의 시간 동안 유휴 상태입니다. 그래서 CPU에 묶여 있지 않은 것 같습니다. iostat를 실행하면 각 장치의 %util이 매우 낮기 때문에(5% 이하) 디스크 바인딩이 아닌 것처럼 보입니다.

CPU 바운드나 디스크 바운드가 아닌 것 같다는 점을 고려하면,왜 이렇게 부하가 높다고 보고하는 걸까요?

게다가 CPU 바운드나 디스크 바운드도 아닌 것 같아서,내 이메일 전송 스크립트가 왜 따라갈 수 없나요?


top을 실행할 때 표시되는 내용은 다음과 같습니다.

top - 11:33:28 up 74 days, 18:49,  2 users,  load average: 7.65, 8.79, 8.28
Tasks: 168 total,   5 running, 162 sleeping,   0 stopped,   1 zombie
Cpu(s): 38.9%us, 58.6%sy,  0.8%ni,  0.0%id,  0.7%wa,  0.2%hi,  0.8%si,  0.0%st
Mem:   3083012k total,  2144436k used,   938576k free,   281136k buffers
Swap:  2048248k total,    39164k used,  2009084k free,  1470412k cached

iostat -mx를 실행할 때 표시되는 내용은 다음과 같습니다.

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          34.80    1.20   55.24    0.37    0.00    8.38

Device:         rrqm/s   wrqm/s   r/s   w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.19    71.70  1.59 29.45     0.02     0.07     5.90     0.55   17.82   1.16   3.59
sda1              0.00     0.00  0.00  0.00     0.00     0.00     7.10     0.00   13.80  13.72   0.00
sda2              0.05    50.45  1.13 24.57     0.01     0.29    24.25     0.35   13.43   1.15   2.97
sda3              0.05    10.17  0.20  2.33     0.01     0.05    43.75     0.05   20.96   2.45   0.62
sda4              0.00     0.00  0.00  0.00     0.00     0.00     2.00     0.00   70.50  70.50   0.00
sda5              0.07     0.22  0.03  0.07     0.00     0.00    32.84     0.08  856.19   8.03   0.08
sda6              0.02     5.45  0.03  0.72     0.00     0.02    67.55     0.02   26.72   5.26   0.39
sda7              0.00     1.56  0.00  0.42     0.00     0.01    38.04     0.00    8.88   5.84   0.24
sda8              0.01     3.84  0.20  1.35     0.00     0.02    28.55     0.05   31.90   4.08   0.63

sar를 실행할 때 표시되는 내용은 다음과 같습니다.

09:40:02 AM       CPU     %user     %nice   %system   %iowait    %steal     %idle
09:50:01 AM       all     30.59      1.01     49.80      0.23      0.00     18.37
10:00:08 AM       all     31.73      0.92     51.66      0.13      0.00     15.55
10:10:06 AM       all     30.43      0.99     48.94      0.26      0.00     19.38
10:20:01 AM       all     29.58      1.00     47.76      0.25      0.00     21.42
10:30:01 AM       all     29.37      1.02     47.30      0.18      0.00     22.13
10:40:06 AM       all     32.50      1.01     52.94      0.16      0.00     13.39
10:50:01 AM       all     30.49      1.00     49.59      0.15      0.00     18.77
11:00:01 AM       all     29.43      0.99     47.71      0.17      0.00     21.71
11:10:07 AM       all     30.26      0.93     49.48      0.83      0.00     18.50
11:20:02 AM       all     29.83      0.81     48.51      1.32      0.00     19.52
11:30:06 AM       all     31.18      0.88     51.33      1.15      0.00     15.47
Average:          all     26.21      1.15     42.62      0.48      0.00     29.54

내가 실행한 특정 시간에 나열된 상위 소수의 프로세스는 다음과 같습니다 top -c.

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                      
 8180 mysql     16   0 57448  19m 2948 S 26.6  0.7   4702:26 /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/bristno.pid --skip-external-locking                          
26956 brristno  17   0     0    0    0 Z  8.0  0.0   0:00.24 [php] <defunct>                                                                                                                                                               
26958 brristno  17   0 94408  43m  37m R  5.0  1.4   0:00.15 /usr/bin/php /home/brristno/public_html/dbv.php                                                                                                                               
22852 nobody    16   0  9628 2900 1524 S  0.7  0.1   0:00.17 /usr/local/apache/bin/httpd -k start -DSSL                                                                                                                                    
 8591 brristno  34  19 96896  13m 6652 S  0.3  0.4   0:29.82 /usr/local/bin/php /home/brristno/bin/mailer.php 1qwqyb6 i0gbor                                                                                                               
24469 nobody    16   0  9628 2880 1508 S  0.3  0.1   0:00.08 /usr/local/apache/bin/httpd -k start -DSSL                                                                                                                                    
25495 nobody    15   0  9628 2876 1500 S  0.3  0.1   0:00.06 /usr/local/apache/bin/httpd -k start -DSSL                                                                                                                                    
26149 nobody    15   0  9628 2864 1504 S  0.3  0.1   0:00.04 /usr/local/apache/bin/httpd -k start -DSSL      

고마워요, 드미트리!

1) 지난 달에 5번 이상 반송된 이메일 주소를 구독 취소하는 스크립트가 이미 있으므로 내 목록이 활성 이메일 주소로 비교적 제한되어 있기를 바랍니다.

2) 나는 exim 4.69를 사용하고 있습니다. 내 구성 파일은 다음 위치에 있습니다.

/etc/exim.conf

내 로그 파일은 다음 위치에 있습니다.

/var/log/exim_mainlog
/var/log/exim_paniclog
/var/log/exim_rejectlog

또한 /etc/syslog.conf를 보면 다음이 표시됩니다.

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog

시작 부분의 "-"가 무엇을 의미하는지 모르겠지만 -/var/log/maillog해당 파일을 보면 거기에 많은 내용이 기록되고 있는 것이 분명합니다.

또한 이 파일에는 많은 내용이 기록됩니다.

/var/log/exim_mainlog

이후 나는 /etc/exim.conf에 다음 줄을 추가했습니다:

no_message_logs

나는 이것이 메일 로깅을 비활성화할 것이라고 생각했지만(exim을 다시 시작했습니다) /var/log/maillog와 /var/log/exim_mainlog를 보면 두 파일 모두 여전히 새로운 로그 항목을 수신하고 있습니다.

질문:대부분/모든 exim 로깅을 비활성화하려면 어떻게 해야 합니까?

3) /var/log/exim_paniclog를 보면 다음과 같은 항목이 많이 있습니다.

2010-12-19 04:03:32 1PUFB1-0006xZ-GF User 0 set for local_delivery transport is on the never_users list

잠시 둘러본 결과 이는 exim이 루트 이메일 주소로 전달을 시도한다는 의미인 것 같습니다.가능한 적은 CPU 리소스를 사용하면서 이러한 메일 배달을 루트로 처리하는 가장 좋은 방법은 무엇입니까?

답변1

앞서 언급한 바와 같이 평균 로드는 실행 대기열에서 대기 중인 프로세스 수와 관련이 있습니다. 각 프로세스가 수행할 작업이 거의 없고 프로세서를 빠르게 해제하는 경우 일반적인 경험 법칙인 CPU당 1보다 훨씬 더 큰 로드 평균을 처리할 수 있습니다.

메일은 이에 대한 거의 완벽한 예입니다. 각 프로세스에는 메시지를 보내는 데 CPU가 필요하지만 매우 적습니다. 나는 메일 시스템이 평균 25~35 범위의 로드로 sendmail을 실행하는 것을 본 적이 있으며, 시스템은 여전히 ​​대화형으로 잘 작동하고 있습니다.

표시

답변2

시스템 지표(로드, CPU, I/O)는 대부분의 사람들이 시스템 성능에 대해 갖고 있는 유일한 지표이지만 실제 트랜잭션 성능은 상당히 다릅니다. 이러한 측정항목은 성능이 어떻게 제한되는지에 대한 지침을 제공할 수 있지만 실제로는 트랜잭션이 실제로 소요되는 시간을 살펴보는 것이 훨씬 더 유용합니다.

내 이메일 전송 스크립트가 왜 따라갈 수 없나요?

이는 메일 대기열이 지워지지 않는 문제가 있다는 뜻입니까? 아니면 스크립트를 실행하는 데 걸리는 시간입니까? 아니면 높은 부하를 기준으로 문제가 있다고 추론하고 있습니까?

mfarver가 말했듯이, 특히 스팸을 방지하기 위해 메일 서버에서 수행되는 동기식 검사 수가 증가함에 따라 이메일 시스템에서 높은 로드는 드문 일이 아닙니다.

개인적으로 저는 exim을 별로 좋아하지 않습니다. 비록 MTA에 대한 진지한 테스트를 한 지 몇 년이 지났다는 점은 인정하지만, sendmail과 postfix에 대해 훨씬 더 나은 경험을 했습니다. 확실히 당신은 이메일 처리에 대해 훨씬 더 정교해야 하는 야구장에 들어가고 있습니다.

로깅을 끄는 대신 루트 계정에 일시적으로 전달을 추가하여 전달되지 않는 모든 이메일의 내용을 정확하게 확인하는 것이 좋습니다.

내 생각에는 MTA가 수신자에게 직접 메일을 보내도록 구성되어 있는 것 같습니다. 성능 문제가 있는 경우 스마트 릴레이를 사용하여 서버에서 메시지를 더 빠르게 오프로드하는 것을 고려할 수 있습니다. 그러나 Exim을 대기열 전용으로 전환하여 이것이 로드(더 중요하게는 성능) 문제를 먼저 해결하는지 확인하십시오. 또한 DNS 캐싱을 살펴보고 개선할 수 있는지 확인하세요.

이미 스마트 릴레이를 사용하고 있다면 올바르게 구성되었는지 확인하십시오. IME, sendmail 기반 설정, PHP mail() 호출이 오랫동안 차단됩니다(그러나 메시지는 여전히 전달됩니까?) MTA가 할 수 없는 경우 스마트 호스트에 연결하세요.

이제 많은 이메일 제공업체가 스팸 차단 방법으로 제한을 구현합니다. 도메인별로 이메일 목록을 정렬하면 DNS 조회를 줄이는 데 도움이 되지만 원격 시스템에서 메일을 제한하거나 차단하는 데 문제가 발생할 수 있습니다. 스패머처럼 보이지 않도록 실용적인 모든 조치를 취하고 있는지 확인하십시오(예: SPF, DKIM). IIRC Exim은 밀터를 직접 지원하지 않습니다. 사용할 수 있는 유용한 밀터가 많이 있습니다. 특히 밀터 제한이 있습니다.

답변3

high loadrun queue예를 들어 CPU에서 실행되기를 원하는 프로세스 의 평균 크기입니다 . 귀하의 스크립트가 많은 CPU 작업을 수행하는 것 같습니다. 따라서 프로필을 작성하고 여기에 출처를 게시해야 합니다. 편지는 어떻게 보내나요?

답변4

메일 로그 항목은 각 항목에서 플러시되지 않도록 표시되어 있습니다. 이렇게 하면 이 로그에 쓰는 CPU 오버헤드를 줄이는 데 도움이 됩니다. 그러나 Exim을 사용하는 경우 이 로그는 기본적으로 사용되지 않습니다. 구성을 확인하여 syslog 사용을 활성화하지 않았는지 확인하세요.

기록되는 내용을 줄이려면 log_selector구성에 사양을 추가하세요. 가능한 값은 Exim 사양(예: 49장)에 자세히 설명되어 있습니다. 그러나 이것은 귀하의 문제가 아닐 가능성이 높습니다.

exiwhat어떤 배달이 시도되고 있는지 확인하려면 달려보세요 . mailq전달을 기다리는 메시지가 너무 많아서 한 시간 이상 대기열에 있어서는 안 됩니다. 한동안 대기열에 있던 긴 메시지 목록은 반송될 가능성이 있는 배달을 시도하고 있음을 나타냅니다.

Exim은 동시에 실행되는 많은 전달 프로세스를 잘 처리하지 못합니다. 도움이 될 수 있는 구성 변경 사항을 살펴봐야 합니다.

  • 재시도 간격을 늘리고 메시지가 배달되지 않은 것으로 반송되기 전까지의 시간을 줄여보세요. 이렇게 하면 전달할 수 없는 메시지를 반송하는 데 필요한 시도 횟수가 줄어듭니다.
  • 대기열에서 배달이 실행되도록 즉시 배달 시도를 비활성화합니다. 조건부로 이 작업을 수행하는 데 사용할 수 있습니다 queue_only_load.
  • queue_run_maxQueue Runner 프로세스 수를 제한하도록 설정합니다 .

라우팅하려는 배달 시도를 해결하려면 전송 또는 별칭을 사용할 수 있습니다. 나는 내 이메일 주소에 루트라는 별칭을 붙였습니다. Ubuntu는 이 라우터를 사용하여 배달이 루트로 실행되는 것을 방지합니다.

메일4루트:
  debug_print = "R: $local_part@$domain에 대한 mail4root"
  드라이버 = 리디렉션
  도메인 = +local_domains
  데이터 = /var/mail/mail
  file_transport = 주소_파일
  local_parts = 루트
  사용자 = 메일
  그룹 = 메일

관련 정보