
Ich betreibe eine Website und versende einen legitimen Opt-in-Newsletter täglich an Abonnenten. Sowohl das Webhosting als auch der E-Mail-Versand werden von derselben Maschine ausgeführt.
Ich habe etwa 100.000 Abonnenten, die meinen täglichen E-Mail-Newsletter abonniert haben. Bis vor kurzem hat mein PHP-Skript ziemlich gut funktioniert und an alle von ihnen E-Mails gesendet, aber da die Liste immer länger wird, kann ich nicht mehr mithalten.
Wenn ich top ausführe, habe ich eine sehr hohe Auslastung – normalerweise mindestens 6 oder 7, manchmal bis zu 15 – obwohl ich nur zwei CPUs habe. Wenn ich jedoch sar ausführe, ist meine CPU durchschnittlich etwa 30 % der Zeit im Leerlauf. Es scheint also, dass ich nicht CPU-gebunden bin. Wenn ich iostat ausführe, scheint es, als wäre ich nicht festplattengebunden, da mein %util für jedes Gerät sehr niedrig ist (nicht mehr als 5 %).
Da ich nicht an die CPU oder die Festplatte gebunden zu sein scheine,warum ist die Top-Berichterstattung so hoch ausgelastet?
Da ich außerdem nicht an die CPU oder die Festplatte gebunden zu sein scheine,warum kann mein Skript zum Senden von E-Mails nicht mithalten?
Folgendes wird mir beim Ausführen von top angezeigt:
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
Folgendes wird mir beim Ausführen von iostat -mx angezeigt:
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
Folgendes wird mir beim Ausführen von sar angezeigt:
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
Hier sind die wichtigsten Prozesse aufgelistet, die zum jeweiligen Ausführungszeitpunkt aufgelistet waren 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
Danke, Dmitri!
1) Ich habe bereits ein Skript, das E-Mail-Adressen abbestellt, die im letzten Monat mindestens fünf Mal zurückgewiesen wurden. Dadurch bleibt meine Liste hoffentlich relativ begrenzt auf aktive E-Mail-Adressen.
2) Ich verwende Exim 4.69. Meine Konfigurationsdatei befindet sich unter
/etc/exim.conf
und meine Protokolldateien befinden sich unter:
/var/log/exim_mainlog
/var/log/exim_paniclog
/var/log/exim_rejectlog
Wenn ich außerdem in /etc/syslog.conf nachschaue, sehe ich Folgendes:
# Log all the mail messages in one place.
mail.* -/var/log/maillog
Ich weiß nicht, was das "-" am Anfang bedeutet, -/var/log/maillog
aber wenn ich in die Datei schaue, ist klar, dass dort eine Menge protokolliert wird.
Zusätzlich wird in dieser Datei einiges protokolliert:
/var/log/exim_mainlog
Ich habe seitdem diese Zeile zu /etc/exim.conf hinzugefügt:
no_message_logs
Ich dachte, dass dadurch die E-Mail-Protokollierung deaktiviert würde (ich habe Exim neu gestartet), aber wenn ich mir /var/log/maillog und /var/log/exim_mainlog ansehe, erhalten beide Dateien immer noch neue Protokolleinträge.
Frage:Wie kann ich die meisten/alle Exim-Protokollierungen deaktivieren?
3) Wenn ich in /var/log/exim_paniclog nachschaue, sehe ich jede Menge Einträge wie diesen:
2010-12-19 04:03:32 1PUFB1-0006xZ-GF User 0 set for local_delivery transport is on the never_users list
Nachdem ich mich eine Weile umgesehen habe, scheint es, als ob dies bedeutet, dass Exim versucht, die Zustellung an die Stamm-E-Mail-Adresse vorzunehmen.Wie können diese E-Mail-Zustellungen an Root am besten abgewickelt werden, ohne dass dabei die CPU-Ressourcen zu sehr beansprucht werden?
Antwort1
Wie bereits erwähnt, hängt die durchschnittliche Auslastung von der Anzahl der wartenden Prozesse in der Ausführungswarteschlange ab. Wenn jeder dieser Prozesse nur sehr wenig Arbeit zu erledigen hat und den Prozessor schnell freigibt, können Sie mit viel höheren durchschnittlichen Auslastungen umgehen als mit der üblichen Faustregel von 1 pro CPU.
Mail ist so ziemlich das perfekte Beispiel dafür. Jeder Prozess benötigt CPU, um eine Nachricht zu senden, aber sehr, sehr wenig. Ich habe Mailsysteme gesehen, die Sendmail mit einer durchschnittlichen Auslastung im Bereich von 25 bis 35 ausführen, und das System ist immer noch interaktiv und funktioniert einwandfrei.
Markieren
Antwort2
Systemmetriken (Last, CPU, I/O) sind für die meisten Leute oft die einzigen Indikatoren für die Leistung ihres Systems – die tatsächliche Transaktionsleistung sieht jedoch etwas ganz anderes aus. Diese Metriken können Hinweise darauf geben, wie die Leistung eingeschränkt ist, aber es ist wirklich viel nützlicher, zu sehen, wie lange Transaktionen tatsächlich dauern.
warum kann mein Skript zum Senden von E-Mails nicht mithalten?
Bedeutet das, dass Sie Probleme mit der nicht geleerten Mail-Warteschlange haben? Oder liegt es an der langen Ausführungszeit des Skripts? Oder schlussfolgern Sie, dass aufgrund der hohen Auslastung ein Problem vorliegt?
Wie mfarver sagt, ist eine hohe Belastung von E-Mail-Systemen nichts Ungewöhnliches, insbesondere angesichts der zunehmenden Anzahl synchroner Prüfungen durch Mailserver zur Vermeidung von Spam.
Persönlich bin ich kein großer Fan von Exim – ich habe mit Sendmail und Postfix viel bessere Erfahrungen gemacht, obwohl ich zugeben muss, dass es mehrere Jahre her ist, seit ich MTAs ernsthaft getestet habe. Sie nähern sich sicherlich dem Bereich, in dem Sie bei der E-Mail-Verarbeitung viel anspruchsvoller vorgehen müssen.
Anstatt die Protokollierung auszuschalten, kann es eine gute Idee sein, vorübergehend eine Weiterleitung für das Root-Konto hinzuzufügen, um genau zu sehen, worum es bei all den E-Mails geht, die nicht zugestellt werden.
Ich vermute, dass der MTA so konfiguriert ist, dass er E-Mails direkt an die Empfänger sendet. Wenn Sie tatsächlich Leistungsprobleme haben, sollten Sie die Verwendung eines Smart Relays in Betracht ziehen, um Nachrichten schneller von Ihrem Server abzuladen. Versuchen Sie aber, Exim nur auf Warteschlange umzustellen, um zu sehen, ob dies zuerst das Lastproblem (und vor allem etwaige Leistungsprobleme) löst. Sehen Sie sich auch Ihren DNS-Caching an und prüfen Sie, ob er verbessert werden könnte.
Wenn Sie bereits ein Smart-Relay verwenden, überprüfen Sie, ob es richtig konfiguriert ist. Bei einem auf Sendmail basierenden Setup werden PHP-Mail()-Aufrufe laut IME lange Zeit blockiert (aber Nachrichten werden trotzdem zugestellt?), wenn der MTA keine Verbindung zum Smarthost herstellen kann.
Viele E-Mail-Anbieter setzen mittlerweile Drosselung als Methode zur Spam-Blockierung ein. Das Sortieren der E-Mail-Liste nach Domänen würde zwar dazu beitragen, DNS-Suchvorgänge zu reduzieren, aber Sie könnten letztendlich Probleme mit Remote-Systemen haben, die E-Mails drosseln oder blockieren. Stellen Sie sicher, dass Sie alles tun, um nicht wie ein Spammer auszusehen (z. B. SPF, DKIM). Wenn ich mich recht entsinne, unterstützt Exim Milter nicht direkt. Es gibt viele nützliche Milter, insbesondere Milter-Limit.
Antwort3
high load
ist die durchschnittliche Größe von run queue
z. B. Prozessen, die auf der CPU ausgeführt werden sollen. Es sieht so aus, als ob Ihr Skript viel CPU-Arbeit leistet. Sie müssen es also profilieren und seine Quellen hier veröffentlichen. Wie versenden Sie Briefe?
Antwort4
Ihr Maillog-Eintrag ist so markiert, dass er bei jedem Eintrag nicht geleert wird. Dies sollte dazu beitragen, den CPU-Overhead beim Schreiben in dieses Protokoll zu reduzieren. Da Sie jedoch Exim verwenden, wird dieses Protokoll standardmäßig nicht verwendet. Überprüfen Sie Ihre Konfiguration, um sicherzustellen, dass Sie die Verwendung von Syslog nicht aktiviert haben.
Um die Anzahl der Protokollierungen zu reduzieren, fügen Sie log_selector
Ihrer Konfiguration eine Spezifikation hinzu. Mögliche Werte sind in der Exim-Spezifikation aufgeführt (wahrscheinlich Kapitel 49). Dies ist jedoch wahrscheinlich nicht Ihr Problem.
Versuchen Sie exiwhat
, zu überprüfen, welche Zustellungsversuche unternommen werden. mailq
Es sollten nicht viele Nachrichten auf die Zustellung warten und solche, die sich seit einer Stunde oder länger in der Warteschlange befinden. Eine lange Liste von Nachrichten, die sich schon eine Weile in der Warteschlange befinden, deutet darauf hin, dass Sie Zustellungsversuche unternehmen, die wahrscheinlich zurückgewiesen werden.
Exim kommt mit vielen gleichzeitig laufenden Lieferprozessen nicht gut zurecht. Sie sollten sich Konfigurationsänderungen ansehen, die helfen könnten.
- Versuchen Sie, die Zeit zwischen den Wiederholungsversuchen zu verlängern und die Zeit zu verkürzen, bevor Sie Nachrichten als nicht zugestellt zurückweisen. Dadurch verringert sich die Anzahl der Versuche, die erforderlich sind, um nicht zustellbare Nachrichten zurückzuweisen.
- Deaktivieren Sie sofortige Zustellversuche, damit Zustellungen aus der Warteschlange ausgeführt werden. Möglicherweise möchten Sie
queue_only_load
dies bedingt tun. - Wird festgelegt
queue_run_max
, um die Anzahl der Warteschlangen-Runner-Prozesse zu begrenzen.
Um die versuchten Zustellungen zu unterbinden, können Sie ein Transportmittel oder einen Alias verwenden. Ich nenne meine E-Mail-Adresse root. Ubuntu verwendet diesen Router, um Zustellungen zu verhindern, die als root ausgeführt werden.
mail4root: debug_print = "R: mail4root für $local_part@$domain" Treiber = Umleitung Domänen = +lokale_Domänen Daten = /var/mail/mail file_transport = Adressdatei lokale_Teile = Wurzel Benutzer = Mail Gruppe = Mail