Что происходит с моим сервером? Высокая нагрузка, много простоя процессора, низкая загрузка диска

Что происходит с моим сервером? Высокая нагрузка, много простоя процессора, низкая загрузка диска

Я управляю веб-сайтом и отправляю подписчикам легитимную ежедневную рассылку по электронной почте. И веб-хостинг, и отправка электронной почты выполняются на одной и той же машине.

У меня около 100 000 подписчиков, которые подписались на мою ежедневную рассылку. Мой PHP-скрипт неплохо справлялся с отправкой почты всем им до недавнего времени, но поскольку список разросся, я не могу за ним угнаться.

Когда я запускаю top, у меня очень высокая загрузка — обычно не менее 6 или 7, иногда до 15 — даже при том, что у меня всего два ЦП. Однако, когда я запускаю sar, мой ЦП простаивает в среднем около 30% времени. Так что, похоже, я не ограничен ЦП. Когда я запускаю iostat, похоже, что я не ограничен диском, потому что мой %util для каждого устройства очень низок (не более 5%).

Учитывая, что я, похоже, не ограничен процессором или диском,почему у верхней отчетности такая высокая нагрузка?

Кроме того, поскольку я, похоже, не ограничен процессором или диском,почему мой скрипт отправки электронной почты не справляется?


Вот что я вижу при запуске 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) У меня уже есть скрипт, который отписывает адреса электронной почты, с которых за последний месяц не доходили письма, как минимум, пять раз, так что, надеюсь, это позволит мне ограничить свой список только активными адресами электронной почты.

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 пытается доставить почту на корневой адрес электронной почты.Каков наилучший способ обработки этих почтовых отправлений пользователю root, используя при этом как можно меньше ресурсов ЦП?

решение1

Как уже отмечалось, средняя загрузка связана с количеством ожидающих процессов в очереди выполнения. Если у каждого из этих процессов очень мало работы, и они быстро освобождают процессор, вы можете справиться со значительно большими средними загрузками, чем общепринятое правило 1 на ЦП.

Почта — это практически идеальный пример этого, каждому процессу требуется CPU для отправки сообщения, но очень, очень мало. Я видел почтовые системы, работающие с sendmail при средней нагрузке в диапазоне от 25 до 35, и система все еще интерактивна и работает нормально.

Отметка

решение2

Системные метрики (нагрузка, ЦП, ввод-вывод) часто являются единственными индикаторами производительности системы, которые большинство людей имеют, однако фактическая транзакционная производительность — это нечто совсем иное. Эти метрики могут дать представление о том, как ограничивается производительность, но на самом деле гораздо полезнее посмотреть, сколько времени на самом деле занимают транзакции.

почему мой скрипт отправки электронной почты не справляется?

Означает ли это, что вы видите проблемы с почтовой очередью, которая не очищается? Или это связано с длительностью выполнения скрипта? Или вы делаете вывод, что проблема существует, основываясь на высокой нагрузке?

Как говорит mfarver, высокая нагрузка на системы электронной почты — не редкость, особенно с учетом растущего числа синхронных проверок, выполняемых почтовыми серверами для предотвращения спама.

Лично я не большой поклонник exim - у меня был гораздо лучший опыт с sendmail и postfix, хотя я признаю, что прошло несколько лет с тех пор, как я проводил какие-либо серьезные испытания MTA. Конечно, вы приближаетесь к тому, что вам нужно быть намного более искушенным в обработке электронной почты.

Вместо того чтобы отключать ведение журнала, может быть хорошей идеей временно включить пересылку для учетной записи root, чтобы точно знать, о чем все эти письма, которые не доставляются.

Я предполагаю, что MTA настроен на отправку почты напрямую получателям. Если у вас есть проблемы с производительностью, то вы можете рассмотреть возможность использования интеллектуального релея для более быстрой выгрузки сообщений с вашего сервера. Но попробуйте переключить Exim на режим «только очередь», чтобы сначала посмотреть, решит ли это проблему с нагрузкой (и, что еще важнее, с производительностью). Также проверьте кэширование DNS и посмотрите, можно ли его улучшить.

Если вы уже используете интеллектуальное реле, то проверьте правильность его настройки - IME, при настройке на основе sendmail вызовы php mail() блокируются на долгое время (но каким-то образом сообщения все равно доставляются?), если MTA не может подключиться к интеллектуальному узлу.

Многие поставщики услуг электронной почты теперь используют регулирование как метод блокировки спама - хотя сортировка списка электронной почты по домену поможет сократить поиск DNS, у вас могут возникнуть проблемы с регулированием или блокировкой почты удаленными системами. Убедитесь, что вы делаете все возможное, чтобы не выглядеть спамером (например, SPF, DKIM) - IIRC Exim напрямую не поддерживает milter - доступно много полезных milter - в частности, milter-limit.

решение3

high loadэто средний размер run queue- например, процессов, которые хотят быть запущенными на процессоре. Похоже, ваш скрипт выполняет много работы процессора. Поэтому вы должны профилировать его и разместить здесь его исходники. Как вы отправляете письма?

решение4

Ваша запись в журнале почты помечена как не сбрасываемая при каждой записи. Это должно помочь снизить нагрузку на процессор при записи в этот журнал. Однако, поскольку вы используете Exim, этот журнал по умолчанию не используется. Проверьте конфигурацию, чтобы убедиться, что вы не включили использование syslog.

Чтобы уменьшить объем регистрируемых данных, добавьте log_selectorспецификацию в конфигурацию. Возможные значения подробно описаны в спецификации Exim (вероятно, глава 49). Хотя, скорее всего, это не ваша проблема.

Попробуйте запустить exiwhat, чтобы увидеть, какие доставки предпринимаются. mailqне должно быть много сообщений, ожидающих доставки и fer, которые находятся в очереди в течение часа или более. Длинный список сообщений, которые находятся в очереди некоторое время, указывает на то, что вы пытаетесь доставить сообщения, которые, скорее всего, не будут доставлены.

Exim не справляется с большим количеством процессов доставки, запущенных одновременно. Вам следует посмотреть изменения в конфигурации, которые могут помочь.

  • попробуйте увеличить время между повторными попытками и сократить время до возврата сообщений как недоставленных. Это сократит количество попыток, необходимых для возврата недоставленных сообщений.
  • Отключить попытки немедленной доставки, чтобы доставки выполнялись из очереди. Вы можете использовать , queue_only_loadчтобы сделать это условно.
  • Установите queue_run_maxограничение на количество процессов обработки очереди.

Чтобы разрешить попытки доставки маршрутизировать ваш можно использовать транспорт или псевдоним. Я псевдоним root для моего адреса электронной почты. Ubuntu использует этот маршрутизатор для предотвращения доставок, запущенных от имени root.

mail4root:
  debug_print = "R: mail4root для $local_part@$domain"
  драйвер = перенаправление
  домены = +локальные_домены
  данные = /var/mail/mail
  файл_транспорт = адрес_файла
  local_parts = корень
  пользователь = почта
  группа = почта

Связанный контент