Magento eCommerce サイトをホストする 2 つの Web サーバーと、Amazon EC2 上の 1 つの MySQL データベース サーバーを実行しています。
MySQL サーバーで重大なパフォーマンスの問題、デッドロック、「ロック待機タイムアウトの超過」エラーなどが発生しており、これらを解決するのに本当に苦労しています。
最近、db サーバーを (m1.large から) m1.xlarge インスタンスにアップグレードしましたが、これらの問題は引き続き発生しています。
これらの問題は、EC2 サーバーでよく見られるディスク IO の不良に起因すると考えられてきましたが、最近、ディスク IO が正常であってもデッドロックなどの問題が発生することがわかりました。
「sar」コマンドは、ピーク時または Magento API を介して請求書を作成するなどのデータベース集中型操作を実行するときに、ディスク IO パフォーマンスがかなり低いことを示しています。iowait が 20% を超えることがよくあります。
以下は、クエリがデータベース全体の速度を低下させていた最近の問題の「mtop」の結果を示すスクリーンショットへのリンクです。
このスクリーンショットは、残りのクエリの実行を妨げている 1 つまたは他のクエリを示しています。また、非常に低い負荷平均も示しています。集中的なコマンドが実行されている場合、負荷平均が 3.0 に達することがよくあります。
my.cnf
設定は次のとおりです。
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
innodb_file_per_table=1
key_buffer=512M
max_allowed_packet=64M
table_cache=512
innodb_thread_concurrency=5
innodb_buffer_pool_size=4976M
innodb_additional_mem_pool_size=8M
innodb_log_file_size=128M
innodb_log_buffer_size=8M
thread_cache_size=150
sort_buffer_size=4M
read_buffer_size=4M
read_rnd_buffer_size=2M
myisam_sort_buffer_size=64M
tmp_table_size=256M
query_cache_type=1
query_cache_size=128M
max_connections=400
wait_timeout=28800
innodb_lock_wait_timeout=120
max_heap_table_size=256M
long_query_time=3
log-slow-queries=...mysql-slow.log
[mysqld_safe]
log-error=...mysqld.log
pid-file=...mysqld.pid
この関数を広範囲に使用してpt-query-digest
、MySQL スロー クエリ ログを分析しました。
基本的にsales_flat_quote table
、更新と挿入では非常に遅いことがわかりますが、他の多くのテーブルも同様です。
sales_flat_quote
特に大きくはありませんが、テーブルには約 10 万行しかありません。