Es kracht jedes mal...

foo

New Member
Hi,
ich betreibe eine Community nutze die Forensoftware von Woltlab und habe im schnitt 1000 Nutzer online, wobei an Wochenenden die Nutzerzahl bis auf 5000-8000 steigt und das Board bzw. der Server jedes mal in die Knie geht.

Suche schon Monate nach Optimierungstipps etc. aber irgendwie will das alles nicht.

Hier meine Server Angaben:
AMD Athlon™ DualCore
1.024 MB DDR2-RAM
160 GB SATA HDD


Apache2 Config:

Code:
Timeout 30
KeepAlive Off
MaxKeepAliveRequests 1000
KeepAliveTimeout 2
    StartServers          1
    MinSpareServers       1
    MaxSpareServers      2
    MaxClients          250
    MaxRequestsPerChild   10000


mySQL Config:

Code:
skip-external-locking
key_buffer              = 24M
max_allowed_packet      = 24M
thread_stack            = 128K
thread_cache_size       = 8
max_connections        = 1000
table_cache            = 512
query_cache_limit       = 1M
query_cache_size        = 16M
skip-bdb
[mysqldump]
quick
quote-names
max_allowed_packet      = 16M
[isamchk]
key_buffer              = 16M



Tuning-Primer.sh output:

Code:
SLOW QUERIES
Current long_query_time = 10 sec.
You have 9 out of 4637573 that take longer than 10 sec. to complete
The slow query log is NOT enabled.
Your long_query_time may be too high, I typically set this under 5 sec.

WORKER THREADS
Current thread_cache_size = 8
Current threads_cached = 5
Current threads_per_sec = 0
Historic threads_per_sec = 0
Your thread_cache_size is fine

MAX CONNECTIONS
Current max_connections = 1000
Current threads_connected = 3
Historic max_used_connections = 34
The number of used connections is 3% of the configured maximum.
You are using less than 10% of your configured max_connections.
Lowering max_connections could help to avoid an over-allocation of memory
See "MEMORY USAGE" section to make sure you are not over-allocating

MEMORY USAGE
Max Memory Ever Allocated : 139 M
Configured Max Per-thread Buffers : 2 G
Configured Max Global Buffers : 50 M
Configured Max Memory Limit : 2 G
Total System Memory : 1.91 G

Max memory limit exceeds 85% of total system memory

KEY BUFFER
Current MyISAM index space = 51 M
Current key_buffer_size = 24 M
Key cache miss rate is 1 : 3946
Key buffer fill ratio = 100.00 %
You could increase key_buffer_size
It is safe to raise this up to 1/4 of total system memory;
assuming this is a dedicated database server.

QUERY CACHE
Query cache is enabled
Current query_cache_size = 16 M
Current query_cache_used = 3 M
Current query_cach_limit = 1 M
Current Query cache fill ratio = 24.24 %
Your query_cache_size seems to be too high.
Perhaps you can use these resources elsewhere
MySQL won't cache query results that are larger than query_cache_limit in size

SORT OPERATIONS
Current sort_buffer_size = 2 M
Current record/read_rnd_buffer_size = 256 K
Sort buffer seems to be fine

JOINS
Current join_buffer_size = 132.00 K
You have had 14 queries where a join could not use an index properly
You should enable "log-queries-not-using-indexes"
Then look for non indexed joins in the slow query log.
If you are unable to optimize your queries you may want to increase your
join_buffer_size to accommodate larger joins in one pass.

Note! This script will still suggest raising the join_buffer_size when
ANY joins not using indexes are found.

OPEN FILES LIMIT
Current open_files_limit = 5000 files
The open_files_limit should typically be set to at least 2x-3x
that of table_cache if you have heavy MyISAM usage.
Your open_files_limit value seems to be fine

TABLE CACHE
Current table_cache value = 512 tables
You have a total of 303 tables
You have 447 open tables.
The table_cache value seems to be fine

TEMP TABLES
Current max_heap_table_size = 16 M
Current tmp_table_size = 32 M
Of 33480 temp tables, 5% were created on disk
Effective in-memory tmp_table_size is limited to max_heap_table_size.
Created disk tmp tables ratio seems fine

TABLE SCANS
Current read_buffer_size = 128 K
Current table scan ratio = 2559 : 1
read_buffer_size seems to be fine

TABLE LOCKING
Current Lock Wait ratio = 1 : 38
You may benefit from selective use of InnoDB.
If you have long running SELECT's against MyISAM tables and perform
frequent updates consider setting 'low_priority_updates=1'
If you have a high concurrentcy of inserts on Dynamic row-length tables
consider setting 'concurrent_insert=2'.


