it-swarm-eu.dev

Jak velký by měl být mysql innodb_buffer_pool_size?

Mám zaneprázdněnou databázi s pouze tabulkami InnoDB, které mají velikost asi 5 GB. Databáze běží na serveru Debian pomocí SSD disků a nastavil jsem maximální připojení = 800, které někdy saturují a brousí server, aby se zastavil. Průměrný dotaz za sekundu je asi 2,5 kB. Musím tedy optimalizovat využití paměti, abych získal prostor pro maximální možné připojení.

Viděl jsem návrhy, že by innodb_buffer_pool_size měla být až% 80 z celkové paměti. Na druhé straně toto varování dostávám ze skriptu ladicího primeru:

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

Zde jsou mé současné proměnné innodb:

| 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                                                                                                                      |

Vedlejší poznámka, která by mohla být relevantní: Vidím, že když se pokusím vložit velký příspěvek (řekněme přes 10 kB) z Drupal (který sedí na samostatném webovém serveru) do databáze, trvá to navždy) a stránka se nevrací správně.

Pokud jde o tyto, zajímalo by mě, jaký by měl být můj innodb_buffer_pool_size pro optimální výkon. Oceňuji vaše návrhy optimálně nastavit tento a další parametry pro tento scénář.

186
alfish

Vaše innodb_buffer_pool_size je obrovská. Nastavili jste ji na 20971520000. To je 19,5135 GB. Pokud máte pouze 5 GB dat a indexů InnoDB, měli byste mít pouze asi 8 GB. I to může být příliš vysoké.

Zde je to, co byste měli udělat. Nejprve spusťte tento dotaz

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;

Tím získáte RIBPS, doporučenou velikost fondu vyrovnávacích pamětí InnoDB, založenou na všech datech a indexech InnoDB, s dalšími 60%.

Například

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>

S tímto výstupem byste nastavili následující v /etc/my.cnf

[mysqld]
innodb_buffer_pool_size=8G

Další, service mysql restart

Po restartu spusťte MySQL týden nebo dva. Potom spusťte tento dotaz:

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;

Tím získáte informace o tom, kolik skutečných GB paměti právě používá InnoDB Data ve fondu vyrovnávacích pamětí InnoDB v tuto chvíli.

O tom jsem již psal dříve: Co nastavit innodb_buffer_pool a proč ..?

Tento dotaz DataGB byste mohli spustit právě teď, a ne znovu nakonfigurovat, restartovat a čekat týden.

Tato hodnota DataGB se blíže podobá tomu, jak velký by měl být fond vyrovnávacích pamětí InnoDB + (procento určené v innodb_change_buffer_max_size). Jsem si jist, že to bude mnohem méně než 20000M, které jste si právě rezervovali. Úspory v RAM) lze použít k vyladění dalších věcí, jako je

CAVEAT # 1

To je velmi důležité poznamenat: InnoDB občas může vyžadovat dalších 10% nad hodnotu pro innodb_buffer_pool_size . Zde je to, co dokumentace MySQL k tomu říká:

Čím větší je tato hodnota, tím méně disk I/O je potřeba pro přístup k datům v tabulkách. Na vyhrazeném databázovém serveru můžete nastavit až 80% velikosti fyzické paměti počítače. Pokud dojde k těmto dalším problémům, buďte připraveni tuto hodnotu vrátit zpět.

Soutěž o fyzickou paměť může v operačním systému způsobit stránkování.

InnoDB si vyhrazuje další paměť pro vyrovnávací paměti a řídicí struktury, takže celkový přidělený prostor je přibližně o 10% větší než specifikovaná velikost.

Adresový prostor musí být souvislý, což může být problém v systémech Windows s dll, které se načítají na konkrétní adresy.

Čas k inicializaci fondu vyrovnávacích pamětí je zhruba úměrný jeho velikosti. U velkých instalací může být tento čas inicializace významný. Například na moderním serveru Linux x86_64 trvá inicializace fondu vyrovnávacích pamětí 10 GB přibližně 6 sekund. Viz Oddíl 8.9.1, „Fond vyrovnávacích pamětí InnoDB“ .

CAVEAT # 2

I Ve vašem my.cnf

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

Toto číslo bude bránit InnoDB v přístupu k více jádrům

Nastavte prosím následující:

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

O tom jsem již napsal v DBA StackExchange

Právě jsem odpověděl na otázku jako je tato v Server Fault pomocí stručnějšího vzorce:

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

