Ich habe einen Entwicklungsserver, den ich kürzlich von 14.04 auf 16.04 aktualisiert habe.
Ich habe eine Datenbank 'Algebra', die Daten für meine Website algebra.com hostet. Es handelt sich um eine Q & A-Website mit Fragen und Antworten und einer Beziehung von 1 zu N.
Nach dem Upgrade hat sich die Leistung derselben Datenbankabfragen dramatisch verschlechtert.
Beispielsweise dauerte eine Abfrage, bei der Fragen und Antworten nach Fragen-ID verknüpft werden, weniger als eine halbe Sekunde. Nach dem Upgrade dauert es eine Minute.
Da es sich um einen Entwicklungsserver handelt, kann ich ihn mit dem Produktionsserver vergleichen, auf dem Ubuntu 14.04 noch ausgeführt wird und dessen Abfrage nur 0,38 Sekunden dauert.
Hier sind die Abfragepläne
mysql> explain SELECT
-> questions.id, questions.email, questions.topic, questions.question,
-> questions.date,
-> questions.deleted,
-> questions.is_spam,
-> questions.solved,
->
-> questions.tb_id,
-> questions.tb_isbn,
-> questions.tb_title,
-> questions.tb_edition,
-> questions.tb_chapter,
-> questions.tb_problem,
->
-> solutions.id, solutions.author author, solutions.date, solutions.answer
-> FROM questions, solutions
-> WHERE
-> questions.solved = 1
-> AND questions.id = solutions.question
-> AND questions.deleted != 1
-> AND questions.is_spam != 1
-> ORDER BY solutions.date DESC
-> LIMIT 50;
Auf dem "Good Server":
+----+-------------+-----------+--------+-----------------------+---------+---------+----------------------------+--------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+--------+-----------------------+---------+---------+----------------------------+--------+----------------+
| 1 | SIMPLE | solutions | ALL | solutions_by_question | NULL | NULL | NULL | 650770 | Using filesort |
| 1 | SIMPLE | questions | eq_ref | PRIMARY | PRIMARY | 4 | algebra.solutions.question | 1 | Using where |
+----+-------------+-----------+--------+-----------------------+---------+---------+----------------------------+--------+----------------+
2 rows in set (0.00 sec)
Auf dem "Bad Server:
+----+-------------+-----------+------------+------+-----------------------+-----------------------+---------+----------------------+--------+----------+----------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+------+-----------------------+-----------------------+---------+----------------------+--------+----------+----------------------------------------------+
| 1 | SIMPLE | questions | NULL | ALL | PRIMARY | NULL | NULL | NULL | 482186 | 8.10 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | solutions | NULL | ref | solutions_by_question | solutions_by_question | 4 | algebra.questions.id | 1 | 100.00 | Using index condition |
+----+-------------+-----------+------------+------+-----------------------+-----------------------+---------+----------------------+--------+----------+----------------------------------------------+
Der Datenbankinhalt ist mehr oder weniger derselbe, die Entwicklungsdatenbank ist eine Sicherung des Servers von letzter Nacht.
Irgendwelche Ideen, wo ich diese wilde Gänsejagd beginnen kann, um den Leistungsabfall zu verstehen?
Vielen Dank!
quelle
Antworten:
Wenn Sie auf einen Ubuntu-Server mit 16.04 aktualisiert haben und 5.7.12 verwenden, stoßen Sie - zumindest teilweise - auf einen Fehler, der den Arbeitsspeicher verschlingt, und auf einige dynamische Optimierungen / Standardeinstellungen, die auf dem verfügbaren Arbeitsspeicher des Servers basieren weniger als ideal einstellen. Dies war für viele Menschen problematisch, vor allem aber für kleinere Server / VPS mit wenig RAM.
Durchsuchen Sie laracasts.com nach MySQL 5.7 Memory Leak
https://www.reddit.com/r/mysql/comments/4gnj93/mysql_5712_ubuntu_1604_ridiculous_memory/
Es gibt andere Probleme, von denen einige 5.7.13 natürlich behoben wurden ...
http://mysqlentomologist.blogspot.com/2016/06/fun-with-bugs-43-bugs-fixed-in-mysql.html
Es wurden auch verschiedene Optimierungen / Änderungen vorgenommen, die sich darauf auswirken, ob Sie InnoDB oder MyISAM verwenden oder nicht. Beispielsweise steigt ein kürzlich installierter VPS mit 2 GB RAM, der bei einem Neustart von MySQL etwa 320 MB RAM verbraucht, langsam an, bis 1 GB in einer inaktiven App im Wartungsmodus verbraucht werden war eine OpenCart-Installation, die MyISAM verwendet ... was ich niemandem wünschen möchte, der versucht, voranzukommen ... aber das war ein Fall von "beeilen Sie sich und lassen Sie uns dies tun und dies verwenden und ...") . Und so benötigt diese bestimmte Instanz mehr Geld und Zeit, um zurück zu gehen und sich mit demselben schlechten Leistungsproblem von MySQL zu befassen, da sich das Oracle-Team auf MyISAM in der App, einen Speicherverlust und einige schlechte Standardeinstellungen verlassen hat.
Sicher, Sie möchten wahrscheinlich Ihre Abfragen und Verknüpfungen für die neuen Updates optimieren. Aber gleichzeitig werden Sie wahrscheinlich viel Mühe verschwenden und nichts erreichen, da der zugrunde liegende Speicher wie ein Siebproblem ausläuft. Wenn Sie Optimierungen vornehmen, können Sie dies auch mit einem anderen MySQL-Server tun als dem, der Probleme für Sie verursacht.
Ihre Optionen sind, wenn man bedenkt, wie langsam MySQL Fehler behebt:
1) Fahren Sie es raus und warten Sie auf Repo-Updates, die es reparieren
2) deinstalliere die aktuelle Version und gehe zurück zu einer vorherigen (aber warum?)
3) Ersetzen Sie es durch MariaDB oder Percona
Wenn Sie einen neuen Ubuntu 16.04-Server starten, würde ich die Repositorys ändern, bevor ich Benutzeragenten für die Remoteverwaltung verbinde oder Server-Management-Panels installiere, sodass Sie sich auf einem MariaDB / Percona-Track befinden. Oder verfolgen Sie die offiziellen MySQL-Repos und nicht die Ubuntu-Repos, damit Sie schneller Fehler beheben können.
Die sichere und sofortige Lösung (sicherlich klüger als die Verlängerung der Verwendung früherer Versionen mit Fehlern und einem wichtigen Kompatibilitätsproblem im Release-Stream) ist die Umstellung auf MariaDB oder Percona. Wenn Sie eine App verwenden, die sowohl PostgreSQL als auch MySQL verwenden kann, wechseln Sie zu Postgre - wenn dies nicht unpraktisch ist.
Ich würde meine Zeit nicht damit verschwenden, die Datenbank zu optimieren, bis ich auf 5.7.13 aktualisiert und die Ergebnisse überwacht oder zu MariaDB oder Percona gewechselt habe. Die Optimierung / Fehlerbehebung von 5.7.12 ist nur ein Schwarzes Loch, das Ihre Zeit und Ressourcen beansprucht.
quelle
Insbesondere ist es der Fehler Übermäßiger Speicher, der in memory / innodb / os0file ab 5.7.8 verwendet wird .
Es wird in Ubuntu als RAM mit übermäßigem Verbrauch von mysqld daemon in Ubuntu 16.04 verfolgt , und es gibt auch eine Diskussion über Reddit .
quelle