it-swarm.com.de

Wie groß sollte mysql innodb_buffer_pool_size sein?

Ich habe eine ausgelastete Datenbank mit ausschließlich InnoDB-Tabellen, die ungefähr 5 GB groß ist. Die Datenbank wird auf einem Debian-Server mit SSD-Festplatten ausgeführt, und ich habe max. Verbindungen = 800 festgelegt, die manchmal gesättigt sind und den Server zum Stillstand bringen. Die durchschnittliche Abfrage pro Sekunde beträgt ca. 2,5 KB. Daher muss ich 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 ausmachen sollte. Auf der anderen Seite erhalte 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 der Versuch, einen großen Beitrag (z. B. über 10 KB) von Drupal (der sich auf einem separaten Webserver befindet) in die Datenbank einzufügen, für immer andauert und die Seite wird nicht korrekt zurückgegeben.

In Bezug auf diese frage ich mich, was meine innodb_buffer_pool_size für eine optimale Leistung sein sollte. Ich freue mich über Ihre Vorschläge, diesen und andere Parameter für dieses Szenario optimal einzustellen.

186
alfish

Ihre innodb_buffer_pool_size ist enorm. Sie haben es auf 20971520000 Eingestellt. Das sind 19.5135 GB. Wenn Sie nur 5 GB InnoDB-Daten und -Indizes haben, sollten Sie nur etwa 8 GB haben. Auch das kann zu hoch sein.

Folgendes sollten Sie tun. Führen Sie zuerst diese Abfrage aus

SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM
(SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
FROM information_schema.tables WHERE engine='InnoDB') A;

Dadurch erhalten Sie die empfohlene RIBPS-Größe des InnoDB-Pufferpools, basierend auf allen InnoDB-Daten und -Indizes, mit zusätzlichen 60%.

Zum Beispiel

mysql>     SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM
    ->     (SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
    ->     FROM information_schema.tables WHERE engine='InnoDB') A;
+-------+
| RIBPS |
+-------+
|     8 |
+-------+
1 row in set (4.31 sec)

mysql>

Mit dieser Ausgabe würden Sie Folgendes in /etc/my.cnf festlegen

[mysqld]
innodb_buffer_pool_size=8G

Als nächstes service mysql restart

Führen Sie MySQL nach dem Neustart ein oder zwei Wochen lang aus. Führen Sie dann diese Abfrage aus:

SELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM
(SELECT variable_value PagesData
FROM information_schema.global_status
WHERE variable_name='Innodb_buffer_pool_pages_data') A,
(SELECT variable_value PageSize
FROM information_schema.global_status
WHERE variable_name='Innodb_page_size') B;

Auf diese Weise erhalten Sie, wie viele GB Arbeitsspeicher derzeit von InnoDB-Daten im InnoDB-Pufferpool verwendet werden.

Ich habe darüber schon einmal geschrieben: Was soll innodb_buffer_pool gesetzt werden und warum ..?

Sie können diese DataGB-Abfrage jetzt einfach ausführen, anstatt eine Woche neu zu konfigurieren, neu zu starten und zu warten.

Dieser Wert DataGB ähnelt eher der Größe des InnoDB-Pufferpools + (in innodb_change_buffer_max_size angegebener Prozentsatz). Ich bin sicher, dass dies weit weniger sein wird als die 20000M, die Sie gerade reserviert haben. Die Einsparungen in RAM können verwendet werden, um andere Dinge wie zu optimieren

CAVEAT # 1

Dies ist sehr wichtig zu beachten: Manchmal benötigt InnoDB zusätzliche 10% über dem Wert für innodb_buffer_pool_size . Folgendes sagt die MySQL-Dokumentation dazu:

Je größer Sie diesen Wert festlegen, desto weniger Festplatten-E/A werden für den Zugriff auf Daten in Tabellen benötigt. Auf einem dedizierten Datenbankserver können Sie dies auf bis zu 80% der physischen Speichergröße des Computers einstellen. Seien Sie bereit, diesen Wert zu reduzieren, wenn folgende andere Probleme auftreten:

Die Konkurrenz um den physischen Speicher kann zu Paging im Betriebssystem führen.

InnoDB reserviert zusätzlichen Speicher für Puffer und Kontrollstrukturen, sodass der insgesamt zugewiesene Speicherplatz ungefähr 10% größer als die angegebene Größe ist.

Der Adressraum muss zusammenhängend sein. Dies kann auf Windows-Systemen mit DLLs, die an bestimmten Adressen geladen werden, ein Problem sein.

Die Zeit zum Initialisieren des Pufferpools ist ungefähr proportional zu seiner Größe. Bei großen Installationen kann diese Initialisierungszeit erheblich sein. Auf einem modernen Linux x86_64-Server dauert die Initialisierung eines 10-GB-Pufferpools beispielsweise ungefähr 6 Sekunden. Siehe Abschnitt 8.9.1, „Der InnoDB-Pufferpool“ .

CAVEAT # 2

Ich sehe die folgenden Werte in Ihrem my.cnf

