Hilfe bei Server-Optimierung (apache,mysql)

sky2high

New Member
Hallo. Ich betreibe ein Projekt, wo zu Spitzenzeiten auch schon mal 500 Leute gleichzeitig online sind. (zu Normalzeiten sind 100+ üblich) Überwiegend werden mySQL Select und Insexrt Befehle durchgeführt. Das ganze läuft auf einem VServer mit 512 MB Ram (garantiert) und 1 GB dynamisch, 30 GB HDD, 2 TB Traffic. Auf dem vServer läuft nur Apache, mySQL, ein Teamspeak Server und Plesk ist ausgeschaltet.

Dauernd Probleme mit heftigen Lags der Seite, letztens MaxClients war auf 75 in server-tuning und war zuwenig habe es dann auf 100 erhöht nun ist erstmal Ruhe. Jetzt eben war die Seite down wegen "Too many Connections", ich denke das ist von mySQL oder?

tuning-primer für mysql ist schon installiert, habe auch schon versucht es in bisschen zu optimieren aber kann den Server nicht so oft neustarten.

Könnt ihr mir mal Configs für meine Situation schicken? Also my.cnf und server-tuning? Wäre sehr sehr nett.

my.cnf Ausschnit

Code:
# Here follows entries for some specific programs

# The MySQL server
[mysqld]
set-variable=local-infile=0
port            = 3306
socket          = /var/lib/mysql/mysql.sock
skip-locking
key_buffer = 4M
max_allowed_packet = 1M
table_cache = 1024
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 2M
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M

max_connections = 50
long_query_time = 2
thread_cache_size = 16M



top
Code:
top - 21:36:27 up 9 min,  1 user,  load average: 0.83, 0.64, 0.33
Tasks:  75 total,   2 running,  73 sleeping,   0 stopped,   0 zombie
Cpu(s): 28.0% us, 21.9% sy,  0.0% ni, 50.2% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:   4136988k total,  3815668k used,   321320k free,   108324k buffers
Swap:  8193140k total,     7548k used,  8185592k free,  1533272k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
12210 mysql     15   0  108m  11m 4152 S   74  0.3   3:00.52 mysqld
13853 wwwrun    15   0 60408  10m 2952 S    1  0.3   0:00.06 httpd2-prefork
13843 wwwrun    16   0 60396  10m 2952 R    1  0.3   0:00.03 httpd2-prefork
13740 wwwrun    15   0 60364  10m 2956 S    1  0.3   0:00.05 httpd2-prefork
13771 wwwrun    15   0 60444  10m 2956 S    1  0.3   0:00.04 httpd2-prefork
13857 wwwrun    16   0 60464  10m 2952 S    1  0.3   0:00.04 httpd2-prefork
13859 wwwrun    15   0 60388  10m 2948 S    1  0.3   0:00.05 httpd2-prefork
13868 wwwrun    15   0 60432  10m 2952 S    1  0.3   0:00.03 httpd2-prefork
13894 wwwrun    15   0 60408  10m 2952 S    1  0.3   0:00.04 httpd2-prefork
13925 root      16   0  2108 1104  832 R    1  0.0   0:00.06 top
11588 ts        34  19  105m 2056 1404 S    0  0.0   0:10.39 server_linux
13508 wwwrun    15   0 60364  10m 2956 S    0  0.3   0:00.09 httpd2-prefork
13836 wwwrun    15   0 60404  10m 2956 S    0  0.3   0:00.05 httpd2-prefork
13854 wwwrun    15   0 60408  10m 2956 S    0  0.3   0:00.05 httpd2-prefork
13893 wwwrun    15   0 60396  10m 2956 S    0  0.3   0:00.02 httpd2-prefork
13964 wwwrun    16   0 60408  10m 2944 S    0  0.3   0:00.01 httpd2-prefork
    1 root      16   0   640  284  248 S    0  0.0   0:00.00 init
 9873 messageb  16   0  3356  928  732 S    0  0.0   0:00.01 dbus-daemon
 9891 root      16   0  3108 1460 1172 S    0  0.0   0:00.01 hald