ich bedanke mich für jede Hilfe schonmal im voraus, und hoffe endlich eine Lösung zu finden.


gruss
 
Code:
MEMORY USAGE
Max Memory Ever Allocated : 139 M
Configured Max Per-thread Buffers : 2 G
Configured Max Global Buffers : 50 M
Configured Max Memory Limit : 2 G
Total System Memory : 1.91 G

Max memory limit exceeds 85% of total system memory

Das sieht nicht so toll aus. Wie sieht denn die Speichernutzung aus? Swappt die Kiste denn an den Wochenenden? Lass während einer solchen "langsamen" Zeit mal ein paar Minuten ein "vmstat 10" mitlaufen.
 
... habe im schnitt 1000 Nutzer online, wobei an Wochenenden die Nutzerzahl bis auf 5000-8000 steigt ...
Apache2 Config:
Code:
Timeout 30
KeepAlive Off
MaxKeepAliveRequests 1000
KeepAliveTimeout 2
    StartServers          1
    MinSpareServers       1
    MaxSpareServers      2
    MaxClients          250
    MaxRequestsPerChild   10000

Mindestens 1000 User gleichzeitig und du solche Werte? :eek:
Das ist eine nette Apache Config für Schwache Server, du brauchst aber Leistung. ;)

Code:
StartServers          10
MinSpareServers       10
MaxSpareServers      20

Wenn man den Ram mal grob überschlägt 50% Apache, 50% MySQL bleiben bei 1GB Ram ca. 40 Server-Prozesse (ca. 12-15MB Ram pro Prozess) übrig. Da man auch noch bisschen Ram für anderen Kram brauch also bisschen weniger.
Code:
ServerLimit             35
MaxClients              35
 
@Firewire2002

Am Wochenende sind sogar 5000-8000 User gleichzeitig online...

Mit deiner Config die du vorgeschlagen hast frisst der Server irgendwie vielmehr Speicher ... hm
 
Ach oh wunder, ein stark frequentierter Server braucht mehr Speicher als ein ressourcenschonender Server für 2 User am Tag. :mad:
Ein Apache der Leistung bringen muss, muss auch entsprechend Konfiguriert werden. Da ist nicht mehr mit Speicher sparen. Da heißts dann den Ram an die richtigen Stellen zu "stopfen".

Eine nützlichere Aussage wäre, ob er damit performanter läuft als mit der alten Config.
 
Ach oh wunder, ein stark frequentierter Server braucht mehr Speicher als ein ressourcenschonender Server für 2 User am Tag. :mad:
Ein Apache der Leistung bringen muss, muss auch entsprechend Konfiguriert werden. Da ist nicht mehr mit Speicher sparen. Da heißts dann den Ram an die richtigen Stellen zu "stopfen".

Eine nützlichere Aussage wäre, ob er damit performanter läuft als mit der alten Config.

Wieviel Ram bräuchte mein Server um ca. 8000 user gleichzeitig zu bedienen mit der o.g Forensoftware ohne jedesmal abzustürtzen?

Und würde dann deine vorgeschlagene Konfiguration passen?
 
Last edited by a moderator:
Wieviel Ram bräuchte mein Server um ca. 8000 user gleichzeitig zu bedienen mit der o.g Forensoftware ohne jedesmal abzustürtzen?
Bei 8000 Usern gleichzeitig und wenn der Server die Datenbank selber fahren muss (Bei stark belasteten Systemen verteilt man die Last von Web- und DB-Server besser auf 2 Maschinen, die mit GBit-Eth verbunden sind) würde ich sagen: As much as possible.

Mal eine (Milchmädchen-)Rechnung:
8000 User - Wenn davon 2% simultan klicken, dann macht das 160 konkurrierende Requests.
Angenommen dein Forensystem braucht pro Instanz etwa 20MB (Fantasiewert - den echten Wert müsstest du ermitteln), dann sind das 3,2GB - Nur auf dem Webserver.
Der MySQL kommt nochmal dazu. Und der will jede Menge Speicher zum Cachen von Indizes und Table-Pages. Das Fatale ist, wenn er den nicht bekommt. Dann steigt die I/O-Last, was wiederum die Ausführung der Applikation verlangsamt, was wiederum die Parallelität der Zugriffe steigert, was wiederum den Speicherverbrauch... Du siehst, wohin das führt.

Für dein 8000User-Szenario würde ich 8GB oder mehr empfehlen.
 
Mal eine (Milchmädchen-)Rechnung:
8000 User - Wenn davon 2% simultan klicken, dann macht das 160 konkurrierende Requests.

