我有一个 cpanel LAMP 专用服务器,过去两天一直遇到加载问题。
我的上衣是这样的(按M排序):
top - 14:26:04 up 1 day, 1:08, 2 users, load average: 33.10, 36.63, 38.92
Tasks: 359 total, 1 running, 355 sleeping, 1 stopped, 2 zombie
Cpu(s): 4.2%us, 0.8%sy, 0.0%ni, 13.6%id, 81.0%wa, 0.0%hi, 0.3%si, 0.0%st
Mem: 1034896k total, 998084k used, 36812k free, 8716k buffers
Swap: 2040212k total, 1606552k used, 433660k free, 87388k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5088 mysql 15 0 336m 106m 3868 S 1.3 10.6 310:15.37 mysqld
15797 nobody 18 0 331m 65m 1988 S 3.0 6.4 0:04.64 httpd
15635 nobody 19 0 371m 63m 1840 S 0.0 6.3 0:00.88 httpd
15664 nobody 18 0 374m 63m 1832 S 1.3 6.2 0:00.43 httpd
15769 nobody 19 0 336m 59m 1700 S 0.0 5.9 0:00.29 httpd
15721 nobody 18 0 324m 59m 1732 S 1.0 5.9 0:00.29 httpd
15697 nobody 18 0 304m 59m 1692 S 0.0 5.8 0:00.46 httpd
iostat 是:
Linux 2.6.18-164.15.1.el5 (hostname) 05/20/2011
avg-cpu: %user %nice %system %iowait %steal %idle
21.93 0.33 4.91 12.03 0.00 60.79
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 65.16 1069.51 1285.65 96981151 116580545
sda1 0.00 0.03 0.00 3023 31
sda2 18.59 444.95 159.37 40347535 14451402
sda3 7.15 129.47 113.45 11740498 10287608
sda4 0.00 0.00 0.00 6 0
sda5 1.25 12.88 44.49 1167658 4034632
sda6 3.92 11.25 525.79 1020250 47677744
sda7 5.56 108.71 96.29 9857739 8731832
sda8 28.70 362.20 346.25 32843994 31397296
Mysql 似乎有许多进程在运行(一直处于“连接过多”状态)。我的网站似乎都没有太多流量,也没有发现任何特定查询比其他查询占用更多流量。
您能否提出一种调试/处理这种情况的方法?
答案1
我猜想您的负载问题是由于内存不足导致您过度使用交换空间造成的。一旦您的应用程序用完了所有可用 RAM(1GB),它们就会开始使用交换空间(使用了 2GB 中的 1.6GB),这将增加您的 IO 负载(81.0%wa)。
您几乎从不希望您的 LAMP 服务器使用交换空间,因为正如您所注意到的,这会完全削弱服务器的性能。为了不使用交换,您必须限制应用程序的内存使用量:
- 减少 Apache 客户端的最大数量,通常使用
MaxClients
。如果只有 1GB RAM,您可能希望将 Apache 限制为使用 500MB 或更少,这意味着MaxClients
可能只需要 8 个(每个进程 500MB/60MB = 8)。您可以尝试这个数字,如果服务器开始交换,请减少它并重新启动 Apache。 - 可以减少 MySQL 内存使用量。由于您只有 1GB 的 RAM,您可能希望限制 MySQL 的使用量。从您的顶部输出来看,目前似乎还不错,但如果增加得太高,您可能需要调整配置。分配给 MySQL 的“适当”RAM 取决于您的数据库和应用程序。我可能会给一个大型数据库应用程序分配 500MB,但给一个非常轻量的应用程序分配 50MB。
- 监控您正在运行的其他应用程序的内存使用情况。LAMP 服务器上只有 1GB 内存,这限制了您可以为所有应用程序分配的内存量,最终会限制您的服务容量。
答案2
Cpu(s): 4.2%us, 0.8%sy, 0.0%ni, 13.6%id, 81.0%wa, 0.0%hi, 0.3%si, 0.0%st
看到非常高的值了吗wa
?这就是你的问题。你遇到了非常高的 IO 争用,并且有很多进程在调度程序队列中等待磁盘 IO 发生。
我建议你花些时间检查一下磁盘情况。你可能需要添加额外的主轴或更快的磁盘。
答案3
IO 等待时间非常长。无法从 top 和 iostat 输出确定是什么导致磁盘损坏。我会运行 iotop 看看能否找到 IO 罪魁祸首。
还可以检查 MySQL 中的“显示完整进程列表”以了解正在运行的查询。可能有一个或多个查询使进程停滞。
最后,在 Apache 中启用服务器状态并检查访问日志以了解 Apache 正在尝试做什么。也许有人在反复抓取数据?
以下内容可能表明您是否受到某台主机的攻击。它应按计数排序显示到端口 80 的所有当前连接
netstat -anp |awk '/:80/ {print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
答案4
谢谢大家的回答。答案都很有道理,也很有帮助。
真正的罪魁祸首实际上是cpanellogd
- cpanel 运行的轮换和从访问日志中创建统计数据的过程。
这项服务原本计划只在晚上运行,但由于某种原因,它却在中午(我们负载最大的时候)开始运行。