Problem mit kmemsize

Okay, ich sehe gerade, dass mein MySQL-Server jetzt enorm auf der niedrigsten Performance fährt...
Musste zwangsweise das ganze wieder zurücksetzten.

Gibt es denn noch irgendwo eine Konfigurationsstelle oder bleibt mir hier nichts anderes übrig, außer einen höheren Server zu mieten?

MfG
Michael
 
die Frage ist immer wieviel gleichzeitge Verbindungen Apache bzw. MSQL handhaben soll. Je mehr gleichzeitge Verbindungenm desto mehr RAM wird benötigt.

Für wenig Geld bekommt man auch wenig Leistung (CPU + RAM). Du kannst optimieren und den RAM verteilen. Wenn das nicht hilft ist der Server zu klein dimensioniert.
 
Genau, das ist richtig, jedoch möchte ich das maximale aus meinem Server herausholen, gleichzeitig aber auch höchste Stabilität erreichen!

Um dieses Ziel zu erreichen ist nun meine Endkonfiguration:

Apache2-Conf:
Code:
<IfModule mpm_prefork_module>
    StartServers          1
    MinSpareServers       1
    MaxSpareServers       3
    MaxClients          100
    MaxRequestsPerChild   0
</IfModule>

MySQL-Conf:
Code:
# * Fine Tuning
#
key_buffer              = 2M
max_allowed_packet      = 16M
thread_stack            = 128K
thread_cache_size       = 8
#max_connections        = 100
table_cache             = 512
#open_files_limit       = 1024
#thread_concurrency     = 10
#
# * Query Cache Configuration
#
query_cache_limit       = 1M
query_cache_size        = 2M

TuningPrimer:
Code:
mysqld is alive

        -- MYSQL PERFORMANCE TUNING PRIMER --
             - By: Matthew Montgomery -

MySQL Version 5.0.32-Debian_7etch6-log i486

Uptime = 2 days 0 hrs 5 min 21 sec
Avg. qps = 0
Total Questions = 138941
Threads Connected = 1

Server has been running for over 48hrs.
It should be safe to follow these recommendations

To find out more information on how each of these
runtime variables effects performance visit:
http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html
Visit http://www.mysql.com/products/enterprise/advisors.html
for info about MySQL's Enterprise Monitoring and Advisory Service

SLOW QUERIES
The slow query log is NOT enabled.
Current long_query_time = 5 sec.
You have 0 out of 138962 that take longer than 5 sec. to complete
Your long_query_time seems to be fine

BINARY UPDATE LOG
The binary update log is enabled

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

MAX CONNECTIONS
Current max_connections = 100
Current threads_connected = 1
Historic max_used_connections = 29
The number of used connections is 29% of the configured maximum.
Your max_connections variable seems to be fine.

MEMORY USAGE
Max Memory Ever Allocated : 84 M
Configured Max Per-thread Buffers : 265 M
Configured Max Global Buffers : 6 M
Configured Max Memory Limit : 272 M
Physical Memory : 1.97 G
Max memory limit seem to be within acceptable norms

KEY BUFFER
Current MyISAM index space = 1 M
Current key_buffer_size = 2 M
Key cache miss rate is 1 : 367
Key buffer fill ratio = 3.00 %
Your key_buffer_size seems to be too high.
Perhaps you can use these resources elsewhere

QUERY CACHE
Query cache is enabled
Current query_cache_size = 2 M
Current query_cache_used = 1 M
Current query_cache_limit = 1 M
Current Query cache Memory fill ratio = 76.65 %
Current query_cache_min_res_unit = 4 K
MySQL won't cache query results that are larger than query_cache_limit in size

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

JOINS
Current join_buffer_size = 132.00 K
You have had 38 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 = 1134 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 704 tables
You have 512 open tables.
Current table_cache hit rate is 6%, while 100% of your table cache is in use
You should probably increase your table_cache

TEMP TABLES
Current max_heap_table_size = 16 M
Current tmp_table_size = 32 M
Of 6673 temp tables, 52% were created on disk
Effective in-memory tmp_table_size is limited to max_heap_table_size.
Perhaps you should increase your tmp_table_size and/or max_heap_table_size
to reduce the number of disk-based temporary tables
Note! BLOB and TEXT columns are not allow in memory tables.
If you are using these columns raising these values might not impact your
ratio of on disk temp tables.

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

