MySQL:「最大メモリ使用量」を下げるにはどうすればよいですか?


15

私は最近、メモリ不足の結果としてスラッシングに問題を抱えています。(私のVPSの合計は256Mです)

mysqltuner.plを使用してMySQLを調整しようとしていますが、次の結果が得られます。

--------一般統計---------------------------------------- ----------
[-] MySQLTunerスクリプトのバージョンチェックをスキップしました
[OK]現在サポートされているMySQLバージョン5.0.51a-3ubuntu5.4-logを実行しています
[OK] 64ビットアーキテクチャでの動作

--------ストレージエンジン統計--------------------------------------- ----
[-]ステータス:+アーカイブ-BDB-フェデレーテッド-InnoDB -ISAM -NDBCluster 
[-] MyISAMテーブルのデータ:114M(テーブル:454)
[!!]断片化されたテーブルの総数:34

--------パフォーマンスメトリック---------------------------------------- ---------
[-]最大40秒(570 q [14.250 qps]、23 conn、TX:154K、RX:23K)
[-]読み取り/書き込み:100%/ 0%
[-]合計バッファ:338.0Mグローバル+スレッドあたり2.7M(最大20スレッド)
[!!]可能な最大メモリ使用量:392.9M(インストールされたRAMの153%)
[OK]クエリが遅い:0%(5/570)
[OK]利用可能な接続の最大使用率:15%(3/20)
[!!]キーバッファサイズ/ MyISAMインデックスの合計:8.0M / 9.4M
[!!]キーバッファーヒット率:57.1%(7キャッシュ/ 3読み取り)
[OK]クエリキャッシュの効率:21.9%(7キャッシュ/ 32選択)
[OK] 1日あたりのクエリキャッシュプルーニング:0
[OK]一時テーブルを必要とするソート:0%(0一時ソート/ 1ソート)
[OK]ディスク上に作成された一時テーブル:0%(ディスク上に0 /合計32)
[OK]スレッドキャッシュヒット率:86%(3つ作成/ 23接続)
[OK]テーブルキャッシュヒット率:26%(128を開く/ 484を開く)
[OK]使用されるオープンファイルの制限:25%(259 / 1K)
[OK]すぐに取得されるテーブルロック:100%(492即時/ 492ロック)

--------推奨事項----------------------------------------- ------------
一般的な推奨事項:
    OPTIMIZE TABLEを実行して、パフォーマンスを向上させるためにテーブルを最適化します
    MySQLは24時間以内に起動しました-推奨事項は不正確な場合があります
    システムの安定性のために全体的なMySQLメモリフットプリントを削減します
調整する変数:
  *** MySQLの最大メモリ使用量が危険なほど高くなっています***
  *** MySQLバッファー変数を増やす前にRAMを追加してください***
    key_buffer_size(> 9.4M)

しかし、最大メモリ使用量を減らす方法について少し混乱していますか?key_bufferとmax_connectionsに基づいているようですが、他にも何か関係があるはずです。

my.cnf:

key_buffer = 8M
max_allowed_pa​​cket = 12M
thread_stack = 128K
thread_cache_size = 8
max_connections = 20
table_cache = 128
tmp_table_size = 256M
max_heap_table_size = 256M
join_buffer_size = 256K
query_cache_limit = 8M
query_cache_size = 64M

私はMySQLチューニングの記事を読み通そうとしましたが、彼らは自分が何をしているかをすでに知っている人を対象にしているようです!任意の助けをいただければ幸いです。ありがとう!


1
私はコメンターのアドバイスに従い、それを妥当なレベルに引き下げましたが、それらの価値にとって健全な球場がどんなものなのか、まだ知りたいです。オンラインの記事の中には64Kを使用するものもあれば、同じ値で512Mを推奨するものもあります!
ニック

回答:


10

256Mのサーバーがありますが、すべてを使用することはできません。OSのオーバーヘッドがあることを忘れないでください。それに、他の人が言ったようにあなたがコミットしすぎているという事実を加えて、ここで間違いなくスラッシングするでしょう。256Mは小規模なDBにのみ十分であり、構成したものでは20接続で十分です。

1)最大接続数を4に減らします(20個のうち3個を使用しています)

2)クエリキャッシュを最適化する。8Mは非常に大きく、合計64Mはヒット/プルーンに基づいて多くなります。4/32コンボを試して、それがどうなるかを見てください。本当に2/24のコンボが効果的だと思います。

3)一時テーブルを必要とするソートがありません。なぜそこにmax_heap_table_size動詞があるのですか?コメントアウト、デフォルトを使用

4)実際に128個のテーブルがありますか?そのtable_cacheを半分に64または48にカットしてみてください

5)thread_cache_sizeを4に減らす

6)これらのテーブルを最適化して断片化を減らします

これらは、最初にいくつかのものです。必要なものを把握するための実際のプロファイリングをせずに、構成に大量の数字を投げて混乱を引き起こしたようです。他のすべてが失敗した場合は、デフォルトに戻ってカスタム設定を削除し、Googleにあるパフォーマンスチューニングガイドを使用して最初からやり直してください。SHOW VARIABLESとSHOW STATUSの出力を取得し、数えきれないほどのチューニングガイドのいずれかを見つけて、実際の実際の数値を方程式にプラグインすると、構成ファイルに入れる必要のある正確な数値がわかります。


3
これは古い質問に対する古い答えですが、askerによって投稿されたmysqltunerの結果では、サーバーは40秒間しか稼働していないため、サーバーが受ける負荷を正確に判断するのに十分な時間ではありません。 。理想的には、1日以上にわたってmysqltunerを数回実行し、結果を分析します。それ以外はあなたの提案は健全です。
instanceofTom

7

私はMySQLの第一人者ではないので、この情報で問題を診断することはできませんが、ソースコードで式を検索してみました。ここにあります:

server_buffers + total_per_thread_buffers * max_connections

どこ:

server_buffers = key_buffer_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + query_cache_size

そして:

total_per_thread_buffers = read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size

ここで、これらの各値を確認し、どれがこの膨大な数の原因であるかを把握する必要があります。また、このスクリプトを無制限に信頼しないでください-DBサーバーの1つで実行しようとしましたが、最大メモリは物理メモリの合計量の140%であると計算されましたが、システムは安定性の問題なく何年も実行されています。

幸運を!


0

私の記憶が正しければ、MySQL Tunerは次の式を使用して最大使用量を推定します。

read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size

MySQLの特定の設定には定義された制限がないため、これは100%正確ではなく、実際には単なる推定にすぎないことに注意してください。

構成ファイルの一部の設定を調整してチューナーを再度実行することもできますが、my.cnfの変更、再起動、チューナーの実行に時間を費やす時間がなければ、専門家の助けを求めることをお勧めします。


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