![服务器 I/O 攀升、带宽峰值、服务器锁定,从哪里开始?](https://linux22.com/image/569800/%E6%9C%8D%E5%8A%A1%E5%99%A8%20I%2FO%20%E6%94%80%E5%8D%87%E3%80%81%E5%B8%A6%E5%AE%BD%E5%B3%B0%E5%80%BC%E3%80%81%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%94%81%E5%AE%9A%EF%BC%8C%E4%BB%8E%E5%93%AA%E9%87%8C%E5%BC%80%E5%A7%8B%EF%BC%9F.png)
我正在使用 Linode 来托管一个带有名为“Shopp”的电子商务插件的 Wordpress 博客。
几天前,我刚刚将网站从以前的共享托管帐户(资源比 Linode VPS 少)移出。
之前的主机上没有出现过该问题。
每隔几个小时(大约 10-11 小时,不定),我可以看到带宽峰值(“正常”流量约为 400k-600k/s)为 1.1mb/s。同时,我可以看到 I/O 和 SWAP 也达到 10k-20k 之间的峰值,这导致服务器基本上锁定。它会锁定大约 30 到 40 分钟,或者直到我重新启动它。
我已经打开了 mysql 慢查询日志,看看是否可以从中找到任何线索,但不幸的是,它记录的所有查询似乎都很正常(例如“从 table1 中选择列,其中 id=1”,慢查询日志中引起我注意的另一个例子是“设置名称 utf8”)。
我该如何调查导致此问题的原因?有没有办法知道一定如果问题源于数据库,或者可能是服务器上的某个 php 文件?
从这里继续下去的最佳方法是什么?
PS:运行 Ubuntu 10.04,32 位,最新的 mysql/php/apache2 并使用 Linode 1024
答案1
当服务器出现问题时,找出此类问题最容易。如果能将其归咎于 CPU、内存或磁盘,会很有帮助。
- 安装并运行 htop。检查右上角的平均负载数字。按 CPU% 和 MEM% 排序(按 F6),看看是否有任何异常值。
- 如果你有一个异常值,它是一个 apache/httpd 进程,运行“链接http://localhost/服务器状态“看看能否找出哪个页面导致了问题
- 如果这没有帮助,请“strace -p PID”该杂散进程,看看是否可以找出它正在尝试访问哪些资源以及它可能正在做什么。
- 运行 vmstat 1,查看最右边的“wa”列。这是 IO 等待,如果超过 20 或 30,则很可能是 IO 问题。
不过,内存似乎确实是问题所在。也许新主机上的 mysql 配置过于激进?请确保 key_buffer 和 innodb_buffer_pool_size 组合不会占用太多 RAM,尤其是因为它不是专用的 DB 机器,而 apache 需要大量内存才能继续提供 httpd 进程。Mysql 会随着时间的推移使用您允许的每一点内存,因此这些缓冲区可能需要 10-11 小时才能填满。
我也会检查 apache 中的 keepalive 设置,这些设置会对内存使用产生巨大影响。我通常会将其设置得非常低或完全关闭。
答案2
该站点上有大量 QA 资源可供使用,首先您需要找出您的实际限制因素,您提到了 SWAP,所以我猜您遇到了内存问题。
为了获得更好的帮助,您需要为可能想要提供帮助的人提供一些诊断信息,例如:top
初学者的输出。
这听起来可能不对,但您可以通过调整 Apache/MySQL 安装在硬件限制内更好地工作来提高性能和行为。