TABLE LOCKING
Current Lock Wait ratio = 1 : 46
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 concurrency of inserts on Dynamic row-length tables
consider setting 'concurrent_insert=2'.

Hättet ihr noch einen Vorschlag um das ganze in eine noch bessere Balance zu bekommen?

MfG
Michael
 
Server ist dann gut konfiguriert, wenn er bei einer bestimmten Anzahl an gleichzeitigen Verbindungen zum Web- u. MySQL Server der vorhandene RAM nicht überschritten wird.

Nur dann kann für Stabilität grantiert werden!

Bei 100 gleichzeitigen Verbindungen zum MySQL Server (max_connection = 100) würde bei dir MySQL
Code:
MEMORY USAGE
Max Memory Ever Allocated : 84 M
Configured Max Per-thread Buffers : 265 M
Configured Max Global Buffers : 6 M
[COLOR="Red"]Configured Max Memory Limit : 272 M[/COLOR]
Physical Memory : 1.97 G
272 MB RAM verbrauchen. Du hast aber nur 256 MB RAM insgesammt wovon Apache und Linux ja auch noch RAM benötigen.

Darum geht man hin und sagt. Ok, lass uns schauen wieviel RAM der Server ohne MySQL verbraucht bei einer gleichzeitigen Verbindung (MaxClients = 1).

Dazu könnte man z.B. die MaxClients in der Apache Config auf 1 setzen und MySQL stoppen mit /etc/init.d/mysqld stop
Code:
<IfModule mpm_prefork_module>
    StartServers          1
    MinSpareServers       1
    MaxSpareServers       2
    ServerLimit        1
    MaxClients          1
    MaxRequestsPerChild   4000
</IfModule>

Apache stoppen mit service httpd stop und neu starten. Nun schaut man sich den RAM Verbrauch an und ermittelt mit
Code:
ps -ylC httpd --sort:rss
den RAM Verbrauch von einem httpd2 bzw. Apache2 Prozess. (RSS in Kilobyte). Jede Verbindung benötigt einen httpd2 Prozess!

Beispiel:

Angenommen der Server hat 256 MB RAM zur Verfügung. Bei einer gleichzeitigen Verbindung benötigt der Server (ohne MySQL) z.B. 150 MB RAM.

256 MB minus 150 MB = 100 MB RAM die wir für weitere Verbindungen zum Webserver (Apache) und MySQL zur Verfügung haben. Angenommen ein httpd2 bzw. Apache2 Prozess würde 12 MB benötigen. Dann könnte man ja sagen, 7 mal 12 MB = 84 MB RAM

100 MB minus 84 = 16 MB RAM

Diese 16 MB RAM hätten wir für MySQL übrig bei 7 gleichzeitigen Verbindungen. Nun gillt es MySQL so zu konfigurieren, daß MySQL maximal 16 MB verbraucht bei max_connections = 7 (RAM verbrauch kontrolliert man mit Tuning-Primer Script)

Dazu müssen die Werte für die Buffers, Caches, Connections in der my.cnf angepasst werden. Die Apache Config könnte dann so aussehen:
Code:
<IfModule mpm_prefork_module>
    StartServers          1
    MinSpareServers       1
    MaxSpareServers       2
    ServerLimit        7
    MaxClients          7
    MaxRequestsPerChild   4000
</IfModule>
und die my.cnf
Code:
[mysqld]

max_connections = 7
usw.

Der Server würde nun stabil bei 7 gleichzeitigen Verbindungen laufen. Würden mehr Leute auf die Webseite zugreifen wollen, müßten diese eben warten bis eine Verbindung frei wird. Damit Verbindungen möglichst schnell frei werden setzt man in der Apache Config den Wert für KeepAliveTimeout auf 2.
 
Last edited by a moderator:
Vielen Dank für die klasse Erklärung!

Ich habe das ganze nun eben mal ausprobiert und kann mich soweit nicht beschweren, allerdings kommt es sehr häufig vor, dass gleichzeitig mehr als 7 Connections zur gleichen Zeit aufgebaut werden.

Aber ich denke, man kann die max_connections leicht erhöhen, denn ich hab ja auch noch Dynamischen RAM kurzzeitig zu Spitzenzeiten zur Verfügung.

Das ganze sieht bei mir jetzt so aus, nebenbei noch eine kurze Erklärung meinerseits zu jedem einzelnen Schritt:

