Position: Home > Computer Know-How / Gewusst Wie > Optimierungen rund um einen Linux-Server

Optimierungen rund um einen Linux-Server

Da ich mir sicher bin, nicht der Einzige mit dem Problem zu sein, einen Linux-Server, der mehrere Dienste bereitstellt, ständig verfügbar sein soll, aber keine optimale Hardware zu besitzen, online halten zu müssen, hier ein kleines Protokoll.

Konkret geht es um einen Root-Server bei einem großen Provider, an den man nicht physikalisch rankommt und bei dem man keine Hardware aufrüsten kann (jedenfalls nicht ohne Weiteres).

Auf dem Server läuft ein Redhat 7.2, als Konfigurationsoberfläche "Ensim" (ein insgesamt schreckliches Tool, welches den Server völlig in Beschlag nimmt und keinen echten root-Zugriff erlaubt. Viele Einstellungen kann man NUR über das Webinterface von Ensim sauber einzustellen.)

Als Dienste sollen laufen:

  • Webserver (Apache 1.3.x)
  • Scriptsprache (PHP 4.x)
  • Datenbank (MySQL 3.23.x)
  • Mailserver (Sendmail 8.11.x + Procmail)
  • Anti-Spam-Schutz (SpamAssassin 2.6x)
  • FTP-Server (ProFTP 1.2.x)

Eine ganze Menge für einen kleinen Pentium III mit 512 MB RAM und 256 MB Swap-Space...

Im Laufe der Zeit wurden die Zugriffe auf die beiden Haupt-Domains des Servers immer mehr, dazu wurden immer mehr Services auf den Websites angeboten, die zum Teil sehr resourcenfressend sind. So kam es immer wieder zum Einfrieren des Servers, ohne dass es einen erkennbaren definierten Grund gab.

Ich forschte, recherchierte und holte mir blutige Nasen in manchen Linux-Foren, in welchen ich einfach Dinge fragte, die wohl der durchschnittliche Linux-Fachmann nur im Keller auf kleine Zettel schreibt, die er nach dem Lesen auch gleich wieder aufisst...

Nach und nach erkannte ich, dass verschiedene Programme Standardeinstellungen haben, welche brutalen Gebrauch von der Hardware machen, ohne Rücksicht auf Verluste. Konkrete Beispiele oder Vorschläge, bei welchen Resourcen ungefähr(!) welche Einstellungen sinnvoll sind, gibt es nur GANZ selten.

Hier also die meinen, die ich vor allem durch Probieren herausfand (Achtung! Die Bedeutung der Parameter kann jeder in der Dokumentation der jeweiligen Software nachschlagen, das erläutere ich hier nicht nochmal. Tschuldigung.):

 

Apache 1.3.27-3

MaxClients 100
MinSpareServers 4
MaxSpareServers 8
StartServers 4
MaxRequestsPerClient 15000

Vor allem der letzte Wert erreicht, dass ein Child-Prozess nach einer Weile stirbt, sodass er sich nicht übermäßig aufblähen kann und auch vor allem Fehlprogrammierungen etwas eingedämmt werden. "MaxClients" ist zu(!) niedrig, aber ich habe keine Wahl...

 

PHP 4.3.5

memory_limit = 8M

Dazu installierte ich den ionCube PHP Accelerator, was die Ausführung von PHP-Scripten erheblich schneller macht und den Server etwas entlastet. Kaum zu glauben.

 

MySQL 3.23.58-1

[mysqld]
set-variable = max_connections=250
set-variable = interactive_timeout=300
set-variable = wait_timeout=300
set-variable = key_buffer=12M
set-variable = key_buffer_size=12M
set-variable = sort_buffer=256k
set-variable = table_cache=256
set-variable = max_binlog_cache_size=16M
set-variable = max_binlog_size=128M
set-variable = max_join_size=128M

[safe_mysqld]
set-variable = key_buffer=12M
set-variable = key_buffer_size=12M
set-variable = sort_buffer=256k
set-variable = table_cache=256

