LinuxサーバーでMySQLが使用するメモリ量に上限を設定する方法を知りたいのですが。
現在、MySQLは、新しいクエリが要求されるたびにメモリを占有し続けるため、最終的にメモリが不足します。 MySQLがその量を超えないように制限を設定する方法はありますか?
MySQLの最大メモリ使用量は、ハードウェア、設定およびデータベース自体に大きく依存します。
ハードウェアは明らかな部分です。 RAMが多ければ多いほど、高速なディスクftwになります。毎月または毎週のニュースレターを信じないでください。 MySQLは線形にスケーリングしません-Oracleハードウェア上でもです。それよりも少し複雑です。
一番下の行は次のとおりです。yourMySQLセットアップの推奨事項に関する一般的な経験則はありません。それはすべて、現在の使用法または予測に依存します。
MySQLは、その動作を最適化するために無数の変数とスイッチを提供します。問題が発生した場合は、座って(f'ing)マニュアルを読む必要があります。
データベースに関して-いくつかの重要な制約:
InnoDB
、MyISAM
、...)Stackoverflowに関するほとんどのMySQLのヒントでは、5〜8のいわゆる重要な設定について説明しています。まず、すべてが重要というわけではありません。 InnoDBに多くのリソースを割り当て、InnoDBを使用しないことは、これらのリソースが無駄になるため、あまり意味がありません。
または-多くの人がmax_connection
変数を上げることを提案します-まあ、MySQLがそれらのmax_connections
に応えるためにより多くのリソースを割り当てることを暗示していることを知っている人はほとんどいません。より明白な解決策は、DBALのデータベース接続を閉じるか、wait_timeout
を下げてこれらのスレッドを解放することです。
あなたが私のドリフトをキャッチした場合-本当にたくさんのことを読んで学びます。
テーブルエンジンは非常に重要な決定です。多くの人は早い段階でそれらを忘れてしまい、アプリケーション全体をロックしてブロックする30 GBサイズのMyISAM
テーブルと突然戦います。
MyISAM sucksと言うつもりはありませんが、InnoDB
は、MyISAM
とほぼまたはほぼ同じ速度で応答するように調整でき、行などを提供します-UPDATE
をロックすると、MyISAM
はテーブルへの書き込み時にテーブル全体をロックします。
独自のインフラストラクチャでMySQLを実行する自由がある場合は、 perconaサーバー もチェックアウトすることをお勧めします。FacebookやGoogleなどの企業からの多くの貢献が含まれているためです。また、InnoDB
と呼ばれるXtraDB
のPercona独自のドロップイン置換も含まれています。
Percona-server(および-client)のセットアップ(Ubuntuの場合)については、私のGistを参照してください: http://Gist.github.com/637669
データベースのサイズは非常に重要です。信じられないかもしれませんが、Intarwebsのほとんどの人は大規模なMySQLセットアップを作成したことはありませんが、実際には存在します。一部の人々は「Use PostgreSQL !!! 111」のようなものをトロールして言うでしょうが、今のところそれらを無視しましょう。
一番下の行は、サイズから判断して、ハードウェアに関する決定が行われることです。 1 GBのRAMで80 GBのデータベースを高速に実行することはできません。
それは違います:もっと、陽気です。必要なインデックスのみを設定し、EXPLAIN
で使用法を確認する必要があります。それに加えて、MySQLのEXPLAIN
は本当に制限されていますが、開始点です。
これらのmy-large.cnf
およびmy-medium.cnf
ファイルについて-それらが誰のために書かれたのかさえ知りません。独自のロール。
素晴らしいスタートは、 チューニングプライマー です。これはSHOW VARIABLES
とSHOW STATUS
の出力を取得し、希望する有用な推奨事項にラップするbashスクリプト(ヒント:Linuxが必要です)です。サーバーがしばらく実行されている場合、それらのベースとなるデータがあるため、推奨事項の方が優れています。
ただし、チューニングの入門書は魔法のソースではありません。変更することが提案されているすべての変数については、まだ読んでおく必要があります。
mysqlperformanceblog をお勧めします。これは、あらゆる種類のMySQL関連のヒントの素晴らしいリソースです。また、MySQLだけでなく、適切なハードウェアについて多くのことを知っているか、AWSなどのセットアップを推奨しています。これらの人たちは長年の経験があります。
もう1つの優れたリソースは planet-mysql です。
これらの設定を使用します。
etc/my.cnf
innodb_buffer_pool_size = 384M
key_buffer = 256M
query_cache_size = 1M
query_cache_limit = 128M
thread_cache_size = 8
max_connections = 400
innodb_lock_wait_timeout = 100
次の仕様のサーバーの場合:
Dell Server
CPU cores: Two
Processor(s): 1x Dual Xeon
Clock Speed: >= 2.33GHz
RAM: 2 GBytes
Disks: 1×250 GB SATA
データベースのメモリ使用量は複雑なトピックです。 MySQL Performance Blog は、あなたの質問をカバーするのに良い仕事をして、メモリを「確保する」ことが非常に非現実的である多くの理由をリストします。
本当に厳しい制限を課したい場合は、そうすることもできますが、組み込みの設定がないため、OSレベルで行う必要があります。 Linuxでは limit を使用できますが、これを強制するにはMySQLの起動方法を変更する必要があります。
最善の解決策は、サーバーをチューニングして、通常のMySQLメモリ設定を組み合わせることにより、MySQLインストールによるメモリ使用量を一般的に低くすることです。これはもちろんデータベースのパフォーマンスに悪影響を及ぼしますが、my.ini
で微調整できる設定の一部は次のとおりです。
key_buffer_size
query_cache_size
query_cache_limit
table_cache
max_connections
tmp_table_size
innodb_buffer_pool_size
そこから始めて、望む結果が得られるかどうかを確認します。 MySQLメモリ設定の調整について 多く記事 があります。
編集:
いくつかの変数名 MySQLの新しい5.1.xリリースで変更されました に注意してください。
例えば:
table_cache
今でしょ:
table_open_cache
mysqld.exeはRAMで480 MBを使用していました。このパラメーターをmy.iniに追加したことがわかりました
table_definition_cache = 400
メモリ使用量を400,000+ kbから105,000kbに削減
/etc/my.cnf
:
[mysqld]
...
performance_schema = 0
table_cache = 0
table_definition_cache = 0
max-connect-errors = 10000
query_cache_size = 0
query_cache_limit = 0
...
256MBのメモリを搭載したサーバーで正常に動作します。