{"id":117,"date":"2012-05-30T20:05:15","date_gmt":"2012-05-30T19:05:15","guid":{"rendered":"http:\/\/www.kolja-engelmann.de\/blog\/?p=117"},"modified":"2014-04-02T13:27:46","modified_gmt":"2014-04-02T11:27:46","slug":"unser-server-lagged-zeit-fur-optimierungen","status":"publish","type":"post","link":"https:\/\/www.kolja-engelmann.de\/blog\/2012\/05\/unser-server-lagged-zeit-fur-optimierungen\/","title":{"rendered":"Unser Server lagged &#8211; Zeit f\u00fcr Optimierungen"},"content":{"rendered":"<p><a href=\"https:\/\/www.kolja-engelmann.de\/blog\/wp-content\/uploads\/2012\/05\/server_langsam_firebug.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-thumbnail wp-image-118\" title=\"Server langsam firebug\" alt=\"\" src=\"https:\/\/www.kolja-engelmann.de\/blog\/wp-content\/uploads\/2012\/05\/server_langsam_firebug-150x115.png\" width=\"150\" height=\"115\" \/><\/a>Ubuntu, Plesk, Apache, PHP, MySQL. Viel mehr l\u00e4uft auf unserem Server eigentlich nicht. Deutlich potenter als der Vorg\u00e4nger ist er auch. Warum zum Geier ben\u00f6tigen dann die Webseiten mit einem Mal Sekunden bevor sie angezeigt werden? Zeit wiedermal zu optimieren. Aber wie waren noch gleich die Settings, die ich vor zwei Jahren bei unserem letzten Server verwendet habe? Pff, das passiert mir nicht nochmal, diesmal schreibe ich sie auf!<\/p>\n<h3>Apache Optimierung<\/h3>\n<p>Beginnen wir beim Apache. Als erstes soll das Apache MPM Modul optimiert werden. Aber welches? Prefork, Worker oder Event?<\/p>\n<pre class=\"lang:default highlight:0 decode:1 inline:1\">\/usr\/sbin\/apache2 -l<\/pre>\n<p>sagt mir mit welchen Modulen Apache kompiliert wurde. In meinem Fall war es prefork.c, also das Prefork Modul, dass ich nun in der<\/p>\n<pre class=\"lang:default highlight:0 decode:1 inline:1\">\/etc\/apache2\/apache2.conf<\/pre>\n<p>etwas anpassen kann.<\/p>\n<pre class=\"lang:apache decode:true\"># prefork MPM\r\n# StartServers: number of server processes to start\r\n# MinSpareServers: minimum number of server processes which are kept spare\r\n# MaxSpareServers: maximum number of server processes which are kept spare\r\n# MaxClients: maximum number of server processes allowed to start\r\n# MaxRequestsPerChild: maximum number of requests a server process serves\r\n&lt;IfModule mpm_prefork_module&gt;\r\nStartServers      5   #was 1\r\nMinSpareServers   5   #was 1\r\nMaxSpareServers   10  #was 5\r\nMaxClients        150 #was 100\r\nMaxRequestsPerChild   0\r\n&lt;\/IfModule&gt;<\/pre>\n<p>Au\u00dferdem sollten alle nicht ben\u00f6tigten Module abgeschaltet werden, die man in<\/p>\n<pre class=\"lang:default highlight:0 decode:1 inline:1\">\/etc\/apache2\/mods-enabled<\/pre>\n<p>findet. Am besten nutzt man<\/p>\n<pre class=\"lang:default highlight:0 decode:1 inline:1\">a2enmod &lt;modulname&gt;<\/pre>\n<p>um Module anzuschalten, bzw.<\/p>\n<pre class=\"lang:default highlight:0 decode:1 inline:1\">a2dismod &lt;modulname&gt;<\/pre>\n<p>um diese abzuschalten. Ich habe z.B. mod_include deaktiviert, da wir keine server Side Includes verwenden.<\/p>\n<h3>MySQL<\/h3>\n<p>Um \u00fcberhaupt erstmal einen Zugriff auf die wichtigen MySQL Variablen zu erhalten, musste ich mich als &#8222;root&#8220; Nutzer anmelden. Unter Plesk-basierten Systemen gibt es jedoch keinen &#8222;root&#8220; Nutzer, sondern nur einen &#8222;admin&#8220;, der sich ausschlie\u00dflich von localhost aus anmelden darf. Also rasch lokal mittels<\/p>\n<pre class=\"lang:default highlight:0 decode:1 inline:1\">mysql -uadmin -p<code>cat \/etc\/psa\/.psa.shadow<\/code><\/pre>\n<p>eingelogged und einen neuen User angelegt, mit dem ich dann auch die n\u00f6tigen Rechte habe, ohne gleich die ganze Zeit als root (bzw. admin) agieren zu m\u00fcssen:<\/p>\n<pre class=\"lang:default decode:true\">GRANT ALL PRIVILEGES ON '%'.* to '&lt;username&gt;'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;\r\nCREATE USER '&lt;username&gt;'@'localhost' IDENTIFIED BY 'password';\r\nFLUSH PRIVILEGES;<\/pre>\n<p>Jetzt kann es aber endlich ans tunen gehen- Haaaaalt das klingt ja so als ob es einfach w\u00e4re. MySQL Tuning ist schwieriges Feld und h\u00e4ngt von vielen Faktoren ab, zu denen nicht nur die Serverhardware geh\u00f6rt, sondern auch die Applikationen die darauf laufen, die Tabellenformate (z.B. MyISAM oder innoDB) und folglich auch die Anfragetypen. Man kann also keine &#8222;Killer&#8220;-Konfiguration posten, die immer optimal l\u00e4uft. Aber man kann sich mit der Zeit langsam ann\u00e4hern. Beginnen wir mit folgenden Werten in der<\/p>\n<pre class=\"lang:default highlight:0 decode:1 inline:1\">\/etc\/mysqld\/my.cnf<\/pre>\n<p>im Bereich<\/p>\n<pre class=\"lang:default highlight:0 decode:1 inline:1\">[mysqld]<\/pre>\n<p>und sehen mal, wie sich die Werte auswirken.<\/p>\n<pre class=\"lang:default decode:true\">table_open_cache        = 256 #was 64\r\nkey_buffer              = 64M #was 16M\r\nread_buffer_size        = 1M  #was 128k\r\nmax_allowed_packet      = 16M\r\nthread_stack            = 192K\r\nthread_cache_size       = 8\r\nquery_cache_limit       = 4M\r\nquery_cache_size        = 64M<\/pre>\n<p>Am besten man liest zu diesem Thema erstmal das <a href=\"http:\/\/www.amazon.de\/Performance-Optimierung-Datensicherung-Replikation-Lastverteilung\/dp\/3897213885&amp;tag=dragonslayer-21\" target=\"_blank\">High Performance MySQL<\/a> Buch, treibt sich ein paar Wochen im <a href=\"http:\/\/www.mysqlperformanceblog.com\/\" target=\"_blank\">MySQLPerformance-Blog<\/a> rum oder liest was ich im Laufe der Monate f\u00fcr semiprofessionelle Erg\u00fcsse zu diesem Thema produziere \ud83d\ude42<\/p>\n<p>To be continued, \u00e4h optimized \ud83d\ude09<\/p>","protected":false},"excerpt":{"rendered":"<p>Ubuntu, Plesk, Apache, PHP, MySQL. Viel mehr l\u00e4uft auf unserem Server eigentlich nicht. Deutlich potenter als der Vorg\u00e4nger ist er auch. Warum zum Geier ben\u00f6tigen dann die Webseiten mit einem Mal Sekunden bevor sie angezeigt&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":118,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3],"tags":[161,17],"class_list":["post-117","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apache","tag-apache","tag-mysql"],"jetpack_featured_media_url":"https:\/\/www.kolja-engelmann.de\/blog\/wp-content\/uploads\/2012\/05\/server_langsam_firebug.png","jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/posts\/117","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/comments?post=117"}],"version-history":[{"count":0,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/posts\/117\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/media\/118"}],"wp:attachment":[{"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/media?parent=117"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/categories?post=117"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/tags?post=117"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}