我继承了一台运行 centos 的 LAMP 服务器,尽管网络流量很低,但它会时不时地随机挂起。
我已经安装了 Server Density 来监视正在发生的事情,并且发现在挂起期间发生了以下情况:
- iowait 突然飙升至 100%。
- mysql“临时磁盘表”数量从140,000个下降到0个。
- apache 上没有负载(服务器甚至没有响应)
在我外行看来,mysqld 似乎定期进行清除并在执行磁盘 IO 时锁定整个服务器(由于它是 VM,因此速度非常慢)。
我该如何更改 mysqld 配置以防止这种情况发生?
答案1
mysql“临时磁盘表”数量从140,000个下降到0个。
这些临时表是由应用程序创建的(即“CREATE TEMPORARY TABLE...”)还是由数据库创建的(用于重新创建索引/对大型数据集进行排序时)。
调整配置以允许在内存中进行更多排序/更多线程应该会有所帮助(如何执行此操作取决于表在哪个引擎中实现)。mysqltuner.pl应该提出合理的建议。
但通过调整查询您将获得更多的好处。
1)确保您的代码没有禁用/启用非常大的表上的索引(这可以在最初填充表时提高性能,并且可以改善向表中添加行时的周转时间 - 但代价是并发性的损失)。
2)使用这个脚本从慢查询日志中的查询中删除文字值,然后根据累积处理时间最高的查询进行优先排序。
答案2
跑步:mysqladmin -u root -p ext -ri 30 | grep Created_tmp_disk
第一次运行会告诉你自上次重启 MySQL 以来创建了多少个磁盘临时表。然后它会告诉你在 30 秒的时间窗口内创建了多少个临时表(直到你按 Control-C 退出)。
如果该值很大并且不断变大,那么您可以将 MySQL 的 tmpdir 放在 ramdisk 上以缓解高 iowait。
更好的办法是按照 symcbean 的建议优化查询。看看这里针对产生临时表的条件。