Něco takového? Použitím SHOW VARIABLES a SHOW GLOBAL STATUS:

Výraz: innodb_buffer_pool_size / _ram
Význam: % z RAM použité pro InnoDB buffer_pool
Doporučený rozsah: 60 ~ 80%

Výraz: Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests
Význam: Přečtěte si požadavky, které musely zasáhnout disk
Doporučený rozsah: 0-2%
Co dělat, když je mimo dosah: Pokud máte dostatek paměti RAM, zvyšte velikost innodb_buffer_pool_size.

Výraz: Innodb_pages_read / Innodb_buffer_pool_read_requests
Význam: Přečtěte si požadavky, které musely zasáhnout disk
Doporučený rozsah: 0-2%
Co dělat, když je mimo dosah: Pokud máte dostatek paměti RAM, zvyšte velikost innodb_buffer_pool_size.

Výraz: Innodb_pages_written / Innodb_buffer_pool_write_requests
Význam: Zápis požadavků, které musely zasáhnout disk
Doporučený rozsah: 0-15%
Co dělat, když je mimo dosah: Zkontrolujte innodb_buffer_pool_size

Výraz: Innodb_buffer_pool_reads / Uptime
Význam: Čte
Doporučený rozsah: 0-100/s.
Co dělat, když je mimo dosah: Zvětšit innodb_buffer_pool_size?

Výraz: (Innodb_buffer_pool_reads + Innodb_buffer_pool_pages_flushed) / Uptime
Význam: InnoDB I/O
Doporučený rozsah: 0-100/s.
Co dělat, když je mimo dosah: Zvětšit innodb_buffer_pool_size?

Výraz: Innodb_buffer_pool_pages_flushed / Uptime
Význam: Zápisy (návaly)
Doporučený rozsah: 0-100/s.
Co dělat, když je mimo dosah: Zvětšit innodb_buffer_pool_size?

Výraz: Innodb_buffer_pool_wait_free / Uptime
Význam: Počítadlo pro případ, že v buffer_pool nejsou žádné volné stránky. To znamená, že všechny stránky jsou špinavé.
Doporučený rozsah: 0-1/s.
Co dělat, když je mimo dosah: Nejprve se ujistěte, že je innodb_buffer_pool_size nastavena přiměřeně; pokud potíže přetrvávají, snižte hodnotu innodb_max_dirty_pages_pct

13
Rick James

Váš titul se ptá na innodb_buffer_pool_size, ale domnívám se, že to není skutečný problém. (Rolando komentoval, proč jste jej nastavili dostatečně velký, i když příliš velký.)

Nastavil jsem maximální připojení = 800, které někdy nasycuji a brousíme server, aby se zastavil.

To není jasné. 800 uživatelů v režimu spánku má prakticky nulový dopad na systém. 800 aktivních vláken by bylo katastrofou. Kolik vláken je spuštěných?

Blokují se navzájem vlákna? Podívejte se na SHOW ENGINE INNODB STATUS, kde najdete několik vodítek pro zablokování atd.

Zobrazují se v slowlogu nějaké dotazy? Pojďme je optimalizovat.

Jakou verzi používáte? XtraDB (náhradní náhrada za InnoDB) dělá lepší práci s použitím více jader. 5.6.7 dělá ještě lepší práci.

innodb_buffer_pool_instances - změňte to na 8 (za předpokladu, že 20G buffer_pool); to bude mírně snížit o sporu Mutex.

Jste vázáni I/O nebo jste vázáni CPU? Řešení se radikálně liší v závislosti na vaší odpovědi.

SSD - mohlo by být lepší, kdyby všechny soubory protokolu byly na jednotkách jiných než SSD.

7
Rick James

Více paměti je vždy lepší, ale podle mých zkušeností by velikost fondu vyrovnávacích pamětí neměla odpovídat velikosti vašich dat. Mnoho tabulek je ve většině případů neaktivní, například záložní tabulky ležící kolem, takže velikost fondu vyrovnávacích pamětí inodb by vám měla lépe vyhovovat velikosti aktivních dat.

Časový rámec, který určíte pro aktivní stránky, ovlivňuje výkon, ale existuje optimální bod, ve kterém nedosáhnete tohoto výkonu při větší velikosti vyrovnávací paměti. Dalo by se to odhadnout/vypočítat/změřit pomocí show engine innodb status

6
user77376