Was ist mit meinem Server los? Hohe Auslastung, viel CPU-Leerlaufzeit, geringe Festplattenauslastung

Was ist mit meinem Server los? Hohe Auslastung, viel CPU-Leerlaufzeit, geringe Festplattenauslastung

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/maillogaber 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 loadist die durchschnittliche Größe von run queuez. 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_selectorIhrer 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. mailqEs 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_loaddies 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

verwandte Informationen