Ob die Werte unter [safe_mysqld] nochmal sein müssen, weiß ich nicht sicher, vorsichtshalber machte ich es so. Vor allem die timeout-Werte (Sekunden) sind enorm wichtig, weil sonst inaktive Verbindungen zur Datenbank standardmäßig 8 Stunden(!) offen bleiben. Bei mir werden sie nach 5 Minuten beendet, geht prima.

Die Speicherwerte funktionieren momentan gut bei o.g. Hardware, ich hätte sie gern noch niedriger und bin am Probieren.

Das Probieren wird durch folgendes unterstützt:
Man lässt sich mal (z.B. durch phpMyAdmin) die Werte "Key read requests" und "Key reads" anzeigen und teilt den Zweiten durch den Ersten. Der Quotient sollte etwas unter 0,01 (Cache-Hitrate 99,9%) sein. Derselbe Quotient aus "Key writes" und "Key write requests" sollte kleiner als 1 sein.
Auch andere "Statusvariablen" aus dem phpMyadmin sind wirklich sehr hilfreich beim Tuning.

 

Sendmail 8.11.6-27

define(`confTO_COMMAND', `5m')dnl
define(`confMAX_DAEMON_CHILDREN', `9')dnl
define(`confMAX_RCPTS_PER_MESSAGE', `1000')dnl
define(`confCONNECTION_RATE_THROTTLE', `3')dnl
define(`confMAX_HOP', `30')dnl
define(`confTO_RCPT', `5m')dnl
define(`confTO_DATAINIT', `2m')dnl
define(`confTO_DATABLOCK', `3m')dnl
define(`confTO_DATAFINAL', `10m')dnl
define(`confTO_COMMAND', `5m')dnl
define(`confTO_QUIT', `5s')dnl

Hier sind es vor allem die Timeouts, die standardmäßig viel zu lang sind. Warum soll man z.B. auf ein nächsten Kommando 1 Stunde warten??? Die Werte sollten aber auch nicht zu kurz sein, es gibt teilweise sehr langsame Server, sogen. "Teergruben". Die RFC 2821 gibt hier die Mindestwerte vor.

Die maximale Anzahl der Child-Prozesse sowie die maximale Anzahl neuer Verbindungen pro Sekunde sind extrem niedrig gewählt, weil auf dem Server ein Newsletter versendet wird, der Sendmail in Spitzenzeiten extrem belastet und schon mehrmals ein Einfrieren aller Dienste erreichte. Mit den o.g. Werten läuft alles zwar etwas langsamer, aber stabil.

 

SpamAssassin 2.63

als Startoption "-m2"

Nicht mehr taufrisch die Version, aber ein Update scheue ich auf DIESEM Server. Zu viel Spam kommt da rein, sodass ich eine zwischenzeitliche Lernphase (der Bayes-Datenbank) von Version 3.0 noch rausschiebe. So erlebte ich es auf meinem heimischen Gateway, dass zwischenzeitlich etwas mehr Spam durchkam, jetzt aber alles super läuft. Auf dem Server hier wäre "etwas mehr Spam" gleich hunderte oder tausende Mails mehr...

Außerdem sollte man die Anzahl der aktivierten zusätzlichen Rules-Sätze in sinnvollen Grenzen halten, um den Speicherbedarf eines einzelnen Child-Prozesses nicht zu groß werden zu lassen. Bei mir benötigt ein solcher Prozess bis zu 32 MB.

Aktiv sind bei mir:

70_sare_adult
70_sare_header
70_sare_html
70_sare_random
70_sare_spoof
70_sare_uri
99_sare-fraud
antidrug
bogus_virus_warnings
evilnumbers
spamcop_uri
eigene Blacklist-Sammlung

Dazu sind DCC, Pyzor und Razor 2 im Einsatz, jeweils mit einem Timeout von 3 Sekunden.

 

ProFTP 1.2.10

TimeoutIdle 600
TimeoutNoTransfer 600
TimeoutLogin 300
TimesGMT off
MaxLoginAttempts 10
PassivePorts 60000 65535
UseReverseDNS off
IdentLookups off
AllowForeignAddress off
MaxInstances 10

Die meisten Einstellungen davon sind vor allem sicherheitsrelevant, betreffen jedoch auch den Resourcenverbrauch.