mysql innodb_buffer_pool_sizeの大きさはどれくらいですか?


170

私は、約5GBのサイズのInnoDBテーブルのみを持つビジーなデータベースを持っています。データベースはSSDディスクを使用してDebianサーバーで実行され、最大接続数= 800に設定しました。1秒あたりの平均クエリは約2.5Kです。そのため、可能な限り最大の接続を確保するために、メモリ使用量を最適化する必要があります。

私は、innodb_buffer_pool_sizeが合計メモリの最大%80であるべきだという提案を見てきました。一方、私はチューニングプライマースクリプトからこの警告を受け取ります。

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

現在の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                                                                                                                      |

関連する可能性のあるサイドノート:Drupal(別のWebサーバー上にある)からデータベースに大きな投稿(たとえば10KB以上)を挿入しようとすると、それが永遠に続き、ページが正しく戻りません。

これらについては、最適なパフォーマンスを得るためにinnodb_buffer_pool_sizeをどのようにすべきか疑問に思っています。このシナリオに最適なパラメータを設定することをお勧めします。

回答:


252

あなたのinnodb_buffer_pool_sizeは膨大です。に設定されてい20971520000ます。それは19.5135 GBです。InnoDBデータとインデックスが5 GBのみの場合、約8 GBしか必要ありません。これでも高すぎる可能性があります。

これがあなたがすべきことです。最初にこのクエリを実行します

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;

これにより、すべてのInnoDBデータとインデックスに基づいたRIBPS、推奨されるInnoDBバッファープールサイズ、さらに60%が得られます。

例えば

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>

この出力を使用すると、/ etc / my.cnfで次を設定します。

[mysqld]
innodb_buffer_pool_size=8G

次、 service mysql restart

再起動後、1〜2週間mysqlを実行します。次に、このクエリを実行します。

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;

これにより、現時点でInnoDBバッファープール内のInnoDBデータが使用している実際のGBのメモリ数がわかります。

以前にこれについて書いたことがあります:innodb_buffer_poolの設定内容とその理由..?

DataGB再構成、再起動、1週間待つのではなく、今すぐこのクエリを実行することができます。

この値DataGBは、InnoDBバッファープールの大きさ+(innodb_change_buffer_max_sizeで指定されたパーセンテージ)に似ています。これは、現在予約している20000Mよりもはるかに少ないと確信しています。RAMの節約は、次のような他の調整に使用できます。

警告#1

これは非常に重要です:InnoDBでは、innodb_buffer_pool_sizeの値に対して10%の追加が必要になる場合があります。これについて、MySQLのドキュメントには次のことが記載されています

この値を大きくすると、テーブル内のデータにアクセスするために必要なディスクI / Oが少なくなります。専用のデータベースサーバーでは、これをマシンの物理メモリサイズの最大80%に設定できます。これらの他の問題が発生した場合、この値を縮小する準備をしてください。

物理メモリの競合により、オペレーティングシステムでページングが発生する場合があります。

InnoDBはバッファーと制御構造用に追加のメモリを予約するため、割り当てられた合計スペースは指定されたサイズよりも約10%大きくなります。

アドレス空間は連続している必要があります。これは、特定のアドレスでロードされるDLLを使用するWindowsシステムで問題になる可能性があります。

バッファプールを初期化する時間は、そのサイズにほぼ比例します。大規模なインストールでは、この初期化に時間がかかる場合があります。たとえば、最新のLinux x86_64サーバーでは、10GBのバッファプールの初期化には約6秒かかります。セクション8.9.1 「InnoDBバッファープール」を参照してください。

警告#2

次の値が表示されます my.cnf

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

これらの数は、InnoDBが複数のコアにアクセスするのを妨げます

以下を設定してください。

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

DBA StackExchangeでこれについて書いたことがあります

私はより簡潔な式を使用してServerFaultの中でこのような質問に答え

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
この素晴らしい投稿をありがとう!で始まる式はSELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM...、MySQL 5.7で次のエラーを生成します。「「INFORMATION_SCHEMA.GLOBAL_STATUS」機能は無効になっています。「show_compatibility_56」のドキュメントを参照してください。」更新されたバージョンはありますか?
ベンジャミン

307 RIBPSと264Gを取得します。つまり、307GBのRAMが必要ですか?
E_Blue

264Gに似ています。ただし、そのために十分なRAMを用意する必要があります。それ以外の場合は、システムで実行される他の内容に応じて、前述のRAMの80%をmysqlに割り当てます。
sjas

2
私が今まで読んだ中で最高の投稿!約3GBのデータベースがあります。あなたの答え/記事とリンク速度を読んだ後に最大2倍だ
fat_mike