10184 root      16   0  1512  608  504 S    0  0.0   0:00.00 syslogd
10190 nobody    18   0  1476  400  324 S    0  0.0   0:00.00 portmap
10214 root      21   0  2968  740  568 S    0  0.0   0:00.00 couriertcpd
10216 root      23   0  2744  704  552 S    0  0.0   0:00.00 courierlogger
10225 root      24   0  2968  740  568 S    0  0.0   0:00.00 couriertcpd
10227 root      25   0  2744  704  552 S    0  0.0   0:00.00 courierlogger
10234 root      18   0  2968  740  568 S    0  0.0   0:00.00 couriertcpd
10236 root      18   0  2740  700  552 S    0  0.0   0:00.00 courierlogger
11268 root      25   0  2968  740  568 S    0  0.0   0:00.00 couriertcpd
11270 root      25   0  2744  704  552 S    0  0.0   0:00.00 courierlogger
11291 root      34  19 70824  16m 6752 S    0  0.4   0:13.69 zmd
11299 root      16   0  4856 1292  928 S    0  0.0   0:00.07 sshd
11305 root      16   0  2144  884  720 S    0  0.0   0:00.00 xinetd
11330 root      16   0  1728  696  572 S    0  0.0   0:00.00 cron
12045 root      16   0 60108  13m 6764 S    0  0.3   0:00.58 httpd2-prefork
12048 wwwrun    16   0 60072 8880 1652 S    0  0.2   0:00.00 httpd2-prefork
12113 wwwrun    15   0 60404  10m 2956 S    0  0.3   0:00.08 httpd2-prefork
12155 root      17   0  2452 1212  980 S    0  0.0   0:00.01 mysqld_safe
13356 wwwrun    15   0 60348  10m 2956 S    0  0.3   0:00.06 httpd2-prefork
13371 wwwrun    15   0 60404  10m 2956 S    0  0.3   0:00.07 httpd2-prefork
13394 wwwrun    16   0 60340  10m 2900 S    0  0.3   0:00.07 httpd2-prefork
13503 wwwrun    15   0 60348  10m 2900 S    0  0.3   0:00.04 httpd2-prefork
13512 wwwrun    16   0 60404  10m 2956 S    0  0.3   0:00.04 httpd2-prefork
13630 wwwrun    15   0 60404  10m 2956 S    0  0.3   0:00.05 httpd2-prefork
13631 wwwrun    15   0 60364  10m 2956 S    0  0.3   0:00.05 httpd2-prefork
13633 wwwrun    15   0 60340  10m 2896 S    0  0.3   0:00.03 httpd2-prefork
13635 wwwrun    15   0 60408  10m 2996 S    0  0.3   0:00.03 httpd2-prefork
13690 wwwrun    15   0 60420  10m 2952 S    0  0.3   0:00.05 httpd2-prefork
13695 wwwrun    15   0 60340  10m 2896 S    0  0.3   0:00.03 httpd2-prefork
13700 wwwrun    15   0 60340  10m 2896 S    0  0.3   0:00.04 httpd2-prefork
13714 wwwrun    15   0 60372  10m 2956 S    0  0.3   0:00.06 httpd2-prefork
13738 wwwrun    15   0 60364  10m 2956 S    0  0.3   0:00.07 httpd2-prefork
13768 wwwrun    15   0 60404  10m 2956 S    0  0.3   0:00.03 httpd2-prefork
13776 wwwrun    15   0 60396  10m 2992 S    0  0.3   0:00.04 httpd2-prefork
 
Wenn der Fehler "Too many Connections" von MySQL ist, würde ich den Wert max_connections in der my.cnf mal verdoppeln und mysqld die my.cnf neu laden lassen.
Code:
/etc/init.d/mysql force-reload
 
Dein mysqld belegt gerade 74% der CPU und hat in den 9 Minuten seit dem Restart des Servers insgesamt schon 3 CPU-Minuten verbraucht. Da dürfte ein SQL-Tuning nötig sein. Ich würde mal log-slow-queries aktivieren und die dann im Logfile ausgegebenen Queries mit explain analysieren und tunen. Vermutlich fehlen da einige Indizes.
 
512 MB RAM sind garantiert, 1 GB dynamisch (wenn vorhanden).

Linux, Mailserver verbrauchen auch RAM der berücksichtigt werden muß. Von den 500 MB ziehen wir mal pauschal ~ 100 MB ab. Bleiben für Apache und MySQL noch 400 MB.

MySQL geben wir ~ 40 MB RAM. Für Apache bleiben dann noch 360 MB RAM. Diese teilen wir durch 12 MB und erhalten die Anzahl der Max Clients. (Erfahrungswerte)

server-tuning.conf
Code:
Timeout 30
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2

<IfModule prefork.c>
StartServers       1
MinSpareServers    1
MaxSpareServers    2
ServerLimit       30
MaxClients        30
MaxRequestsPerChild  4000
</IfModule>

HostnameLookups off

my.cnf
Code:
[mysqld]

key_buffer = 8M
net_buffer_length = 1K

sort_buffer_size = 32K
myisam_sort_buffer_size = 32K
read_buffer_size = 16K
read_rnd_buffer_size = 32K
join_buffer_size = 1M

query_cache_size = 4M
thread_cache = 16
table_cache = 512
max_allowed_packet = 256K

max_connections = 30
low_priority_updates = 1
long_query_time = 2

Danach Apache u. MySQL neu starten und Tuning-Primer Script laufen lassen.
Code:
MEMORY USAGE
Max Memory Ever Allocated : 9 M
Configured Max Per-thread Buffers : 26 M
Configured Max Global Buffers : 4 M
[COLOR="Blue"]Configured Max Memory Limit : 40 M[/COLOR]
Total System Memory : 10 G
Egal wie deine Variables in der my.cnf sind, Max Memory Limit sollte nicht höher sein als 40 MB.

