服务器负载过高

服务器负载过高

我有一个 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 运行的轮换和从访问日志中创建统计数据的过程。

这项服务原本计划只在晚上运行,但由于某种原因,它却在中午(我们负载最大的时候)开始运行。

相关内容