服务器的高负载

我有一个cpanel LAMP专用服务器,过去两天我一直在加载问题。

这是我的顶部看起来像(按Msorting):

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似乎有很多进程正在运行(不断有“连接太多”)。 我的网站似乎没有太多的stream量,我没有看到比其他人更具体的查询。

你能否提出一种debugging/处理这种情况的方法?

我猜你的负载问题是由于内存不足导致过度使用交换空间。 一旦您的应用程序使用了所有可用的RAM(1GB),它们将开始使用交换空间(使用2GB的1.6),这将增加您的IO负载(81.0%wa)。

你几乎不希望你的LAMP服务器必须使用交换空间,正如你所看到的那样,它完全瘫痪了服务器的性能。 为了不使用交换,您必须限制您的应用程序的内存使用情况:

  • 减less最大数量的Apache客户端,通常与MaxClients 。 只有1GB内存,你可能想限制Apache使用500MB或更less,这意味着MaxClients只需要8(每个进程500MB / 60MB = 8)。 你可以玩这个号码,如果服务器开始交换减less它,并重新启动Apache。
  • 可能会减lessMySQL的内存使用量。 既然你只有1GB的RAM,你可能希望限制MySQL的使用。 从最高的输出看,目前看起来不错,但如果增加得太高,你可能不得不使用configuration。 内存给MySQL的“正确数量”取决于你的数据库和应用程序。 我可能会给一个沉重的数据库应用程序500MB,但非常轻,只有50MB。
  • 监视内存使用情况您运行的其他应用程序。 在LAMP服务器上只有1GB的内存限制了你可以给所有内容提供多less内存,最终会限制你的服务容量。
 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 

看到很高的价值? 那是你的问题。 您遇到非常高的IO争用,并且在调度程序队列中有许多进程正在等待磁盘IO发生。

我会build议花一些时间检查你的磁盘情况。 您可能需要添加更多的主轴或更快的磁盘。

IO等待是超高的。 从top和iostat输出中确定什么是杀死磁盘是不可能的。 我会运行iotop,看看你是否能findIO的罪魁祸首。

还要检查MySQL中的“显示完整进程列表”,以了解哪些查询正在运行。 这可能是一个或多个查询陷入困境。

最后,在Apache中启用服务器状态并检查访问日志,以了解Apache正在尝试执行的操作。 也许有人在一遍又一遍地刮</s>?

以下内容可能表明您是否受到一位主持人的抨击。 它应该显示所有当前连接到端口80按数量sorting

 netstat -anp |awk '/:80/ {print $5}' | cut -d: -f1 | sort | uniq -c | sort -n 

“连接太多” – 意味着你需要在mysqlconfiguration中增加max_connections的值。 这可能是许多apache进程试图连接到mysql服务器,并达到mysql max_connections限制等待的结果。 可能是应用程序端没有正确closures连接,或者如果是正常的负载,则需要增加限制。 我想你需要监视来自哪里的mysql连接,以及你的应用程序如何处理/closuresmysql连接。

谢谢大家的答案。 他们都是有效的和有益的。

实际的罪魁祸首实际上是cpanellogd – cpanel运行旋转和创build访问日志的统计数据的过程。

这个计划只在晚上运行,但由于某种原因,它是在我们负荷最重的时候开始的。