Ich habe eine ausgelastete Datenbank mit ausschließlich InnoDB-Tabellen, die ungefähr 5 GB groß sind. Die Datenbank läuft auf einem Debian-Server mit SSD-Festplatten und ich habe max. Verbindungen = 800 eingestellt, die den Server manchmal sättigen und zum Stoppen bringen. Die durchschnittliche Abfrage pro Sekunde beträgt ca. 2,5 KB. Ich muss also die Speichernutzung optimieren, um Platz für maximal mögliche Verbindungen zu schaffen.
Ich habe Vorschläge gesehen, dass innodb_buffer_pool_size bis zu% 80 des gesamten Speichers betragen sollte. Andererseits bekomme ich diese Warnung vom Tuning-Primer-Skript:
Max Memory Ever Allocated : 91.97 G
Configured Max Per-thread Buffers : 72.02 G
Configured Max Global Buffers : 19.86 G
Configured Max Memory Limit : 91.88 G
Physical Memory : 94.58 G
Hier sind meine aktuellen Innodb-Variablen:
| innodb_adaptive_flushing | ON |
| innodb_adaptive_hash_index | ON |
| innodb_additional_mem_pool_size | 20971520 |
| innodb_autoextend_increment | 8 |
| innodb_autoinc_lock_mode | 1 |
| innodb_buffer_pool_instances | 1 |
| innodb_buffer_pool_size | 20971520000 |
| innodb_change_buffering | all |
| innodb_checksums | ON |
| innodb_commit_concurrency | 0 |
| innodb_concurrency_tickets | 500 |
| innodb_data_file_path | ibdata1:10M:autoextend |
| innodb_data_home_dir | |
| innodb_doublewrite | ON |
| innodb_fast_shutdown | 1 |
| innodb_file_format | Antelope |
| innodb_file_format_check | ON |
| innodb_file_format_max | Antelope |
| innodb_file_per_table | ON |
| innodb_flush_log_at_trx_commit | 2 |
| innodb_flush_method | O_DIRECT |
| innodb_force_load_corrupted | OFF |
| innodb_force_recovery | 0 |
| innodb_io_capacity | 200 |
| innodb_large_prefix | OFF |
| innodb_lock_wait_timeout | 50 |
| innodb_locks_unsafe_for_binlog | OFF |
| innodb_log_buffer_size | 4194304 |
| innodb_log_file_size | 524288000 |
| innodb_log_files_in_group | 2 |
| innodb_log_group_home_dir | ./ |
| innodb_max_dirty_pages_pct | 75 |
| innodb_max_purge_lag | 0 |
| innodb_mirrored_log_groups | 1 |
| innodb_old_blocks_pct | 37 |
| innodb_old_blocks_time | 0 |
| innodb_open_files | 300 |
| innodb_purge_batch_size | 20 |
| innodb_purge_threads | 0 |
| innodb_random_read_ahead | OFF |
| innodb_read_ahead_threshold | 56 |
| innodb_read_io_threads | 4 |
| innodb_replication_delay | 0 |
| innodb_rollback_on_timeout | OFF |
| innodb_rollback_segments | 128 |
| innodb_spin_wait_delay | 6 |
| innodb_stats_method | nulls_equal |
| innodb_stats_on_metadata | ON |
| innodb_stats_sample_pages | 8 |
| innodb_strict_mode | OFF |
| innodb_support_xa | ON |
| innodb_sync_spin_loops | 30 |
| innodb_table_locks | ON |
| innodb_thread_concurrency | 4 |
| innodb_thread_sleep_delay | 10000 |
| innodb_use_native_aio | ON |
| innodb_use_sys_malloc | ON |
| innodb_version | 1.1.8 |
| innodb_write_io_threads | 4 |
Eine Randnotiz, die relevant sein könnte: Ich sehe, dass, wenn ich versuche, einen großen Beitrag (etwa über 10 KB) von Drupal (der sich auf einem separaten Webserver befindet) in die Datenbank einzufügen, dieser für immer andauert und die Seite nicht korrekt zurückkehrt.
In Bezug auf diese Fragen frage ich mich, welche Größe mein innodb_buffer_pool_size für eine optimale Leistung haben soll. Ich freue mich über Ihre Vorschläge, um diesen und andere Parameter für dieses Szenario optimal einzustellen.
SELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM...
generiert unter MySQL 5.7 den folgenden Fehler: " Die Funktion 'INFORMATION_SCHEMA.GLOBAL_STATUS' ist deaktiviert. Weitere Informationen finden Sie in der Dokumentation zu 'show_compatibility_56'. " Hätten Sie vielleicht eine aktualisierte Version?Etwas wie das? Verwenden
SHOW VARIABLES
undSHOW GLOBAL STATUS
:Ausdruck:
innodb_buffer_pool_size / _ram
Bedeutung: % des für InnoDB buffer_pool verwendeten RAM
Empfohlener Bereich: 60 ~ 80%
Ausdruck:
Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests
Bedeutung: Anforderungen lesen, die die Festplatte treffen mussten
Empfohlener Bereich: 0-2%
Was tun, wenn er außerhalb des Bereichs liegt: Erhöhen Sie innodb_buffer_pool_size, wenn Sie genug haben RAM.
Ausdruck:
Innodb_pages_read / Innodb_buffer_pool_read_requests
Bedeutung: Anforderungen lesen, die die Festplatte treffen mussten
Empfohlener Bereich: 0-2%
Was tun, wenn der Bereich überschritten wird : Erhöhen Sie innodb_buffer_pool_size, wenn Sie über genügend RAM verfügen.
Ausdruck:
Innodb_pages_written / Innodb_buffer_pool_write_requests
Bedeutung: Schreiben von Anforderungen, die die Festplatte treffen mussten
Empfohlener Bereich: 0-15% Was tun, wenn der Bereich überschritten
wird: Check innodb_buffer_pool_size
Ausdruck:
Innodb_buffer_pool_reads / Uptime
Bedeutung: Liest
Empfohlener Bereich: 0-100 / Sek.
Was tun, wenn der Wert außerhalb des gültigen Bereichs liegt? Innodb_buffer_pool_size erhöhen?
Ausdruck:
(Innodb_buffer_pool_reads + Innodb_buffer_pool_pages_flushed) / Uptime
Bedeutung: InnoDB I / O
Empfohlener Bereich: 0-100 / Sek.
Was tun, wenn der Wert außerhalb des gültigen Bereichs liegt? Innodb_buffer_pool_size erhöhen?
Ausdruck:
Innodb_buffer_pool_pages_flushed / Uptime
Bedeutung: Schreibt (Flush)
Empfohlener Bereich: 0-100 / Sek.
Was tun, wenn der Wert außerhalb des gültigen Bereichs liegt? Innodb_buffer_pool_size erhöhen?
Ausdruck:
Innodb_buffer_pool_wait_free / Uptime
Bedeutung: Zähler für den Fall, dass sich keine freien Seiten in buffer_pool befinden. Das heißt, alle Seiten sind schmutzig.
Empfohlener Bereich: 0-1 / Sek.
Was ist zu tun, wenn der Wert außerhalb des gültigen Bereichs liegt? Stellen Sie zunächst sicher, dass innodb_buffer_pool_size angemessen eingestellt ist. Wenn das Problem weiterhin besteht, verringern Sie innodb_max_dirty_pages_pct
quelle
innodb_buffer_pool_size
Wert gibt an? Tatsächliche Größe oder konfigurierte?innodb_buffer_pool_size
gibt die maximale Größe an. In einem typischen Server beginnt der "Pufferpool" klein, wächst jedoch schnell auf diese maximale Größe und bleibt dort. Hinweis: Wenn dies größer als der Arbeitsspeicher (oder sogar knapp) ist, führt dies zu einem Austausch, der für die Leistung furchtbar ist.Ihr Titel fragt nach innodb_buffer_pool_size, aber ich vermute, dass dies nicht das eigentliche Problem ist. (Rolando kommentierte, warum Sie es groß genug eingestellt haben, sogar zu groß.)
Das ist unklar. 800 Benutzer im "Sleep" -Modus haben praktisch keine Auswirkungen auf das System. 800 aktive Threads wären eine Katastrophe. Wie viele Threads "laufen"?
Blockieren sich die Threads gegenseitig? In SHOW ENGINE INNODB STATUS finden Sie einige Hinweise zu Deadlocks usw.
Werden im Slowlog Fragen angezeigt? Optimieren wir sie.
Welche Version benutzt du? XtraDB (ein Drop-In-Ersatz für InnoDB) bietet eine bessere Möglichkeit, mehrere Kerne zu verwenden. 5.6.7 macht einen noch besseren Job.
innodb_buffer_pool_instances - ändere dies auf 8 (unter der Annahme eines 20G buffer_pool); es wird die Mutex-Konkurrenz leicht einschränken.
Sind Sie E / A oder CPU-gebunden? Die Lösungen unterscheiden sich je nach Ihrer Antwort grundlegend.
SSD - Es ist möglicherweise besser, wenn sich alle Protokolldateien auf Nicht-SSD-Laufwerken befinden.
quelle
Mehr Speicher ist immer besser, aber meiner Erfahrung nach sollte die Pufferpoolgröße in den meisten Fällen nicht zu Ihrer Datengröße passen. Viele Tabellen sind in den meisten Fällen inaktiv, wie z. B. herumliegende Sicherungstabellen. Daher sollte die Größe des Innodb-Pufferpools eher zu Ihrer aktiven Datengröße passen.
Der Zeitrahmen, den Sie für aktive Seiten festlegen, beeinflusst die Leistung, aber es gibt einen optimalen Punkt, an dem Sie bei einer größeren Puffergröße nicht so viel Leistung erzielen. Sie könnten das schätzen / berechnen / messen durch
show engine innodb status
quelle