| innodb_io_capacity                                | 200 |
| innodb_read_io_threads                            | 4   |
| innodb_thread_concurrency                         | 4   |
| innodb_write_io_threads                           | 4   |

Diese Nummer verhindert, dass InnoDB auf mehrere Kerne zugreift

Bitte stellen Sie Folgendes ein:

[mysqld]
innodb_io_capacity = 2000
innodb_read_io_threads = 64
innodb_thread_concurrency = 0
innodb_write_io_threads = 64

Ich habe darüber bereits im DBA StackExchange geschrieben

Ich habe gerade eine Frage wie diese in Server Fault mit einer präziseren Formel beantwortet:

SELECT CONCAT(CEILING(RIBPS/POWER(1024,pw)),SUBSTR(' KMGT',pw+1,1))
Recommended_InnoDB_Buffer_Pool_Size FROM
(
    SELECT RIBPS,FLOOR(LOG(RIBPS)/LOG(1024)) pw
    FROM
    (
        SELECT SUM(data_length+index_length)*1.1*growth RIBPS
        FROM information_schema.tables AAA,
        (SELECT 1.25 growth) BBB
        WHERE ENGINE='InnoDB'
    ) AA
) A;
273
RolandoMySQLDBA

Etwas wie das? Verwenden von SHOW VARIABLES und SHOW GLOBAL STATUS:

Ausdruck: innodb_buffer_pool_size / _ram
Bedeutung: % von RAM wird für InnoDB buffer_pool verwendet
Empfohlener Bereich: 60 ~ 80%

Ausdruck: Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests
Bedeutung: Lesen Sie Anforderungen, die auf die Festplatte gelangen mussten
Empfohlener Bereich: 0-2%
Was tun, wenn außerhalb der Reichweite: Erhöhen Sie innodb_buffer_pool_size, wenn Sie über genügend RAM verfügen.

Ausdruck: Innodb_pages_read / Innodb_buffer_pool_read_requests
Bedeutung: Lesen Sie Anforderungen, die auf die Festplatte gelangen mussten
Empfohlener Bereich: 0-2%
Was tun, wenn außerhalb der Reichweite: 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 Sie Anforderungen, die auf die Festplatte gelangen mussten
Empfohlener Bereich: 0-15%
Was tun, wenn außerhalb der Reichweite: Überprüfen Sie innodb_buffer_pool_size

Ausdruck: Innodb_buffer_pool_reads / Uptime
Bedeutung: Liest
Empfohlener Bereich: 0-100/Sek.
Was tun, wenn außerhalb der Reichweite: 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 außerhalb der Reichweite: Innodb_buffer_pool_size erhöhen?

Ausdruck: Innodb_buffer_pool_pages_flushed / Uptime
Bedeutung: Schreibt (Flushes)
Empfohlener Bereich: 0-100/Sek.
Was tun, wenn außerhalb der Reichweite: Innodb_buffer_pool_size erhöhen?

Ausdruck: Innodb_buffer_pool_wait_free / Uptime
Bedeutung: Zähler für den Fall, dass in buffer_pool keine freien Seiten vorhanden sind. Das heißt, alle Seiten sind schmutzig.
Empfohlener Bereich: 0-1/Sek.
Was tun, wenn außerhalb der Reichweite: Stellen Sie zunächst sicher, dass innodb_buffer_pool_size angemessen eingestellt ist. Wenn immer noch Probleme auftreten, verringern Sie innodb_max_dirty_pages_pct

13
Rick James

Ihr Titel fragt nach innodb_buffer_pool_size, aber ich vermute, dass dies nicht das eigentliche Problem ist. (Rolando hat kommentiert, warum Sie es groß genug eingestellt haben, sogar zu groß.)

Ich habe max Verbindungen = 800 gesetzt, die manchmal gesättigt sind und den Server zum Stillstand bringen.

Das ist unklar. 800 Benutzer im "Schlaf" -Modus haben praktisch keine Auswirkungen auf das System. 800 aktive Threads wären eine Katastrophe. Wie viele Threads "laufen"?

Blockieren sich die Threads gegenseitig? Unter SHOW ENGINE INNODB STATUS finden Sie einige Hinweise zu Deadlocks usw.

Werden im Slowlog Abfragen angezeigt? Optimieren wir sie.

Welche Version verwenden Sie? XtraDB (ein Ersatz für InnoDB) kann mehrere Kerne besser verwenden. 5.6.7 macht einen noch besseren Job.

innodb_buffer_pool_instances - ändere dies auf 8 (unter der Annahme eines 20G buffer_pool); Dadurch wird die Mutex-Konkurrenz leicht eingeschränkt.

Sind Sie E/A-gebunden oder sind Sie 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.

7
Rick James

Mehr Speicher ist immer besser, aber meiner Erfahrung nach sollte die Größe des Pufferpools meistens nicht zu Ihrer Datengröße passen. Viele Tabellen sind meistens inaktiv, 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 angeben, beeinflusst die Leistung, aber es gibt einen optimalen Punkt, an dem Sie bei einer größeren Puffergröße nicht mehr Leistung erzielen. Sie können dies mit show engine innodb status Schätzen/berechnen/messen.

6
user77376