Mysql innodb_buffer_pool_size ne kadar büyük olmalıdır?


170

Yaklaşık 5GB boyutunda olan sadece InnoDB tabloları ile meşgul bir veritabanı var. Veritabanı, SSD disklerini kullanan bir Debian sunucusunda çalışıyor ve sunucuyu durdurmak için doyuran ve öğüten maksimum bağlantı = 800 ayarlıyorum. Saniyedeki ortalama sorgu yaklaşık 2.5 K'dır. Bu yüzden, mümkün olan maksimum bağlantıya yer açmak için bellek kullanımını optimize etmem gerekiyor.

İnnodb_buffer_pool_size'nin toplam belleğin% 80'ine kadar olması gerektiğini önerdim. Diğer taraftan tuning-primer betiğinden bu uyarıyı alıyorum:

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

İşte benim mevcut innodb değişkenlerim:

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

İlgili olabilecek bir not: Drupal'dan (ayrı bir web sunucusunda bulunan) veritabanına büyük bir yazı (10KB'den fazla) eklemeye çalıştığımda, veritabanının sonsuza kadar sürdüğünü ve sayfanın doğru dönmediğini görüyorum.

Bunlarla ilgili olarak, optimum performans için benim innodb_buffer_pool_size'nin ne olması gerektiğini merak ediyorum. Bu ve diğer parametreleri bu senaryo için en uygun şekilde ayarlama önerileriniz için teşekkür ederim.

Yanıtlar:


252

Kişisel innodb_buffer_pool_size çok büyüktür. Ayarladınız 20971520000. Bu 19.5135 GB. Yalnızca 5GB InnoDB verileri ve dizinleri varsa, yalnızca yaklaşık 8GB olmalıdır. Bu bile çok yüksek olabilir.

İşte yapmanız gerekenler. İlk önce bu sorguyu çalıştır

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;

Bu, tüm InnoDB Veri ve Dizinlerine göre% 60 eklenmiş RIBPS, Önerilen InnoDB Tampon Havuz Boyutu'nu verecektir.

Örneğin

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>

Bu çıktıyla, /etc/my.cnf dosyasında aşağıdakileri ayarlayabilirsiniz.

[mysqld]
innodb_buffer_pool_size=8G

Sonraki, service mysql restart

Yeniden başlattıktan sonra bir veya iki hafta mysql çalıştırın. Sonra bu sorguyu çalıştırın:

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;

Bu, şu anda InnoDB Buffer Pool'da InnoDB Data tarafından kaç GB bellek kullanıldığını size verecektir.

Bu konuda daha önce yazdım: Ne innodb_buffer_pool ve neden ..?

DataGBYeniden yapılandırmak, yeniden başlatmak ve bir hafta beklemek yerine, şu anda bu sorguyu çalıştırabilirsiniz .

Bu değer DataGB, InnoDB Buffer Pool'un ne kadar büyük olması gerektiğine daha çok benziyor (innodb_change_buffer_max_size içinde belirtilen yüzde). Bunun şu anda ayırdığınız 20000 milyondan daha az olacağına eminim. RAM'deki tasarruflar, diğer şeyleri ayarlamak için kullanılabilir

CAVEAT # 1

Bunu not etmek çok önemlidir: Bazen, InnoDB innodb_buffer_pool_size için değerin üzerinde% 10 daha fazla bir değer gerektirebilir . İşte MySQL Dokümantasyonunun bu konuda söylediği:

Bu değeri ne kadar büyük ayarlarsanız, tablolardaki verilere erişmek için o kadar az disk G / Ç gerekir. Özel bir veritabanı sunucusunda, bunu makinenin fiziksel bellek boyutunun% 80'ine kadar ayarlayabilirsiniz. Bu diğer sorunlar ortaya çıkarsa, bu değeri geri ölçeklemeye hazır olun:

Fiziksel bellek için rekabet, işletim sisteminde sayfalamaya neden olabilir.

InnoDB, tamponlar ve kontrol yapıları için ek bellek ayırır, böylece tahsis edilen toplam alan, belirtilen boyuttan yaklaşık% 10 daha büyük olur.

Adres alanının bitişik olması gerekir; bu, Windows ile belirli adreslerde yüklenen DLL'lerde sorun olabilir.

Tampon havuzunu başlatma zamanı kabaca boyutuyla orantılıdır. Büyük kurulumlarda, bu başlatma süresi önemli olabilir. Örneğin, modern bir Linux x86_64 sunucusunda, 10 GB'lık bir arabellek havuzunun başlatılması yaklaşık 6 saniye sürer. Bkz. Bölüm 8.9.1, “InnoDB Tampon Havuzu” .

CAVEAT # 2

Ben aşağıdaki değerleri my.cnf

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

Bu numara InnoDB'nin birden fazla çekirdeğe erişmesini engelleyecek

Lütfen aşağıdakileri ayarlayın:

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

Bu konuda daha önce DBA StackExchange'te yazdım.

Sadece daha özlü formülü kullanarak ServerFault böyle bir soruyu yanıtladı :

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;

1
Bu harika yazı için teşekkürler! SELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM...İle başlayan formülünüz MySQL 5.7'de aşağıdaki hatayı veriyor : " 'INFORMATION_SCHEMA.GLOBAL_STATUS' özelliği devre dışı; 'show_compatibility_56' belgelerine bakın ." Herhangi bir şans eseri güncellenmiş bir versiyona sahip misiniz?
Benjamin

307 RIBPS ve 264G alıyorum. Bu, 307GB RAM'e ihtiyacım olduğu anlamına mı geliyor?
E_Blue

Daha çok 264G gibi. Ancak bunun için yeterli RAM'e sahip olmalısınız, aksi takdirde sisteminizde başka ne çalıştığına bağlı olarak RAM'inizin% 80'ini mysql'ye verin.
sjas 28:16

