Beispielkonfiguration (Server mit 1 GB RAM und ~ 50 gleichzeitigen Client Verbindungen)
Ziel ist, daß Apache + MySQL eine möglichst hohe Anzahl an Seitenaufrufen/Anfragen gleichzeitig bearbeiten können ohne daß der RAM ausgeht und es zu Fehlermeldungen kommt. Um dies zu erreichen muß man den Speicherverbrauch (RAM) von Apache und MySQL limitieren.
1.
Zuerst optimieren wir Apache.
/etc/httpd/conf/httpd.conf oder /etc/apache2/server-tuning.conf Einstellungen ändern.
Code:
Timeout 30
KeepAlive On
MaxKeepAliveRequests 150
KeepAliveTimeout 2 eventuell auch auf 1
HostnameLookups off
und Apache neu starten /etc/init.d/httpd restart
2.
mit
Code:
ps -ylC httpd --sort:rss
oder
Code:
ps axu --sort:command
ermitteln wir wieviele
httpd Prozesse (CMD) wir haben und wieviel RAM diese benötigen.
Code:
S UID PID PPID C PRI NI RSS SZ WCHAN TTY TIME CMD
S 48 27683 32483 0 76 0 11576 8011 semtim ? 00:00:00 httpd
S 48 27734 32483 0 76 0 11956 8018 - ? 00:00:00 httpd
S 0 32483 1 0 76 0 15796 7985 - ? 00:00:46 httpd
der Wert
RSS ist der Speicherverbrauch in KB, hier also 11 MB und 15 MB
3.
nun müssen wir Apache RAM zuweisen. 1 GB stehen zur Verfügung, davon ziehen wir pauschal 125 MB ab für Qmail + Apache (ohne Plesk, Bind, Spamassassin, Dr. Web!). Bleiben noch 875 MB für Apache httpd Prozesse und MySQL.
Angenommen du benötigst 50 httpd Prozesse (MaxClients), dann wären das (5 + 50) * 15 MB ~ 825 MB RAM. Deine /etc/httpd/conf/httpd.conf oder /etc/apache2/server-tuning.conf
könnte dann so aussehen.
Code:
<IfModule prefork.c>
StartServers 5
MinSpareServers 5 httpd Prozesse
MaxSpareServers 10
ServerLimit 50
MaxClients 50 httpd Prozesse maximal können 50 Seitenbesucher gleichzeitig bedient werden
MaxRequestsPerChild 8000
<IfModule>
5 + 50 = 55 httpd Prozesse a ~ 15 MB
4.
Für MySQL blieben dann noch ~ 50 MB RAM übrig (1000 MB - 125 MB - 825 MB = 50 MB). Auch hierzu ein Beispiel für die /etc/my.cnf
Code:
[mysqld]
key_buffer = 15M
net_buffer_length = 8K
sort_buffer_size = 32K
myisam_sort_buffer_size = 32K
read_buffer_size = 16K
read_rnd_buffer_size = 32K
join_buffer_size = 512K
query_cache_size = 4M
thread_cache = 32
table_cache = 512
max_allowed_packet = 256K
max_connections = 50 Verhältnis MaxClients zu max_connections ist hier 1:1
low_priority_updates = 1
long_query_time = 2
diese Konfiguration benötigt ~ 41 MB RAM. Nun Tuning Primer Script laufen lassen und
Code:
Configured Max Memory Limit : 50 M
kontrollieren. Wir wollen MySQL ja maximal 50 MB zur Verfügung stellen. Resultierend aus max_connections und den buffers/caches darf
Configured Max Memory Limit nicht höher als 50 M sein! Liegen wir über 50 M müssen die buffers von MySQL kleiner gemacht werden. Oder man weist MySQL mehr RAM zu und Apache bekommt weniger. Dann veringern sich natürlch bei Apache die MaxClients, also die Anzahl der möglichen httpd Prozesse.
Das Verhältnis MaxClients (Apache) zu max_connections (MySQL) kann 1:1 oder 2:1 oder 3:1 sein. MaxClients = 50 entspricht bei einem Verhältnis von 2:1 max_connections = 25
5.
alle nicht benötigten Apache Module mit
# ausklammern damit diese nicht mehr beim Start von Apache geladen werden und Resourcen verbrauchen.
Apache 2.2 Modules Apache 1.3 Modules
Apache Module die man i.d. Regel ausklammern kann.
Code:
#auth_anon_module
auth_dbm_module
include_module
mime_magic_module
expires_module
usertrack_module
status_module
autoindex_module
negotation_module
spelling_module
userdir_module
proxy_module
proxy_ftp_module
proxy_http_module
proxy_connect_module
frontpage_module
jedes Module einzeln ausklammern und danach Apache neu starten. Kommt es zur Fehlermeldung, ausklammern rückgängig machen.
Weiteres Konfigurationsbeispiel gibt es hier