Was heisst eigentlich "8000 User gleichzeitig online"? Heisst das, daß 8000 angemeldete User in der letzten Stunde mindestens ein Klick gemacht haben?
Interessanter wären die Hits im Webserver

Angenommen dein Forensystem braucht pro Instanz etwa 20MB (Fantasiewert - den echten Wert müsstest du ermitteln), dann sind das 3,2GB - Nur auf dem Webserver.

Mir ist schon desöfteren aufgefallen, daß hier mit 20 MB pro Apache-Prozess gerechnet wird. Wie kommt ihr auf diesen Wert? Wenn man von Linux als Betriebssystem ausgeht, werden beim fork() keine Dateien im RAM kopiert, sondern der neue Prozess bekommt physikalisch Speicher nach dem COW (copy on write) Prinzip zugewiesen; d.h nur wenn der Prozess Dateien in seinem Adressraum ändert, wird dafür echter Speicher benutzt. Das heißt aber auch, es ist egal, wieviele Module geladen sind, sie liegen nur physikalisch nur einmal im Speicher und werden dort von allen Apache-Prozessen parallel genutzt.

top zeigt in dieser Hinsicht keine verlässlichen Daten an. Damit ist aus meiner Sicht die Rechnung "15-20 MB pro httpd-Prozess" völliger Humbug.



Der MySQL kommt nochmal dazu. Und der will jede Menge Speicher zum Cachen von Indizes und Table-Pages. Das Fatale ist, wenn er den nicht bekommt. Dann steigt die I/O-Last, was wiederum die Ausführung der Applikation verlangsamt, was wiederum die Parallelität der Zugriffe steigert, was wiederum den Speicherverbrauch... Du siehst, wohin das führt.

Für dein 8000User-Szenario würde ich 8GB oder mehr empfehlen.

2 Gigabyte dürften bequem reichen, die eine Hälfte für mysql und die andere für Apache und Betriebssystem. Man muss das ganze dann halt richtig konfigurieren.
 
Mir ist schon desöfteren aufgefallen, daß hier mit 20 MB pro Apache-Prozess gerechnet wird.
Bei dem besprochenen Speicherbedarf geht es nicht um den Apache, sondern die Instanz der Web-Applikation.
Applikationen haben die Eingenschaft, Daten zu verarbeiten (Objekte, Variablen, Ergebnismengen aus Datenbank-Abfragen u.s.w.) - und zwar nicht gerade wenig. Dazu kommt, dass beim Arbeiten mit diesen Daten, diese oft im Speicher kopiert werden. Da summiert sich teilw. ordentlich was auf.
Und diese Daten sind für jeden Thread einzigartig. Also belegt auch jeder Thread diesen Speicher ganz für sich alleine.

Unter 8000 gleichzeitigen Usern verstehe ich, dass zu einem Zeitpunkt 8000 Leute die Page nutzen. Wenn jeder 50. von denen quasi gleichzeitig Klickt (so, dass die Prozesse, die die Requests bearbeiten sich die Ressourcen teilen müssen), dann sind 2GB nicht gerade der Hit.
So viele User erzeugen auch entsprechend viele Einträge in der Datenbank, was Indizes und Tabellen anwachsen lässt. Man dimensioniert IT-Systeme immer auf erwarteten Zuwach und nicht auf Status Quo.

Die 8GB waren vieleicht etwas hoch und 4GB würden es auch tun - wenn der ganze Kram aber aus dem RAM laufen kann und nur Writes die Platte treffen, dann kann man auch mit top Performance rechnen. Und RAM ist nicht so teuer. (Man muss das mit der Größe der Community in Relation setzen. Wenn 8000 User parallel online sind, dann sollte man das dem Server gönnen können.)
 
Last edited by a moderator:
Die 8GB waren vieleicht etwas hoch und 4GB würden es auch tun - wenn der ganze Kram aber aus dem RAM laufen kann und nur Writes die Platte treffen, dann kann man auch mit top Performance rechnen. Und RAM ist nicht so teuer. (Man muss das mit der Größe der Community in Relation setzen. Wenn 8000 User parallel online sind, dann sollte man das dem Server gönnen können.)

Erstmal danke für die inforeichen Antworten.

Nehmen wir an ich würde mir jetzt einen Server mit 4GB ram zulegen, wie müsste dann meine apache2.conf und my.cnf Konfiguration aussehen?

Das z.B wie du sagst nur oder fast nur Writes die Platte treffen würden?

Habe schon einige Apache-Tuning Seiten gefunden, aber viele sind oft sehr unterschiedlich und das lässt mich oft zweifeln ob ich das richtige mache.
 
