MySQLの最大メモリ使用量


111

MySQLがLinuxサーバーで使用するメモリの量に上限を設定する方法を教えてください。

現在、MySQLは新しいクエリが要求されるたびにメモリを消費し続けるため、最終的にメモリが不足します。MySQLがその量を超えないように制限を設ける方法はありますか?


4
MySQLは「新しいクエリごとにメモリを消費し、最終的にメモリ不足になる」ことはありません。メモリ使用量はそれよりはるかに複雑です。
リックジェームズ

回答:


183

MySQLの最大メモリ使用量が非常に多く、ハードウェア、お使いの設定に依存し、データベース自体。

ハードウェア

ハードウェアは明らかな部分です。RAMが多いほど、高速なディスクftwになります。ただし、月刊または週刊のニュースレターは信じないでください。MySQLはリニアにスケーリングしません。Oracleハードウェア上でもです。それより少しトリッキーです。

結論としては MySQLセットアップに推奨されるものについて一般的な経験則はありません。それはすべて、現在の使用法または予測に依存します。

設定とデータベース

MySQLはその動作を最適化するために無数の変数とスイッチを提供します。問題が発生した場合は、座って(f'ing)マニュアルを読む必要があります。

データベースについて-いくつかの重要な制約:

  • テーブルのエンジン(InnoDBMyISAM、...)
  • サイズ
  • 指数
  • 使用法

Stackoverflowに関するほとんどのMySQLのヒントでは、5〜8と呼ばれる、いわゆる重要な設定について説明しています。まず、それらすべてが問題になるわけではありません。たとえば、InnoDBに多くのリソースを割り当ててInnoDBを使用しないことは、それらのリソースが無駄になるため、あまり意味がありません。

または、多くの人がmax_connection変数を増やすことを提案します-まあ、彼らがそれに応えるためにMySQLがより多くのリソースを割り当てることを意味することをほとんど知らないmax_connections-必要な場合。より明白な解決策は、DBALのデータベース接続を閉じるか、を下げてwait_timeoutそれらのスレッドを解放することです。

私のドリフトに気づいたら、本当にたくさん読んで、学ぶことがたくさんあります。

エンジン

テーブルエンジンは非常に重要な決定です。多くの人は早い段階でそれらを忘れて、突然MyISAM、アプリケーション全体をロックしてブロックする30 GBサイズのテーブルと戦っています。

MyISAMが悪いと言うつもりはありませんInnoDB微調整してほぼまたはほぼ同じ速さで応答しMyISAM、行ロックをオンにするなどUPDATEMyISAM書き込み時にテーブル全体をロックすることができます。

MySQLを独自のインフラストラクチャで自由に実行できる場合は、perconaサーバーをチェックアウトすることもできます。これは、FacebookやGoogleなどの企業からの寄稿が多数含まれているため(それらは高速です)、Percona独自のドロップも含まれているためです。の代わりにInnoDB、と呼ばれXtraDBます。

(Ubuntuでの)percona-server(および-client)セットアップの要点を参照してくださいhttp ://gist.github.com/637669

サイズ

データベースのサイズは非常に重要です。信じられないかもしれませんが、Intarwebsのほとんどの人は、大規模な処理を行わず、強力なMySQLセットアップを作成したことはありませんが、実際には存在しています。一部の人々は「PostgreSQLを使用してください!!! 111」のようなものをトロールして言うでしょうが、今のところそれらを無視しましょう。

肝心なのは、サイズから判断して、ハードウェアに関する決定を行うことです。1 GBのRAMで80 GBのデータベースを高速に実行することはできません。

指数

それはそうではありません。必要なインデックスのみを設定し、使用状況をで確認する必要がありますEXPLAIN。それに加えて、MySQL EXPLAINは本当に制限されていますが、それは始まりです。

推奨構成

これらmy-large.cnfmy-medium.cnfファイルについて-私はそれらが誰のために書かれたのかも知りません。あなた自身を転がします。

チューニングプライマー

すばらしいスタートはチューニングの入門書です。出力をとります。これはbashスクリプト(Linuxを必要とするでしょうヒント)だSHOW VARIABLESSHOW STATUS、うまくいけば便利な勧告にそれをラップします。サーバーがしばらく実行されている場合は、それらの基礎となるデータがあるため、推奨事項はより優れています。

ただし、チューニングプライマーはマジックソースではありません。それでも、変更が提案されているすべての変数を確認する必要があります。

読書

私は本当にmysqlperformanceblogをお勧めします。これは、MySQL関連のあらゆる種類のヒントに関する優れたリソースです。また、MySQLだけでなく、適切なハードウェアについて多くの知識があり、AWSのセットアップを推奨しています。これらの担当者は、長年の経験があります。

もちろん、もう1つの優れたリソースはplanet-mysqlです。


私は知りませんtuning primer、それはどのように比較しmysqltunerますか?
greg0ire 2014

38

次の設定を使用します。

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

16
私はあなた(そしてあなたがリンクしている作者)がquery_cache_sizeとquery_cache_limitを間違った方法で持っていると思います。MySQLに1MBのキャッシュを割り当てますが、128MBを超えるクエリは入れないでください。dev.mysql.com/doc/refman/5.0/en/query-cache-configuration.html
agtb

max_connectionsを下げます。どちらのエンジンを使用するかを決定し、両方に多くのスペースを割り当てることはしません。
リックジェームズ

19

データベースのメモリ使用量は複雑なトピックです。MySQLのパフォーマンスのブログには、あなたの質問をカバーするのは良い仕事をして、リストには「予備」メモリに非常非現実的だ多くの理由。

本当にハード制限を課したい場合は可能ですが、組み込み設定がないため、OSレベルで行う必要があります。Linuxではulimitを利用できますが、これを強制するために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

2
こんにちは!ご回答有難うございます。人々が引用している方程式は次のとおりです。key_buffer_size+(read_buffer_size + sort_buffer_size)* max_connections = Total Memory。次のように設定しました:key_buffer_size = 128M、read_buffer_size = 1M、sort_buffer_size = 2M、max_connections = 120、およびサーバー上の合計メモリは512Mです。ただし、多くのクエリを実行した後、空きメモリは12Mにまで低下しており、さらに使用量が増えるとおそらく低下し続けます。これがそうである理由はありますか?それを防ぐことはできますか?ありがとう!

または、サーバーの合計メモリ(512M)ではなく空きメモリ(つまり、すべてのOS関連およびその他のプログラムをロードした後に利用可能なメモリ)を考慮する必要があるのでしょうか?

1
あなたはRAMに格納できる一時テーブルのサイズを大きくすることを意図してtmp_table_sizeを変更するつもりなら、またmax_heap_table_sizeを高めるために覚えている- MySQLが... 2の最小値を使用して
デイブリックス

1
@TimothyMilsud-そのような式は実際には機能しません。また、式でRAMの使用量が多すぎると主張されている場合、ほとんどのサーバーは問題なく動作します。
リックジェームズ

19

mysqld.exeはRAMで480 MBを使用していました。このパラメーターをmy.iniに追加したことがわかりました

table_definition_cache = 400

メモリ使用量を400,000+ kbから105,000kbに​​削減


これはどのセクションの下にありますか?私のサイトに追加したところ、サービスの開始が拒否されました。
構文エラー

気にしないで、それを[wampmysqld]の下に移動しました。これはうまく機能し、使用していたメモリを大幅に削減しました。プロセスで私のlocalhostページロードも高速化した可能性があると思います。
構文エラー

デフォルトと最小値は400ですが、あなたの場合、400を超えた理由は何ですか?
Wadih M.

5

/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のメモリを搭載したサーバーで良好な動作。


なぜtable_definition_cache= 0なのですか?いくつかの説明がいいでしょう。そして、基本的にクエリをキャッシュしていません...次の場合も同じ効果がありますquery_cache_type = 0:)
Khom Nazid '

0

docker mysqlコンテナーの最適化を検討している場合は、以下のコマンドが役立つ場合があります。mysql docker containerをデフォルトの480mbから単なる100 mbに実行できました

docker run -d -p 3306:3306 -e MYSQL_DATABASE = test -e MYSQL_ROOT_PASSWORD = tooor -e MYSQL_USER = test -e MYSQL_PASSWORD = test -v / mysql:/ var / lib / mysql --name mysqldb mysql --table_definition_cache = 100 --performance_schema = 0 --default-authentication-plugin = mysql_native_password

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