4
@Benjamin:MySQL 5.7.6以降、information_schemaはperformance_schemaにマージされます。そのため、クエリで「information_schema」を「performance_schema」に変更するだけで機能します。ソース:dev.mysql.com/doc/refman/5.7/en/status-table.html
ラルフボルトン

11

このようなもの?SHOW VARIABLESand を使用SHOW GLOBAL STATUS

表現: innodb_buffer_pool_size / _ram
意味: InnoDB buffer_poolに使用されるRAMの割合
推奨範囲: 60〜80%

表現: Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests
意味: ディスクにヒットする必要がある読み取り要求
推奨範囲: 0-2%
範囲 外の場合の対処十分な数がある場合はinnodb_buffer_pool_sizeを増やす羊。

式: Innodb_pages_read / Innodb_buffer_pool_read_requests
意味: ディスクをヒットする必要がある読み取り要求
推奨範囲: 0〜2%
範囲外の 場合の対処十分なRAMがある場合は、innodb_buffer_pool_sizeを増やします。

表現: Innodb_pages_written / Innodb_buffer_pool_write_requests
意味: ディスクにヒットする必要がある書き込み要求
推奨範囲: 0-15%範囲外の場合の対処
innodb_buffer_pool_sizeを確認します。

式: Innodb_buffer_pool_reads / Uptime
意味: 読み取り
推奨範囲: 0-100 /秒。
範囲外の場合の 対処方法 innodb_buffer_pool_sizeを増やしますか?

表現: (Innodb_buffer_pool_reads + Innodb_buffer_pool_pages_flushed) / Uptime
意味: InnoDB I / O
推奨範囲: 0-100 /秒。
範囲外の場合の 対処方法 innodb_buffer_pool_sizeを増やしますか?

表現: Innodb_buffer_pool_pages_flushed / Uptime
意味: 書き込み(フラッシュ)
推奨範囲: 0-100 /秒。
範囲外の場合の 対処方法 innodb_buffer_pool_sizeを増やしますか?

式: Innodb_buffer_pool_wait_free / Uptime
意味: buffer_poolに空きページがない場合のカウンター。つまり、すべてのページが汚れています。
推奨範囲: 0-1 /秒。
範囲外の場合の 対処方法まず、innodb_buffer_pool_sizeが適切に設定されていることを確認してください。それでも問題が解決しない場合は、innodb_max_dirty_pages_pctを減らします


素敵なコメントをありがとう@Rick。どのようなinnodb_buffer_pool_size値が指定されていますか?実際のサイズまたは構成されたもの?
ジョーカー

1
@joker- innodb_buffer_pool_size最大サイズを示します。典型的なサーバーでは、「バッファプール」は小さく始まりますが、その最大サイズまで急速に成長し、そこに留まります。注:これがRAMよりも大きい(または近い)場合、スワッピングが発生し、パフォーマンスが低下します。
リックジェームズ

7

あなたのタイトルはinnodb_buffer_pool_sizeについて尋ねていますが、それは本当の問題ではないと思います。(ロランドは、なぜあなたはそれを十分に大きく、さらには大きくしすぎたのかについてコメントしました。)

最大接続数= 800に設定しましたが、これは時々飽和状態になり、サーバーを停止するように粉砕します。

それは不明です。「スリープ」モードの800人のユーザーは、システムにほとんど影響を与えません。800個のアクティブなスレッドは災害になります。「実行中」のスレッドの数

スレッドは互いにブロックしていますか?デッドロックなどの手がかりについては、SHOW ENGINE INNODB STATUSをご覧ください。

スローログにクエリが表示されていますか?それらを最適化しましょう。

どのバージョンを使用していますか?XtraDB(InnoDBのドロップイン置換)は、複数のコアを使用するより良い仕事をします。5.6.7はさらに良い仕事をします。

innodb_buffer_pool_instances-これを8に変更します(20G buffer_poolを想定); ミューテックスの競合を少し減らします。

I / Oバウンドですか、それともCPUバウンドですか?あなたの答えに応じて、解決策は根本的に異なります。

SSD-すべてのログファイルが非SSDドライブ上にあるとより良い場合があります。


6

メモリは多ければ多いほど良いのですが、私の経験では、ほとんどの場合、バッファプールサイズはデータサイズに適合しないはずです。バックアップテーブルのように、多くのテーブルはほとんどの場合非アクティブです。そのため、innodbバッファープールのサイズは、実際のデータサイズに合うはずです。

アクティブなページに指定する時間枠はパフォーマンスに影響を与えますが、最適なポイントがあり、バッファサイズを大きくしてもパフォーマンスが向上しません。あなたはそれを推定/計算/測定することができますshow engine innodb status

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.