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