2
Şimdiye kadar okuduğum en güzel yazı! 3GB civarında büyük bir veri tabanım var. Cevabınızı / makalenizi okuduktan ve bağlantı hızı
2x'e

4
@Benjamin: MySQL 5.7.6'dan itibaren information_schema performance_schema ile birleştirilir. Bu yüzden sadece çalışması için sorguda "information_schema" "performans_schema" olarak değiştirin. Kaynak: dev.mysql.com/doc/refman/5.7/en/status-table.html
Ralph Bolton

11

Böyle bir şey mi? Kullanılması SHOW VARIABLESve SHOW GLOBAL STATUS:

İfade: innodb_buffer_pool_size / _ram
Anlamı: InnoDB buffer_pool için kullanılan RAM% 'si
Önerilen aralık: % 60-80%

İfade: Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests
Anlamı: Diske basmak zorunda kalan istekleri oku
Önerilen aralık: % 0-2
Aralık dışındaysa ne yapmalısınız : Yeterli düzeyde ise innodb_buffer_pool_size değerini artırın VERİ DEPOSU.

İfade: Innodb_pages_read / Innodb_buffer_pool_read_requests
Anlamı: Diski vurmak zorunda olan istekleri oku
Önerilen aralık: % 0-2%
Aralık dışıysa ne yapmalı: Eğer yeterli RAM varsa, innodb_buffer_pool_size değerini artırın.

İfade: Innodb_pages_written / Innodb_buffer_pool_write_requests
Anlamı: Diske çarpması gereken istekleri yazın
Önerilen aralık: % 0-15% Aralık dışıysa
ne yapılabilir: Kontrol innodb_buffer_pool_size

İfade: Innodb_buffer_pool_reads / Uptime
Anlamı: Okur
Önerilen aralık: 0-100 / sn.
Menzil dışında ise ne yapılmalı : Innodb_buffer_pool_size değerini arttırın?

İfade: (Innodb_buffer_pool_reads + Innodb_buffer_pool_pages_flushed) / Uptime
Anlamı: InnoDB I / O
Tavsiye edilen aralık: 0-100 / sn.
Menzil dışında ise ne yapılmalı : Innodb_buffer_pool_size değerini arttırın?

İfade: Innodb_buffer_pool_pages_flushed / Uptime
Anlamı: Yazıyor (temizler)
Önerilen aralık: 0-100 / sn.
Menzil dışında ise ne yapılmalı : Innodb_buffer_pool_size değerini arttırın?

İfade: Innodb_buffer_pool_wait_free / Uptime
Anlamı: buffer_pool'da boş sayfa olmadığı zamanki sayacı. Yani, tüm sayfalar kirli.
Önerilen aralık: 0-1 / sn.
Menzil dışında ise ne yapılmalı : Önce innodb_buffer_pool_size'nin makul şekilde ayarlandığından emin olun; eğer hala sorun varsa, innodb_max_dirty_pages_pct değerini azaltın


Güzel yorum için teşekkürler @Rick. Hangi innodb_buffer_pool_sizedeğeri belirtir? Gerçek boyut veya yapılandırılmış olan?
joker

1
@joker - innodb_buffer_pool_sizemaksimum boyutu gösterir. Tipik bir sunucuda "arabellek havuzu" küçük başlar, ancak hızlı bir şekilde bu maksimum boyuta büyür ve orada kalır. Not: Bu RAM'den daha büyükse (veya hatta yakınsa), bu durum performans açısından korkunç bir değiş tokuşa neden olur.
Rick James

7

Başınız innodb_buffer_pool_size hakkında sorular soruyor, ancak asıl sorun olmadığını düşünüyorum. (Rolando, neden yeterince büyük, hatta çok büyük olduğunu belirtti.)

Maksimum bağlantı ayarlarım = 800; bu da sunucuyu durdurmak için doyurur ve öğütür.

Bu belli değil. "Uyku" modundaki 800 kullanıcının sistem üzerinde neredeyse sıfır etkisi var. 800 aktif iplik bir felaket olur. Kaç tane "çalışıyor" var?

Dişler birbirini engelliyor mu? Kilitlenme, vb. Bazı ipuçları için bkz. SHOW ENGINE INNODB STATUS.

Slowlog'da herhangi bir soru var mı? Onları optimize edelim.

Hangi sürümü kullanıyorsun? XtraDB (InnoDB için açılan bir yedek), birden fazla çekirdek kullanarak daha iyi bir iş çıkarır. 5.6.7 daha iyi bir iş çıkarır.

innodb_buffer_pool_instances - bunu 8 olarak değiştirin (20G buffer_pool varsayarak); Mutex çekişmesini biraz kesecek.

G / Ç'ye bağlı mısınız yoksa CPU'ya mı bağlısınız? Çözümler, cevabınıza bağlı olarak, kökten farklıdır.

SSD - Tüm günlük dosyalarının SSD olmayan sürücülerde olması daha iyi olabilir.


6

Daha fazla bellek her zaman daha iyidir, ancak deneyimlerime göre çoğu zaman arabellek havuzu boyutunun çoğu veri boyutunuza uymamalıdır. Çoğu tablo, çoğu zaman etkin değildir, etrafta yatan yedekleme tabloları gibi, bu nedenle innodb arabellek havuzu boyutunun size gerçek veri boyutuna uyması gerekir.

Etkin sayfalar için belirttiğiniz zaman çerçevesi performansı etkiler, ancak daha büyük bir arabellek boyutu için daha fazla performans alamayacağınız en uygun nokta vardır. Bunu tahmin edebilir / hesaplayabilir / ölçebilirdiniz.show engine innodb status

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.