{"id":56,"date":"2018-03-31T17:34:52","date_gmt":"2018-03-31T17:34:52","guid":{"rendered":"http:\/\/www.sanchofock.de\/?p=56"},"modified":"2018-03-31T17:55:46","modified_gmt":"2018-03-31T17:55:46","slug":"mysql-performance-untersuchen","status":"publish","type":"post","link":"https:\/\/www.sanchofock.de\/?p=56","title":{"rendered":"mySQL Performance untersuchen"},"content":{"rendered":"<p>diesmal habe ich ein etwas spezielleres Thema: Wie kann ich mit den Boardmitteln von mySQL und mit freien Tools die Performance einer mySQL Datenbank untersuchen?<\/p>\n<p>Ich habe dies anl\u00e4sslich eines Performanceproblems eines nicht kommerziellen rege genutzten Internetforums getan und will hier kurz zeigen, was n\u00f6tig war bzw.\u00a0 wie ich die wichtigsten Informationen gewonnen habe.<\/p>\n<p>In dem zu untersuchenden Fall kam es beim Speichern von Beitr\u00e4gen teilweise zu erheblich langsamen Antwortzeiten. Verwender wird die phpBB Board Software, welche eine mySQL Datenbank nutzt. (s. Artikel\u00a0http:\/\/www.sanchofock.de\/?p=69)<\/p>\n<p>Vorausgegangene Performancetests hatten das Problem bereits best\u00e4tigt und reproduzierbar gemacht. Hierauf konnte ich also gut zur\u00fcckgreifen.<\/p>\n<p>Um zu \u00fcberpr\u00fcfen, ob diese langen Wartezeiten auf der Datenbank entstehen habe ich zuerst den phpMyAdmin f\u00fcr die mySQL Datenbank verwendet, welcher bei diesem Forum bereits installiert war.<\/p>\n<p>Der phpMyAdmin bietet einen guten ersten \u00dcberblick \u00fcber die Datenbank, ihre Struktur und auch grundlegende Performance Eigenschaften.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.sanchofock.de\/wp-content\/uploads\/2018\/03\/ms1.png\" data-recalc-dims=\"1\" \/><\/p>\n<p>Tabellen, Indizes, Trigger, stored procedures und Views k\u00f6nnen hier ebenso per UI \u00fcbersichtlich angesehen werden, wie SQL Abfragen ausgef\u00fchrt werden.<\/p>\n<p>Um sich den Performance Status anzusehen wechselt man von der aktuellen Datenbank auf die Server Ansicht:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.sanchofock.de\/wp-content\/uploads\/2018\/03\/ms2.png\" data-recalc-dims=\"1\" \/><\/p>\n<p>Und dann Auf die Status Seite:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.sanchofock.de\/wp-content\/uploads\/2018\/03\/ms3.png\" data-recalc-dims=\"1\" \/><\/p>\n<p>Unter \u201eServer\u201c finden sich einige allgemeine Basis Informationen, unter \u201eProzesse\u201c die Liste der aktiven Client Prozesse, unter \u201eStatistiken\u201c die allgemeinen Abfrage Statistiken, unter \u201eStatus Variablen\u201c eine Menge aktueller Status Variablen und deren Inhalt, unter \u201e\u00dcberwachung\u201c kann man ein Basis Monitoring aktivieren und schliesslich ist da noch der \u201eRatgeber\u201c.<\/p>\n<p>Die ersten beiden Reiter sind interessant, enthalten jedoch nur Informationen, die so allgemein sind, dass sie f\u00fcr mein Problem hier nicht weitergeholfen haben,<\/p>\n<p>Zu den Status Variablen komme ich sp\u00e4ter noch. Die \u00dcberwachung sieht so aus:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.sanchofock.de\/wp-content\/uploads\/2018\/03\/ms4.png\" data-recalc-dims=\"1\" \/><\/p>\n<p>Leider sind diese Daten nicht historisierbar und je nach gew\u00e4hlter Granularit\u00e4t entweder nur f\u00fcr einen kurzen Zeitraum oder aber sehr grob.<\/p>\n<p>Aber immerhin gab dieses einen ersten \u00dcberblick und ich konnte feststellen, dass keine grundlegenden Probleme mit den Kernressourcen (CPU\/Speicher) vorlagen. Auch unter einem Lasttest zeigten diese wie auch der Netzwerk traffic keine ungew\u00f6hnlichen oder kritischen Muster.<\/p>\n<p>Der Ratgeber gibt auch noch mal interessante Hinweise, die sich auf die Konfiguration unter Ber\u00fccksichtigung der aktuellen Nutzungsstatistiken und das Applikationsverhalten ergeben. F\u00fcr Hobby DBAs wie mich und Entwickler also durchaus eine einfache M\u00f6glichkeit gute Tipps zu bekommen.<\/p>\n<p>In unserem Fall fanden sich jedoch keine Hinweise, die bei diesem Problem helfen konnten.<\/p>\n<p>Wenn man den phpMyAdmin nicht zur Verf\u00fcgung hat kann man an der Konsole auch das Script mysqltuner.pl verwenden.<\/p>\n<p>Es kann ganz einfach in zwei Schritten ausgef\u00fchrt werden.<\/p>\n<p>Zuerst muss die aktuelle Version mit wget heruntergeladen werden:<\/p>\n<blockquote><p>server:~# wget http:\/\/mysqltuner.pl<\/p><\/blockquote>\n<p>Alternativ kann mysqltuner unter Ubuntu und Debian auch direkt aus dem Repository installiert werden:<\/p>\n<blockquote><p>server:~# apt-get install mysqltuner<\/p><\/blockquote>\n<p>Danach wird der MySQL-Tuner gestartet, wobei eventuell MySQL Login Daten eingegeben werden m\u00fcssen.<\/p>\n<blockquote><p>server:~# perl mysqltuner.pl<\/p><\/blockquote>\n<p>Aber alles das half nun nicht um die Datenbank als Ursache f\u00fcr das dar\u00fcber liegende Problem auszuschlie\u00dfen oder fest zu machen.<\/p>\n<p>Die wichtigste Frage, die sich also stellte: Gibt es lang laufende Abfragen an dieser Datenbank und wenn ja stehen diese im Zusammenhang mit den schlechten Antwortzeiten?<\/p>\n<p>mySQL bietet von Haus aus die M\u00f6glichkeit, lang laufende Queries zu protokollieren. Hierf\u00fcr kommen wir mit dem phpMyAdmin aber nur bedingt weiter, es sei denn unser Datenbankuser hat \u201esuper\u201c Rechte.<\/p>\n<p>Um diese Protokollierung zu aktivieren m\u00fcssen ein paar globale Server Variablen ge\u00e4ndert werden. F\u00fcr einige ben\u00f6tigt man die \u201esuper\u201c Rechte.<\/p>\n<p>Wenn man diese nicht hat muss man sich entweder als root an der mySQL Konsole anmelden und diese Rechte erteilen oder direkt die Variablen \u00e4ndern.<\/p>\n<p>Ist einem das mySQL root Passwort nicht (mehr) bekannt, dann hilft dieser Artikel weiter: <a href=\"https:\/\/www.yourhelpcenter.de\/2010\/07\/mysql-vergessenes-root-passwort-zurucksetzen\/\">https:\/\/www.yourhelpcenter.de\/2010\/07\/mysql-vergessenes-root-passwort-zurucksetzen\/<\/a><\/p>\n<p>Um das Logging zu aktivieren muss die Variable <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.5\/en\/server-system-variables.html#sysvar_slow_query_log\">SLOW_QUERY_LOG<\/a> auf ON bzw 1 gesetzte werden.<\/p>\n<p>Die Variable <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.5\/en\/server-system-variables.html#sysvar_slow_query_log\">LONG_QUERY_TIME<\/a> gibt an ab welcher Laufzeit die Abfragen geloggt warden sollen. 0 Bedeutet gar nicht und 10 (Sekunden ist das Maximum.<\/p>\n<p>Nach der Aktivierung legt der Server ein entsprechendes Log File an. Der Ort wird in der Variable <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.5\/en\/server-system-variables.html#sysvar_slow_query_log\">SLOW_QUERY_LOG_FILE<\/a> angegeben. Macht man das nicht selbst w\u00e4hlt der Server das data Verzeichnis der Datenbank. Weitere Details zur Konfiguration und zur Verwendung findet man unter <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.5\/en\/slow-query-log.html\">https:\/\/dev.mysql.com\/doc\/refman\/5.5\/en\/slow-query-log.html<\/a><\/p>\n<p>Ich habe die Zeit auf 1 Sekunde eingestellt und den Performancetest ausgef\u00fchrt in dem es wieder zu langsamen Antworten kam. Doch das Log blieb leer. Um zu pr\u00fcfen ob es wirklich funktioniert habe ich dann noch die Variable <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.5\/en\/server-system-variables.html#sysvar_slow_query_log\">LOG_QUERYS_NOT_USING_INDEXES<\/a> aktiviert und siehe da das Log f\u00fcllte sich. Je nach Einstellung und Performance kann das Log schnell gross werden und produziert Eintr\u00e4ge wie diesen hier:<\/p>\n<p># Time: 180110 13:39:26<br \/>\n# User@Host: phpbb_1[phpbb_1] @ localhost []<br \/>\n# Query_time: 0.000137\u00a0 Lock_time: 0.000026 Rows_sent: 0\u00a0 Rows_examined: 34<br \/>\nSET timestamp=1515587966;<br \/>\nSELECT ban_userid<br \/>\nFROM phpbb_banlist<br \/>\nWHERE ban_userid IN (130, 171, 160, 232, 96, 230, 97, 139, 262, 48, 390)<br \/>\nAND ban_exclude &lt;&gt; 1 AND ban_end = 0;<\/p>\n<p>Um eine bessere \u00dcbersicht zu bekommen habe ich ein freies Tool verwendet. Es sind die PT-Tools. Von Percona. Zu finden unter <a href=\"https:\/\/www.percona.com\/software\/database-tools\/percona-toolkit\">https:\/\/www.percona.com\/software\/database-tools\/percona-toolkit<\/a><\/p>\n<p>Hilfreich f\u00fcr meine Fragestellung war konkret das Tool pt-query-digest<\/p>\n<p>Die Auswertung damit hat deutlich ergeben, dass es am Datenbank Server keine lang laufenden Abfragen gab. Die Datenbank war also als Verd\u00e4chtiger ausgeschlossen. Die Fehlersuche musste also an einer anderen Stelle weitergehen.<\/p>\n<p>W\u00e4ren hier langsame Queries aufgefallen, so h\u00e4tte man das selbe Tool auch nutzen k\u00f6nnen um die Ursachen herauszufinden. Hier zum Schluss noch die Ausgabe als Anschauung:<\/p>\n<ol>\n<li>Zusammenfassung:<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.sanchofock.de\/wp-content\/uploads\/2018\/03\/ms5.png\" data-recalc-dims=\"1\" \/>2. Profiling \u00dcbersicht<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.sanchofock.de\/wp-content\/uploads\/2018\/03\/ms6.png\" data-recalc-dims=\"1\" \/><\/p>\n<p>3. Je Query eine detaillierte Auswertung<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.sanchofock.de\/wp-content\/uploads\/2018\/03\/ms7.png\" data-recalc-dims=\"1\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>diesmal habe ich ein etwas spezielleres Thema: Wie kann ich mit den Boardmitteln von mySQL und mit freien Tools die Performance einer mySQL Datenbank untersuchen? Ich habe dies anl\u00e4sslich eines Performanceproblems eines nicht kommerziellen rege genutzten Internetforums getan und will hier kurz zeigen, was n\u00f6tig war bzw.\u00a0 wie ich die wichtigsten Informationen gewonnen habe. In [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4,1],"tags":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.sanchofock.de\/index.php?rest_route=\/wp\/v2\/posts\/56"}],"collection":[{"href":"https:\/\/www.sanchofock.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sanchofock.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sanchofock.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sanchofock.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=56"}],"version-history":[{"count":2,"href":"https:\/\/www.sanchofock.de\/index.php?rest_route=\/wp\/v2\/posts\/56\/revisions"}],"predecessor-version":[{"id":74,"href":"https:\/\/www.sanchofock.de\/index.php?rest_route=\/wp\/v2\/posts\/56\/revisions\/74"}],"wp:attachment":[{"href":"https:\/\/www.sanchofock.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=56"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sanchofock.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=56"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sanchofock.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=56"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}