@Dynamischer RAM

Die Frage ist halt wieviel von den bis zu 1GB RAM man tatsächlich immer zur Verfügung hat. Was wäre denn realistisch? 10%, 25%? Wenn 4 vServer auf der Maschine laufen würden, würde ich sagen, 25% wären realistisch.

25% von 1000 MB sind 250 MB RAM. Versuchsweise könnten wir also den RAM neu verteilen. 500 + 250 = 750 MB RAM. 100 ziehen wir pauschal ab. Bleiben 650 MB RAM. 25 - 40 davon wollen wir MySQL zuweisen. 650 - 25 = 625 MB RAM.

Jeder httpd Prozess (siehe auch 'Top') benötigt ~ 12 - 15 MB RAM. 625 : 12,5 MB = 50 httpd Prozesse, also MaxClients 50. Neue server-tuning.conf könnte also (testweise) so aussehen
Code:
<IfModule prefork.c>
StartServers       1
MinSpareServers    1
MaxSpareServers    2
ServerLimit       50
[COLOR="Blue"]MaxClients        50[/COLOR]
MaxRequestsPerChild  4000
</IfModule>

In der my.cnf passen wir die max_connections den 50 von MaxClients an, also
Code:
[mysqld]

key_buffer = 4M
net_buffer_length = 1K

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 = 2M
thread_cache = 16
table_cache = 512
max_allowed_packet = 256K

[COLOR="Blue"]max_connections = 50[/COLOR]
low_priority_updates = 1
long_query_time = 2
Tuning-Primer Script laufen lassen. Max Memory Limit sollte nicht höher als ~ 35 MB sein.
Code:
MEMORY USAGE
Max Memory Ever Allocated : 9 M
Configured Max Per-thread Buffers : 26 M
Configured Max Global Buffers : 4 M
[COLOR="Blue"]Configured Max Memory Limit : 35 M[/COLOR]
Total System Memory : 10 G
 
Last edited by a moderator:
In der my.cnf passen wir die max_connections den 50 von MaxClients an
Das halte ich für eine Fehlkalkulation.
Denn bei aktuellen Inhalten stehen echte Scripte gegen sonstige Mediendateien im Verhältnis von 1:3 und aufwärts. (Kann jeder in seiner eignen Log-Statistik nachschauen.)
Daher braucht es nicht genauso viele max_connections wie Apache-Threads.

huschi.
 
kann das jemand bestätigen?
Huschi hat seine Aussage doch sogar begründet:confused:Ausnahme ist eine Apache/PHP Kombination die eine persistente Datenbankanbindung benutzt. Wenn Webserver und Datenbankserver auf der gleichen Kiste laufen ist das aber normalerwesie nicht der Fall.
 
Massenhosting-Server (~300 Domains):
MaxClients = 150 ; max_connections = 50 ; max_used_connections = 17

Agentur-Server mit überwiegend Typo3 auf rund 50 Domains:
MaxClients = 100 ; max_connections = 50 ; max_used_connections = 27

Server mit reiner Perl-Applikation (nur eine Domain):
MaxClients = 100 ; max_connections = 50 ; max_used_connections = 35

Mein Server (~30 Domains mit PHP-/Perl-Scripte, Typo3, Joomla):
MaxClients = 100 ; max_connections = 40 ; max_used_connections = 40
(Upps, aber nur max_connect_errors=10 bei über 300 Tagen uptime.)
---

Aber im Grunde liegt es einfach auf der Hand. Sowohl IE als auch Firefox (siehe network.http.max-connections) machen mehrere Connections gleichzeitig auf um eine Seite und deren Inhalte so schnell wie möglich zu laden. D.h. nicht jeder Request greift auf ein Script zu. Wie viele es nun wirklich tun, darüber gibt es keine Statistik und hängt viel von Zufall und der unberechenbaren Nutzung von Keepalive ab.
Aber auf keinen Fall sollte man von einem 1:1 ausgehen.

huschi.
 
Verhältnis ist also 1:2.5 +

Aber warum hab ich dann MaxClients 20 und max_connections = 9? Das wäre ein Verhältnis von 1:2
 
Last edited by a moderator:
Verhältnis ist also 1:2.5 +
Du darfst hierbei niemals von einem festen Verhältnis ausgehen. Denn wenn ich z.B. meine huschi.net mit einer Bildergalerie vergleiche, habe ich direkt komplett andere Verhältnisse.

Das einzige was ich hier sagen will, ist das 1:1 auf jedenfall Falsch ist und man Speicher verschleudert, wenn man MySQL.max_connections = Apache.MaxClients setzt.

huschi.
 
Back
Top