Die Apache2Config:
Code:
<IfModule mpm_prefork_module>
    StartServers          1
    MinSpareServers       1
    MaxSpareServers       3
    MaxClients            50
    MaxRequestsPerChild   4000
</IfModule>
Ich bin mir nicht ganz sicher, aber im Internet habe ich einige Hinweise gefunden, dass man ServerLimit nicht unbedingt setzten muss, dieser beschränkt anscheinend nur die MaxClients.
MaxClients steht bei mir nun auf 50 Anfragen, da mein Server zu Spitzenzeiten schon mal ca. 60 Anfragen schaffen musste, alle anderen müssen warten.
MaxRequestsPerChild = 4000?! Laut Huschi ist es im Vorteil, den Wert auf 0 zu setzen, aber lassen wir einfach den Child nach 4000 Requests refreshen.

MySQLConfig:
Code:
key_buffer              = 2M
max_allowed_packet      = 16M
thread_stack            = 128K
thread_cache_size       = 8
max_connections         = 50
table_cache             = 512
#open_files_limit       = 1024
#thread_concurrency     = 10
#
# * Query Cache Configuration
#
query_cache_limit       = 1M
query_cache_size        = 2M
Hier auch max_connections = 50.

TuningPrimer:
Code:
MEMORY USAGE
Max Memory Ever Allocated : 14 M
Configured Max Per-thread Buffers : 132 M
Configured Max Global Buffers : 6 M
Configured Max Memory Limit : 139 M
Physical Memory : 1.97 G
Max memory limit seem to be within acceptable norms

Die aktuelle Config sollte eigentlich noch im dynamischen Bereich sein...

Ich freue mich natürlich noch sehr auf eure Tipps um das ganze evtl. noch zu verfeiern, aber im Moment kann ich mich nicht beschweren, sehr schnelle Antworten vom Server und bisher hatte ich noch keine Stabilitätsprobleme!
Aber das wird sich im Laufe der Zeit zeigen, sonst muss natürlich noch etwas an der Config nachgebessert werden!

MfG
Michael
 
wenn keine Werte in der Konfiguration angegeben werden verwendet Apache bzw. MySQL Standardwerte. Standardwert für ServerLimit ist 150 und die Standardwerte von den MySQL Variablen haben wir hier.

Kannst ja mal einen Benchmark laufen lassen und deine Konfiguration testen.

Code:
ab -c50 -n100 http://deine_domain.de/index.php
c ist Anzahl der Verbindungen und n die Anzahl der Requets (MaxKeeppAliveRequests) pro Verbindung
Code:
 100%   2233 (longest request)
2233 Millisekunden sind 2,2 Sekunden
 
Last edited by a moderator:
Vielen Dank für dein Posting!

Ich hab jetzt gebencht bis mein Server in die Knie ging, hier die Ergebnisse:

Benchmark in Reihenfolge Nr. 1:
Code:
Benchmarking www.michis-homepage.net (be patient).....done


Server Software:        Apache/2.2.3
Server Hostname:        www.michis-homepage.net
Server Port:            80

Document Path:          /index.php
Document Length:        21034 bytes

Concurrency Level:      50
Time taken for tests:   19.836379 seconds
Complete requests:      100
Failed requests:        4
   (Connect: 0, Length: 4, Exceptions: 0)
