web-dev-qa-db-ja.com

mySQLにメモリ制限を割り当てるにはどうすればよいですか?

mysqlチューナーは、mySQLがインストールされたRAMの166%を使用できると報告します。RAMの使用を制限するにはどうすればよいですか?

[!!]可能な最大メモリ使用量:426.8M(インストールされているRAMの166%)

6
HackToHell

どちらかを設定できます

  • すべてのMyISAM
  • すべてのInnoDB
  • MyISAMとInnoDBの混合

いずれかのエンジンにメモリを割り当てる前に、各ストレージエンジンでどのキャッシングが行われるかを検討することをお勧めします

[〜#〜] myisam [〜#〜] の構成

使用される主なメカニズムはキーキャッシュです。 .MYIファイルからのインデックスページのみをキャッシュします。キーキャッシュのサイズを変更するには、次のクエリを実行します。

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;

これにより、現在のデータセットが与えられたMyISAMキーキャッシュの推奨設定( key_buffer_size )が得られます( クエリは4Gで推奨をキャップします( 4096M) 32ビットOSの場合、4GBが上限です。64ビットの場合、8GBです。

InnoDB の構成

使用される主なメカニズムは、InnoDBバッファープールです。アクセスされたInnoDBテーブルからデータとインデックスページをキャッシュします。 InnoDBバッファープールのサイズを設定するには、次のクエリを実行します。

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;

これにより、現在のデータセットでのInnoDBバッファープールのサイズの推奨設定( innodb_buffer_pool_size ))が得られます。

InnoDBログファイル(ib_logfile0およびib_logfile1)のサイズを変更することを忘れないでください。 MySQLソースコードは、すべてのInnoDBログファイルの合計サイズの上限を4G(4096M)未満にする必要があります。 (注:Perconaサーバーのバイナリはこれを超えています。最近、単一のInnoDBログファイル用に4Gの大規模DBサーバーを innodb_log_file_size を使用してセットアップしました)

簡単にするために、ログファイルが2つしかない場合のサイズを以下に示します。

  • ステップ1)innodb_log_file_size = NNNを/etc/my.cnfに追加します(NNNはinnodb_buffer_pool_sizeの25%または2047Mのいずれか小さい方にする必要があります)
  • ステップ2)service mysql stop
  • ステップ3)rm/var/log/mysql/ib_logfile [01]
  • ステップ4)service mysql start(ib_logfile0およびib_logfile1が再作成されます)

[〜#〜]警告[〜#〜]

両方のクエリの最後にインラインクエリがあります:(SELECT 2 PowerOfTwo) B

  • (SELECT 0 PowerOf1024)は設定をバイト単位で示します
  • (SELECT 1 PowerOf1024)は設定をキロバイトで示します
  • (SELECT 2 PowerOf1024)はメガバイト単位の設定を示します
  • (SELECT 3 PowerOf1024)は設定をギガバイトで示します
  • 0未満または3より大きいパワーは受け入れられません

[〜#〜]エピローグ[〜#〜]

常識に代わるものはありません。メモリが限られている、ストレージエンジンが混在している、またはそれらの組み合わせがある場合は、さまざまなシナリオに合わせて調整する必要があります。

2GB RAMおよび16GBのInnoDBがある場合、innodb_buffer_pool_sizeとして512Mを割り当てます。

2GB RAM=および4GBのMyISAMインデックスがある場合、512Mをkey_buffer_sizeとして割り当てます。

2GB RAMと4GBのMyISAMインデックスと16GB InnoDBがある場合、key_buffer_sizeとして512Mを割り当て、innodb_buffer_pool_sizeとして512Mを割り当てます。

可能なシナリオは無限です!!!

何を割り当てても、DB接続とオペレーティングシステム用に十分なRAMを残してください)。

8
RolandoMySQLDBA

key_buffer_sizeinnodb_buffer_pool_sizemy.cnfを微調整する必要があります。これら2つはメモリ関連の最も重要な設定です。現在の値を取得するには、mysqlコマンドラインクライアントでshow variables like 'key_buffer_size';およびshow variables like 'innodb_buffer_pool_size';を使用します。

3
Alex

myisamエンジンの場合

key_buffer_size +(read_buffer_size + sort_buffer_size)* max_connections

この値は、mysqlが消費できるメモリの合計を示します。これは、RAMまたはRAMの60%未満です。innodbの場合innodb_buffer_pool_sizeは、あなたのRAMまたはRAMの60%

上記の値を調整して、RAM使用量がRAMの60%になるようにします。

3
Kevin Parker