8

私は、MySQL 5.1.61 データベースを、負荷分散された 2 つの Apache Web サーバーの背後で実行しており、かなり忙しい (1 日あたり 100K ユニーク) Wordpress サイトをホストしています。Cloudflare、W3TC、および Varnish でキャッシングしています。ほとんどの場合、データベース サーバーはトラフィックを適切に処理します。「show full processlist」は、常に 20 ~ 40 のクエリを表示し、ほとんどがスリープ状態になっています。

ただし、定期的に (特にトラフィックが急増した場合や多数のコメントが消去された場合)、MySQL は応答を停止します。実行中の 1000 ~ 1500 のクエリ、多くの「データ送信」などを見つけることができます。特定のクエリがデータベースに負荷をかけているようには見えません (それらはすべて標準の Wordpress クエリです)。電話を切る。私は(通常)ログインして「完全なプロセスリストを表示」やその他のクエリを実行できますが、すでにそこにある1000以上のクエリはそのままです。唯一の解決策は、mysql を再起動することのようです (接続できない場合は kill -9 を介して激しく)。

すべてのテーブルは innodb で、サーバーには 8 コア、24 GB の RAM、十分なディスク容量があり、以下は my.cnf です。

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
port=3306
skip-external-locking
skip-name-resolve
user=mysql
query_cache_type=1
query_cache_limit=16M
wait_timeout = 300
query_cache_size=128M
key_buffer_size=400M
thread_cache_size=50
table_cache=8192
skip-name-resolve
max_heap_table_size = 256M
tmp_table_size = 256M
innodb_file_per_table
innodb_buffer_pool_size = 5G
innodb_log_file_size=1G
#innodb_commit_concurrency = 32
#innodb_thread_concurrency = 32
innodb_flush_log_at_trx_commit = 0
thread_concurrency = 8
join_buffer_size = 256k
innodb_log_file_size = 256M
#innodb_concurrency_tickets = 220
thread_stack     = 256K
max_allowed_packet=512M
max_connections=2500
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

#2012-11-03
#attempting a ram disk for tmp tables
tmpdir = /db/tmpfs01

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

MySQL 構成を潜在的に改善する方法や、高負荷下でデータベースの安定性を維持するためのその他の手順について何か提案はありますか?

4

3 に答える 3

1

前述のように、既成概念にとらわれず、これらのクエリが遅い、またはハングする理由を突き止めてください。古くからありますが、(おそらく) インテリジェントなシステム エンジニアにとっても問題の良い原因は負荷分散であり、Web サーバーまたはデータベース セッション間で問題が発生します。キャッシングとロード バランシングがすべて行われている状態で、すべてが常に意図したとおりにエンド ツー エンドで接続されていると確信していますか?

于 2012-12-10T06:45:51.973 に答える
1

私はアルディティスとビョルンに同意します

私は mysql にはかなり慣れていませんが、mysqltuner を実行すると、DB https://github.com/rackerhacker/MySQLTuner-perlの最近のクエリに基づいて、いくつかの構成の最適化が明らかになります。

また、可能であれば、OS とは物理的に別のパーティションに DB ファイルを保存すると、OS が IO を消費して DB の速度が低下する可能性があります。Bjoern の logrotate の問題と同様です。

于 2012-12-28T00:34:17.707 に答える
0

まず、問題発生時の基本的なシステムの動作を見てください。問題が見つかった場合は、vmstat と iostat の両方を使用してください。システムがスワッピングを開始するかどうか (vmstat の pi,po 列)、および大量の IO が発生しているかどうかを確認します。これは、問題をデバッグするための最初のステップです。

有用な情報のもう 1 つのソースは、SHOW INNODB STATUS です。出力の解釈方法については、 http://www.mysqlperformanceblog.com/2006/07/17/show-innodb-status-walk-through/を参照してください。

特定の時点で、書き込みがクエリ キャッシュをフラッシュするため、読み取りパフォーマンスが低下している可能性があります。

于 2012-12-31T12:57:53.057 に答える