Write errors:           0
Total transferred:      2115712 bytes
HTML transferred:       2092612 bytes
Requests per second:    5.04 [#/sec] (mean)
Time per request:       9918.189 [ms] (mean)
Time per request:       198.364 [ms] (mean, across all concurrent requests)
Transfer rate:          104.15 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0  291 295.4    187     600
Processing:   495 8475 4223.0   9718   15384
Waiting:        2 5187 2627.2   5852    9958
Total:        604 8766 4048.9   9718   15384

Percentage of the requests served within a certain time (ms)
  50%   9718
  66%  11123
  75%  12086
  80%  12700
  90%  13472
  95%  14693
  98%  15110
  99%  15384
 100%  15384 (longest request)

kmemsize failcnt: Anstieg von 600305 auf 600321 = 16 Differenz

Benchmark in Reihenfolge Nr. 2:
Code:
Benchmarking www.michis-homepage.net (be patient).....done


Server Software:        Apache/2.2.3
Server Hostname:        www.michis-homepage.net
Server Port:            80

Document Path:          /index.php
Document Length:        21034 bytes

Concurrency Level:      50
Time taken for tests:   19.807598 seconds
Complete requests:      100
Failed requests:        4
   (Connect: 0, Length: 4, Exceptions: 0)
Write errors:           0
Total transferred:      2130264 bytes
HTML transferred:       2106933 bytes
Requests per second:    5.05 [#/sec] (mean)
Time per request:       9903.799 [ms] (mean)
Time per request:       198.076 [ms] (mean, across all concurrent requests)
Transfer rate:          105.01 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   14  14.4      5      30
Processing:   426 8518 3924.7   9723   16779
Waiting:        2 5895 2664.6   7176    9444
Total:        445 8532 3914.9   9723   16779

Percentage of the requests served within a certain time (ms)
  50%   9723
  66%  10953
  75%  11661
  80%  12365
  90%  13013
  95%  13492
  98%  13981
  99%  16779
 100%  16779 (longest request)

kmemsize failcnt: Anstieg von 600321 auf 600336 = 15 Differenz

Und statt dessen er vllt. immer weniger Connections nach direkten Benchmarks nacheinander packt trifft nicht zu, was Benchmark Nr. 3 in Reihe beweißt:

Code:
Benchmarking www.michis-homepage.net (be patient).....done


Server Software:        Apache/2.2.3
Server Hostname:        www.michis-homepage.net
Server Port:            80

Document Path:          /index.php
Document Length:        21034 bytes

Concurrency Level:      50
Time taken for tests:   14.47871 seconds
Complete requests:      100
Failed requests:        40
   (Connect: 0, Length: 40, Exceptions: 0)
Write errors:           0
Total transferred:      1959418 bytes
HTML transferred:       1936318 bytes
Requests per second:    7.12 [#/sec] (mean)
Time per request:       7023.935 [ms] (mean)
Time per request:       140.479 [ms] (mean, across all concurrent requests)
Transfer rate:          136.18 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    9   9.8     12      24
Processing:   532 6166 3645.9   5821   14018
Waiting:       30 4382 2601.3   4352   10283
Total:        546 6176 3645.2   5840   14037

Percentage of the requests served within a certain time (ms)
  50%   5840
  66%   9344
  75%   9437
  80%   9669
  90%  10940
  95%  12120
  98%  13802
  99%  14037
 100%  14037 (longest request)

Allerdings fällt mir bis jetzt auf, dass er den RAM sehr langsam wieder freigibt wenn der Benchmark durchgelaufen ist, also das kann sein, dass es bis zu 30-60 Sekunden dauert, bis alles wieder auf grünem Level von der Auslastung ist.
Kann man da noch was konfigurieren?

MfG
Michael
 
Apache forked ja Kindsprozesse (Childs) für die 50 httpd Verbindungen. Beispiel:
Code:
<IfModule mpm_prefork_module>
    StartServers          1
    MinSpareServers       1
    MaxSpareServers       3
    MaxClients            50
    MaxRequestsPerChild   4000
</IfModule>

Beim Start von Apache wird ein httpd2 Prozess gestartet (StartServers). Dieser wiederum startet weitere Kindsprozesse (MaxCients). Je mehr Clients sich mit dem Server verbinden wollen, desto mehr Kindsprozesse werden geforked.

Dadurch steigt dann auch der RAM Verbrauch. Erst nach und nach werden überflüssige Kindsprozesse eleminiert und RAM wird wieder frei.

Apache MPM prefork

Bei MySQL ist es ähnlich da hier jede Verbindung zum MySQL Server einen eigenen sort_buffer und read_buffer hat.

@kmemsize failcnt

Failcount hat man ja immr wenn der RAM nicht ausreicht. Die 50 MacClients scheinen etwas zu viel zu sein. Kannst den Benchmark ja mal mit 40 Verbindungen laufen lassen.
Code:
ab -c40 -n100 http://www.blabla.com/index.php

Hab mir eben deine Homepage angeschaut. Hatte damals auch mit Freespace angefangen und meine ersten HTML Schritte getan. 2001 hatte ich dann meinen ersten eigenen Server in den USA bei Rackshak (heute ThePlanet.com) mit 1 GB RAM. Kostete damals ~ 200 DM/Monat.

Im Forum von Rackshak (nannten sich dann Ev1Servers.net und nun ThePlanet.com) hatte ich damals viel gelernt. Ein deutsches Server Support Forum gab es damals ja noch nicht und die Server in Deutschlang waren doppelt so teuer wie in den USA.

History
 
Last edited by a moderator:
Vielen Dank für die ausführliche Erklärung!

Da hast du allerdings recht, aber könnte man den RAM nicht schneller wieder frei geben, wenn man MaxRequestsPerChild auf 0 setzt, so wie Huschi das schon mal in einer Doku beschrieben hat?
Bzw. diese Option auf einen sehr sehr geringen Wert setzt, sodass die Childs sofort sterben, wenn meine neuen Request mehr reinkommen.

Vielen Dank auch für deinen Forum-Tipp, da werd ich mich direkt auch mal dran richten, wenn es wieder Probleme geben sollte.

Richtig, vielleicht hast du in meiner Homepage History auch schon gelesen, dass diese früher mehrmals auf Freespace gehostet wurde, aber diese hatten immer wieder längere Downtimes und manche gab es nach einiger Zeit einfach nicht mehr und zudem hat mich das ganze Servertechnisch einfach immer mehr interessiert und wollte deshalb auch immer mehr Systemrechte, bis ich mir dann meinen eigenen Server geholt habe.

Auch wenn dein Server in den Staaten steht, passen die Ping-Zeiten?

Das Ergebnis des Benchmarks mit 40 Verbindungen:

Code:
Benchmarking www.michis-homepage.net (be patient).....done


Server Software:        Apache/2.2.3
Server Hostname:        www.michis-homepage.net
Server Port:            80

Document Path:          /index.php
Document Length:        20986 bytes

Concurrency Level:      40
Time taken for tests:   20.928964 seconds
Complete requests:      100
Failed requests:        35
   (Connect: 0, Length: 35, Exceptions: 0)
Write errors:           0
Total transferred:      1980595 bytes
HTML transferred:       1957495 bytes
Requests per second:    4.78 [#/sec] (mean)
Time per request:       8371.586 [ms] (mean)
Time per request:       209.290 [ms] (mean, across all concurrent requests)
Transfer rate:          92.41 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0  412 519.7      0    1077
Processing:   519 6981 5031.0   8261   16594
Waiting:        6 4037 2698.4   4164    8645
Total:        602 7393 4994.5   8589   16594

Percentage of the requests served within a certain time (ms)
  50%   8589
  66%   9885
  75%  11245
  80%  11745
  90%  14563
  95%  15051
  98%  16292
  99%  16594
 100%  16594 (longest request)

Das ganze scheint also gar kein Problem mehr machen dank dynamischem RAM.

MfG
Michael
 
MaxRequestsPerChild 0

damit ist die Funktion deaktiviert, da 0 unedlich bedeutet. Die Funktion dient der Selbstbereinigung. Durch Erneuerung der Childs z.B. alle 4000 Requests, werden Zombie Prozesse eleminiert.

Speicherverwaltung bei Computern ist ein eigenes Thema. Und da hab ich kaum Ahnung von. :) In den USA hab ich schon lang keinen Server mehr. Bin doch nun Kunde bei Keyweb.de
 
Last edited by a moderator:
Okay, alles klar, vielen Dank für dein Posting!

Keyweb.de sieht sehr interessant aus, hast du damit gute Erfahrungen?

MfG
Michael
 
Keyweb.de sieht sehr interessant aus, hast du damit gute Erfahrungen?
bisher nur gute Erfahrungen mit Keyweb gemacht. Keyweb hat ja hauptsächlich Reseller als Kunden. Und die legen Wert auf Leistung u. Service.

Werde mir den neuen VRS - Start 09 holen. Mein jetziger Root DS hat nur 256 MB RAM und die CPU ist eh nie ausgelastet. Zudem kostet mich der neue ansatt 14,95 nur noch 7,90 €.

Mein Root DS hat zwar Traffic Flat aber 1500 GB reichen auch locker.
 
Last edited by a moderator:
Vielen Dank für deinen Erfahrungsbericht!

Das werde ich mir auf jeden Fall auch mal überlegen, ob ich mir da mal nen Testserver hole, denn da gibts mehr Leistung für um einiges weniger Geld als bei anderen Hostern.

MfG
Michael
 
Back
Top