MySQL: Wie kann ich meine "Maximal mögliche Speichernutzung" verringern?

15

Ich habe in letzter Zeit Probleme mit Thrashing, weil mir der Speicher ausgeht. (Mein VPS hat insgesamt 256 Millionen)

Ich versuche MySQL mit mysqltuner.pl zu optimieren und erhalte die folgenden Ergebnisse:

-------- Allgemeine Statistiken ---------------------------------------- ----------
[-] Versionsprüfung für MySQLTuner-Skript übersprungen
[OK] Derzeit wird unterstütztes MySQL-Protokoll der Version 5.0.51a-3ubuntu5.4 ausgeführt
[OK] Betrieb mit 64-Bit-Architektur

-------- Storage Engine Statistics --------------------------------------- ----
[-] Status: + Archive -BDB -Federated -InnoDB -ISAM -NDBCluster 
[-] Daten in MyISAM-Tabellen: 114M (Tabellen: 454)
[!!] Gesamtzahl der fragmentierten Tabellen: 34

-------- Leistungsmetriken ---------------------------------------- ---------
[-] Bis zu: 40 s (570 q [14.250 qps], 23 Conn, TX: 154 K, RX: 23 K)
[-] Lesen / Schreiben: 100% / 0%
[-] Gesamtpuffer: 338,0 MB global + 2,7 MB pro Thread (maximal 20 Threads)
[!!] Maximal mögliche Speichernutzung: 392,9M (153% des installierten RAM)
[OK] Langsame Abfragen: 0% (5/570)
[OK] Höchste Auslastung der verfügbaren Verbindungen: 15% (3/20)
[!!] Schlüsselpuffergröße / Gesamtzahl der MyISAM-Indizes: 8,0M / 9,4M
[!!] Trefferquote des Schlüsselpuffers: 57,1% (7 zwischengespeicherte / 3 Lesevorgänge)
[OK] Abfrage-Cache-Effizienz: 21,9% (7 zwischengespeicherte / 32 ausgewählte)
[OK] Cache-Bereinigungen pro Tag abfragen: 0
[OK] Sortierungen, die temporäre Tabellen erfordern: 0% (0 temporäre Sortierungen / 1 Sortierungen)
[OK] Temporäre Tabellen, die auf der Festplatte erstellt wurden: 0% (0 auf der Festplatte / 32 insgesamt)
[OK] Trefferrate im Thread-Cache: 86% (3 erstellt / 23 Verbindungen)
[OK] Trefferquote im Tabellen-Cache: 26% (128 offen / 484 geöffnet)
[OK] Verwendetes Limit für offene Dateien: 25% (259 / 1K)
[OK] Sofort erworbene Tabellensperren: 100% (492 sofortige / 492 Sperren)

-------- Empfehlungen ----------------------------------------- ------------
Allgemeine Empfehlungen:
    Führen Sie OPTIMIZE TABLE aus, um Tabellen für eine bessere Leistung zu defragmentieren
    MySQL wurde innerhalb der letzten 24 Stunden gestartet - Empfehlungen können ungenau sein
    Reduzieren Sie Ihren gesamten MySQL-Speicherbedarf, um die Systemstabilität zu gewährleisten
Zu ändernde Variablen:
  *** MySQLs maximale Speichernutzung ist gefährlich hoch ***
  *** Fügen Sie RAM hinzu, bevor Sie die MySQL-Puffervariablen erhöhen ***
    key_buffer_size (> 9,4 MB)

Aber ich bin ein bisschen verwirrt, wie ich die maximale Speichernutzung reduzieren kann. Es scheint auf key_buffer und max_connections zu basieren, aber muss da noch etwas anderes dabei sein?

my.cnf:

key_buffer = 8M
max_allowed_packet = 12M
thread_stack = 128 KB
thread_cache_size = 8
max_connections = 20
table_cache = 128
tmp_table_size = 256 MB
max_heap_table_size = 256M
join_buffer_size = 256 KB
query_cache_limit = 8 Millionen
query_cache_size = 64M

Ich habe versucht, MySQL-Tuning-Artikel durchzulesen, aber sie scheinen auf Leute ausgerichtet zu sein, die bereits wissen, was sie tun! Jede Hilfe wäre dankbar. Vielen Dank!

Nick
quelle
1
Ich folgte den Kommentatorenempfehlungen und brachte sie auf ein vernünftiges Niveau - aber ich bin immer noch neugierig, was für vernünftige Baseballstadien für diese Werte sein könnten? Einige Online-Artikel verwenden 64 KB, andere empfehlen 512 MB für denselben Wert!
Nick

Antworten:

10

