MySQL InnoDBバッファープールインスタンスの最適数


13

サーバーの特性

  • 合計システムRAM:8GB(MySQL + MySQL以外のものを実行、つまりMySQL専用ではない)
  • CPUコアの数:6
  • データベースに約2GBのデータがあります
  • InnoDBバッファープールサイズを4GBに設定しています

どちらが良いですか:

  • Innodbバッファープールインスタンスが1に設定されていますか?
  • Innodbバッファープールインスタンスが2(各2GB)に設定されていますか?
  • Innodbバッファープールインスタンスが4(各1GB)に設定されていますか?
  • Innodbバッファープールインスタンスを8(デフォルト設定)に設定

したがって、バッファプールインスタンスと、全体として「そのような大きなInnoDBバッファプールサイズがあると、インスタンスを使用するか、OSスワップが発生する」となる理由を判断する方法がわかりません。


「このような大きなInnoDBバッファープールサイズがあると、インスタンスを使用したり、OSスワップの影響を受けたり」したのはどこですか?
リックジェームズ

インスタンス数に関係なく、「MySQL以外のもの」のスペースを差し引いたの合計buffer_poolのRAMの70%で問題ありません。
リックジェームズ

すべてを「ヒップから撃つ」と見なす限り、私は答えを受け入れられるように設定することはできません。誰かが不思議に思っている場合は、4Gのバッファープールサイズと2つのインスタンスを使用しました。これは、同じマシンでphp-fpm + nginxを実行する8Gの合計メモリを備えたDebian 8.1で非常にうまく機能し、平均mysqlが平均60クエリ/秒で実行されます。
Adergaard、2015

回答:


7

MySQL 5.5に戻ると、これと同じことを考えていました。

私がそれらの年月を通して学んだことは次のとおりです:バッファープールがインストールされているRAMの半分よりも大きく、innodb_buffer_pool_instancesが1(5.5のデフォルト)である場合、スワッピングの脅威は常に差し迫っていました。

これについては前に説明しました。バッファプールインスタンスのサイズと数に関する経験則はありますか?。その投稿では、162 GBのバッファープールを備えたサーバー上に192 GBのRAMを備えたクライアントの例について述べました。innodb_buffer_pool_instancesが1の場合、スワッピングが発生しました。innodb_buffer_pool_instancesを2 に設定すると、状況が改善されました。

あなたの場合、バッファプールはちょうど半分なので、値1で問題ないかもしれません。チャンスはありません。2に設定します。

MySQL 5.6のデフォルトは8であるため、もう考える必要はありません。

私はこう言います:アクズミンスキーの答えは最高の原則を持っています。私の答えは、過去の経験(良い面と悪い面)に基づいてヒップから撮影することです。


ありえない!スワップは、プールインスタンスではなく、割り当てられたメモリの量に依存します。
リックジェームズ

デフォルトは8です。しかし、4に削減した場合、または16に増加した場合の違いは何ですか。メモリ/ストレージのペナルティまたはメリットはありますか?私が本当にここにいる唯一の理由は、mysqltunerがinnodb_buffer_pool_instances(= 1)を推奨しているが、その推奨を常に信頼しているわけではない。確かに、私は問題を抱えていません。
PJ Brunet

@PJBrunet InnoDBバッファープールがRAMの半分未満の場合、InnoDBバッファープールのインスタンスは1のままにすることができます
。– RolandoMySQLDBA

6

バッファー・プール・ミューテックスの競合を回避するために、バッファー・プール・インスタンスの数を増やす必要があります。

バッファプールサイズが8GBの場合、バッファプールのミューテックスの競合が発生することはないと思います。

更新0

元の質問では合計メモリは8GBでしたが、答えで8Gbバッファプールについて言及しました。確かに、バッファプールは8GB未満でなければなりません。4GBは良いスタートのように聞こえますが、スワッピングが発生しないことを確認してください。

更新1

// Yasufumiのスライドから(最近のMySQLバージョンでは出力が少し異なる場合があります)

バッファープールミューテックスに競合があるかどうかを判断するにはSHOW ENGINE INNODB STATUS、ピーク時に数十のサンプルを収集します。

次に、シェルスニペットを使用して集計します。

#!/bin/sh
cat $1.innodb | grep "Mutex at " | cut -d"," -f1 | sort | uniq -c > /tmp/tmp1.txt 
cat $1.innodb | grep "lock on " | cut -d"-"
-f2- | sort | uniq -c > /tmp/tmp2.txt
cat /tmp/tmp1.txt /tmp/tmp2.txt | sort -n > $1.contention rm /tmp/tmp1.txt /tmp/tmp2.txt

次のような出力が得られます。

.....
4 lock on RW-latch at 0x7fb86b2c9138 created in file dict/dict0dict.c line 1356
6 lock on RW-latch at 0x7fb86b2c4138 created in file dict/dict0dict.c line 1356
12 lock on RW-latch at 0x7fb86b2d9538 created in file dict/dict0dict.c line 1356
20 lock on RW-latch at 0x7fb86b2db138 created in file dict/dict0dict.c line 1356
22 Mutex at 0x7fb86b28f0e0 created file btr/btr0sea.c line 139
30 lock on RW-latch at 0x7fb86b2ba938 created in file dict/dict0dict.c line 1356
36 lock on RW-latch at 0x7fb86b2bad38 created in file dict/dict0dict.c line 1356
71 Mutex at 0x7fb86b28ecb8 created file buf/buf0buf.c line 597
164 lock on RW-latch at 0x7fb86b28f0b8 created in file btr/btr0sea.c line 139

バッファプールミューテックス待機の数が多い場合は、複数のバッファプールインスタンスを検討する必要があります。競合は、〜48G未満のバッファー・プールでは起こりそうにありません。


1
ただし、8GBのRAMだけに8Gのbuffer_poolはありませ
リックジェームズ

で、何DBSIZEすなわちInnoDBのバッファプールのサイズはなりますが、その後のインスタンスについて考え始めますか?私はあなたの答えを、これらの比較的小さなレベルでは、複数持つ理由はないと解釈します。正しい?あなたはこれがそうであるという情報源を得ましたか?MySQLのドキュメントには「マルチギガバイト」と書かれています。これは、私にとっては、非常にあいまいな表現方法です。実際、2 GBはマルチですが、それよりも大きなデータセットを参照していると思います ...
Adergaard

2

ご使用のOSに「swappiness」を設定している場合は、1に設定してください。問題は過度に攻撃的なOOMである可能性があります。


0

これを、同時に実行するMySQLスレッドの最大数と一致するように設定することをお勧めします。コア数を使用しています。

また、私は設定innodb_read_io_threadsしてinnodb_write_io_threads、この数と一致します。

場合はinnodb_buffer_pool_instances低すぎる、あなたのスレッドがそうであるセマフォ待ちで立ち往生します。これにより、システムがビジー状態であっても、CPUとI / Oの両方がアイドル状態のように見え、アプリケーションのレイテンシが解消されます。

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