我们在 Amazon EC2 上运行 2 个托管 Magento 电子商务站点和 1 个 MySQL 数据库服务器的 Web 服务器。
我们在 MySQL 服务器上遇到了主要的性能问题、死锁、“超过锁定等待超时”错误等,并且很难解决这些问题。
我们最近将 db 服务器升级到了 m1.xlarge 实例(来自 m1.large),但我们仍然会继续遇到这些问题。
我们一直将这些问题归因于我们经常在 EC2 服务器上看到的坏磁盘 IO,但最近我看到了死锁等问题,即使磁盘 IO 很好。
“sar”命令显示我们在高峰时间或当我们执行数据库密集型操作(如通过 Magento API 创建发票)时磁盘 IO 性能非常差。我们经常看到 iowait 高达 20% 以上。
下面是一个屏幕截图的链接,显示了我们最近遇到的一个问题中“mtop”的结果,其中查询导致整个数据库变慢:
此屏幕截图显示了阻止其余查询执行的一个或其他查询。它还显示了相当低的平均负载,当执行密集命令时,我们经常看到平均负载上升到 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
虽然不是特别大,但表中只有大约 100k 行。