Sie haben einen Server mit 256 MB, aber Sie können nicht alles verwenden - denken Sie daran, dass es einen gewissen Overhead für das Betriebssystem gibt. Hinzu kommt die Tatsache, dass Sie, wie andere Leute bereits erwähnt haben, überfordert sind und Sie auf jeden Fall hier verprügeln werden. 256M reichen nur für eine kleine DB, 20 Verbindungen sind viel mit dem, was Sie konfiguriert haben.

1) Reduziere deine maximalen Verbindungen auf 4 (du verwendest 3 von 20)

2) Optimieren Sie Ihren Abfrage-Cache besser; 8 Millionen sind wirklich groß, und insgesamt 64 Millionen hängen viel von Ihren Hits / Pflaumen ab. Probieren Sie eine 4/32 Combo und sehen Sie, wie es geht. Wirklich denke ich, dass eine 2/24 Kombination für Sie arbeiten würde.

3) Sie haben keine Sortierungen, die temporäre Tabellen erfordern. Warum ist das Verb max_heap_table_size dort? Kommentieren Sie das aus, verwenden Sie die Standardeinstellungen

4) Hast du tatsächlich 128 Tische? Versuchen Sie, diesen table_cache auf 64 oder 48 zu halbieren

5) Reduziere thread_cache_size auf 4

6) Optimieren Sie diese Tabellen, um die Fragmentierung zu reduzieren

Das sind einige Dinge, mit denen man anfangen soll. Es sieht so aus, als hätten Sie eine Reihe von Zahlen in eine Konfiguration geworfen, ohne ein Profil zu erstellen, um zu wissen, was Sie brauchten, und ein Durcheinander verursacht. Wenn alles andere fehlschlägt, kehren Sie zu den Standardeinstellungen zurück, und entfernen Sie Ihre benutzerdefinierten Einstellungen. Beginnen Sie dann erneut mit einigen Anleitungen zur Leistungsoptimierung, die Sie bei Google finden. Holen Sie sich die Ausgabe von SHOW VARIABLES und SHOW STATUS, suchen Sie eine der bajillion Tuning-Anleitungen und fügen Sie Ihre tatsächlichen, reellen Zahlen in ihre Gleichungen ein. Diese geben Ihnen dann die exakten Zahlen an, die Sie in Ihre Konfigurationsdatei einfügen müssen.

troyengel
quelle
3
Dies ist eine alte Antwort auf eine alte Frage, aber ich möchte darauf hinweisen, dass der Server in dem vom Fragesteller veröffentlichten mysqltuner-Ergebnis erst seit 40 Jahren in Betrieb ist, was nicht ausreicht, um die Lasten, die der Server sehen wird, genau zu beurteilen . Idealerweise führen Sie mysqltuner im Laufe eines Tages oder länger ein paar Mal aus und analysieren dann die Ergebnisse. Davon abgesehen sind Ihre Vorschläge solide.
Instanz vom
7

Ich bin kein MySQL-Guru und kann das Problem mit diesen Informationen nicht diagnostizieren, aber ich habe versucht, nach der Formel im Quellcode zu suchen. Hier ist es:

server_buffers + total_per_thread_buffers * max_connections

Wo:

server_buffers = key_buffer_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + query_cache_size

und:

total_per_thread_buffers = read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size

Jetzt müssen Sie jeden dieser Werte überprüfen und herausfinden, welcher für diese große Zahl verantwortlich ist. Und vertraue diesem Skript nicht vorbehaltlos - ich habe versucht, es auf einem meiner DB-Server auszuführen, und es hat berechnet, dass der maximale Arbeitsspeicher 140% des gesamten physischen Arbeitsspeichers beträgt, aber das System wird seit Jahren ohne Stabilitätsprobleme ausgeführt.

Viel Glück!

Georgi Hristozov
quelle
0

Wenn ich mich richtig erinnere, verwendet MySQL Tuner die folgende Formel, um die maximale Nutzung zu schätzen:

read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size

Denken Sie daran, dass dies nicht zu 100% korrekt ist, sondern lediglich eine Schätzung darstellt, da bestimmte Einstellungen in MySQL keine definierten Grenzen haben.

Sie können beginnen, einige Einstellungen in Ihrer Konfigurationsdatei abzuschwächen und den Tuner erneut auszuführen. Ich würde jedoch raten, die Hilfe eines Experten in Anspruch zu nehmen, wenn Sie keine Zeit haben, my.cnf zu ändern, ihn neu zu starten und den Tuner auszuführen.

gekkz
quelle
0

Durch die Verwendung der Software mysqlcalculator.com können Sie viele Stunden sparen.

Wilson Hauck
quelle