Unter 8000 gleichzeitigen Usern verstehe ich, dass zu einem Zeitpunkt 8000 Leute die Page nutzen.

Kannst du das ein bisschen genauer formulieren? HTTP ist nicht zustandsbehaftet (Sessions sind nur Krücken), da gibt es keine gleichzeitige Nutzung, sondern nur X Requests pro Zeiteinheit.

Im Extremfall kann mit 8000 Leuten, die diese Seiten nutzen, davon ausgehen, daß alle gleichzeitig einen oder mehrere HTTP-Requests auf diese Seite machen. Es kann aber auch sein, daß diese 8000 innerhalb von 30 Minuten einen oder mehrere Requests durchführen. Und das macht schon einen ordentlichen Unterschied im Sizing aus.
 
foo sollte das können.

also ich hab das noch nie genau gemessen, aber das Forum ist so eingestellt dann wenn ein User innerhalb 15min. kein Request mehr macht er als inaktiv bzw. offline gilt.

Und da oft permanent ca. 2std. um die 8000 User online angezeigt werden, müssten ja mindestens 8000 Requests alle 15min. gemacht werden.

Keine Ahnung ob das wirklich weiterhilft, aber wenn ihr mir sagen koennt wie ich genauer die Requests messen kann mache ich das auf jedenfall.
 
Jeder Request erzeugt eine Zeile im access_log mit Zeitstempel.
Eine Zeitspanne in Verbindung mit der Zeilenzahl im access_log ergibt die tatsächlichen Requests.
 
Hallo!
Bitte nicht dem Irrglaube verfallen, eine Foren Software könne auch nur annähernd exakte Angaben zu simultanen Benutzern machen! Das sind alles nur errechnete Durchschnittswerte der letzten 1, 5, 10 oder 15 Minuten. Nutze Apache's mod_status um herauszufinden, wie viele Anfragen pro Sekunde oder Minute wirklich verarbeitet werden müssen.

mfG
Thorsten
 
1. würde ich
Code:
KeepAlive On
KeepAliveTimeout 2
stellen

2. solltest du die httpd2 prefork Prozesse ermitteln, also wieviele Prozesse und RAM Belegung eines Prozesses.
Code:
ps -ylC httpd --sort:rss
oder
Code:
ps axu --sort:command
RSS ist der Wert in KB

3. bei 1GB RAM kann Apache ~ 40 - 50 MaxClients haben, sonst geht der RAM aus.

4. würde ich
Code:
<IfModule prefork.c>
StartServers       1
MinSpareServers    5
MaxSpareServers    10
ServerLimit       40
MaxClients        40
MaxRequestsPerChild  4000

5. 50 x 15 MB = 750 MB RAM, da würde ich MySQL ~ 100 MB zuweisen.

Die caches + buffers in der my.cnf müssen so klein sein, daß bei max_connections = 40 die
Code:
Configured Max Memory Limit : 100 MB
nicht überschritten werden.

Hier eine Beispielkonfiguration

teste mal o.ä.
Code:
[mysqld]

key_buffer = 32M
net_buffer_length = 8K

sort_buffer_size = 128K
myisam_sort_buffer_size = 128K
read_buffer_size = 128K
read_rnd_buffer_size = 128K
join_buffer_size = 1M

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

max_connections = 40
low_priority_updates = 1
concurrent_insert = 2
long_query_time = 2

entscheidend sind die gleichzeitigen Klicks auf einen Link und nicht die Anzahl der User im Forum! Viel mehr als 40 Klicks hält dein Server aber nicht aus.
 
Last edited by a moderator:
hi,

habe mir jetzt gedaken gemacht, und werde mir einen 2ten Server anlegen der nur als Webserver dient.

Dann habe ich einen Server mit 1gb ram als Mysql-Server und ein Server mit 3gb ram als Webserver.

Was sollte ich bei so einer Serveraufteilung bei der my.cnf sowie apache2.conf beachten?
 
so rein intuitiv würde ich eher dem SQL-Server die 3 GB RAM gönnen, und dem Webserver die 1 GB. Tabellen und SQL Prozesse brauchen (je nach Struktur) deutlich mehr Platz im Ram als Apache Prozese und Disk Caches für mittelgroße Webauftritte.
Kann aber je nach Bedürfnissen anders aussehen. Bei stetig mehreren 100 simultanen Zugriffen würde dir natürlich der Apache mehr vom Ram profitieren, aber halt nur, wenn der ohne DB Backend auskommt. Statische Seiten sind heutzutage eher die Ausnahme, würde ich mal so sagen.
Auf meinem Server benötigt SQL jedenfalls mehr Ressourcen als der Apache.
 
Back
Top