负载平均值较高,但资源未得到充分利用

据我所知,我的服务器(Ubuntu Linux 8.04.1)的负载平均值太高,实际上我发现它在高峰时间减速或停止服务。

这是一个相当支持LAMP的单一网站(图像托pipe),显然是从磁盘服务了很多内容(图片),但他们需要通过PHP来服务。 除了使用caching/代理方法的一般build议,我迷失在为什么它显然使用不到一半的可用资源(4GB内存,它是一个Linode 4096)。

我在Linux上是个不错的select,所以请询问一下可能有用的东西。 这是htop的一部分(MySQL显示98.9%的CPU使用率,但是这是微乎其微的,它几乎总是使用0。*%):

  1 [||||||||||||||||||||||||||||||||||| 69.0%] Tasks: 355 total, 6 running 2 [||||||||||||||||||||||| 44.8%] Load average: 18.32 15.02 11.58 3 [|||||||||||||||||||||||||||||||||||| 71.9%] Uptime: 01:10:22 4 [||||||||||||||||||||||||||||| 57.9%] Mem[||||||||||||||||||||||||||||||||||||||2190/4096MB] Swp[| 0/127MB] PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command 2345 mysql 18 0 177M 72640 5140 S 98.9 1.7 7:47.58 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql 9350 www-data 16 0 48940 24304 4376 R 13.7 0.6 0:01.05 /usr/sbin/apache2 -k start 9301 mysql 15 0 177M 72640 5140 S 10.0 1.7 0:00.17 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql 9186 mysql 17 0 177M 72640 5140 S 10.0 1.7 0:00.22 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql 9150 www-data 15 0 58400 33900 4476 S 8.1 0.8 0:02.03 /usr/sbin/apache2 -k start 9077 mysql 15 0 177M 72640 5140 S 8.1 1.7 0:00.39 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql 9270 mysql 15 0 177M 72640 5140 S 7.5 1.7 0:00.12 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql 9037 mysql 16 0 177M 72640 5140 S 7.5 1.7 0:00.45 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql 9333 www-data 15 0 35724 11260 4560 S 6.2 0.3 0:03.88 /usr/sbin/apache2 -k start 

这是目前的apache2.conf ,虽然我已经尝试了很多组合,并在过去被问到 :

 Timeout 90 KeepAlive On MaxKeepAliveRequests 150 KeepAliveTimeout 3 <IfModule mpm_prefork_module> StartServers 1 MinSpareServers 1 MaxSpareServers 5 MaxClients 275 ServerLimit 275 MaxRequestsPerChild 1250 </IfModule> 

更新:如问,这是top的一部分:

 top - 15:07:31 up 1:46, 2 users, load average: 12.83, 10.64, 10.14 Tasks: 223 total, 17 running, 206 sleeping, 0 stopped, 0 zombie Cpu(s): 84.3%us, 8.8%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 1.0%si, 5.9%st Mem: 4194528k total, 3555696k used, 638832k free, 27748k buffers Swap: 131064k total, 588k used, 130476k free, 1458672k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2345 mysql 17 0 180m 76m 5140 S 55 1.9 13:09.79 mysqld 12479 www-data 18 0 73224 47m 4552 S 48 1.2 0:03.74 apache2 12294 www-data 17 0 71788 46m 4472 R 39 1.1 0:05.78 apache2 12382 www-data 17 0 73744 48m 4460 R 33 1.2 0:03.19 apache2 

更新:正如所build议的(由克里斯托弗·卡雷尔,谢谢),这里是活动进程(输出从ps -efl | cut -c3- | egrep -v "^S" )。 平均而言,它显示1-5个apache2进程。 鉴于我目前的apache2.conf和平均负载,这是否有意义?

 T root 12519 12508 0 75 0 - 612 finish 15:07 pts/1 00:00:00 top R www-data 18677 2774 1 76 0 - 17130 - 16:23 ? 00:00:04 /usr/sbin/apache2 -k start R www-data 18965 2774 2 76 0 - 13397 - 16:26 ? 00:00:04 /usr/sbin/apache2 -k start R www-data 19047 2774 2 76 0 - 11613 - 16:28 ? 00:00:00 /usr/sbin/apache2 -k start R www-data 19088 2774 55 76 0 - 10482 - 16:29 ? 00:00:00 /usr/sbin/apache2 -k start R www-data 19091 2774 0 81 0 - 8579 - 16:29 ? 00:00:00 /usr/sbin/apache2 -k start R www-data 19092 2774 0 81 0 - 8355 - 16:29 ? 00:00:00 /usr/sbin/apache2 -k start R www-data 19093 2774 0 82 0 - 8322 - 16:29 ? 00:00:00 /usr/sbin/apache2 -k start R root 19094 18557 0 77 0 - 593 - 16:29 pts/2 00:00:00 ps -efl R root 19095 18557 0 78 0 - 729 - 16:29 pts/2 00:00:00 -bash R root 19096 18557 0 78 0 - 729 - 16:29 pts/2 00:00:00 -bash 

您可能希望启用Apache的mod_status( http://httpd.apache.org/docs/2.0/mod/mod_status.html ),以便您可以看到您的Web服务器中发生了什么。 具体来说,你会得到每个请求的CPU消耗的数字。

vmstat / iostat的一些快照也不会受到影响。

另外,你使用MyISAM或InnoDB表? 当你得到这些负载尖峰之一时,你从MySQL的“SHOW FULL PROCESSLIST \ G”中得到了什么? 我有一种感觉,你正在获取MySQL中的locking/查询争用,这正在炸毁你的内核运行队列的长度。

我有这个相同的问题。 mytop在队列中显示了很多查询。 我添加了索引到我的表,问题消失了。

任何不处于状态S(睡眠)的命令将被计为活动进程。 这包括R运行状态和D阻塞状态。 (后者通常是在从磁盘或networking设备等待IO时发生的)。您也可能在僵尸进程中运行平均负载。

要特别查找这些列表,请尝试以下命令: ps -efl | cut -c3- | egrep -v "^S" ps -efl | cut -c3- | egrep -v "^S" ps -efl | cut -c3- | egrep -v "^S"你没有很多爱荷华州的时间,所以它可能会变成僵尸。

来自mysqld的100%CPU使用率也可能解释您的间歇性挂断。 (也许它只是'有时'挂钩?)平均负载可能是一个红鲱鱼,或不是你的问题的根本原因。

另外,看起来你的机器在4GB内存中使用3.5GB。 free -m可以让你更好地了解正在使用的内容。

我没有一个完整的解决scheme,但我有一些猜测。

  1. 你的mysql服务器似乎只有一些像128MB的池。 如果LAMP系统使用大小合适的数据库,这似乎是偏低的。 这将产生大量的I / O磁盘。 另外,如果在MySQL上有CPU峰值,请打开慢查询日志logging一下,看看出现了什么。 一个或两个新的索引可能是有序的。
  2. 对于可以读取大多数现代内核中每个进程的数据stream的顶层替代品,我推荐顶一下。 除此之外,它可以按进程显示磁盘访问。 请注意,atop有一个正在运行的守护进程作为其设置的一部分,因此您可能需要在完成后将其卸载。
  3. 要小心你信任的CPU使用数量。 它们是使用一些不同的方法生成的。 根据我的经验,为了显示整体CPU使用率,vmstat给出了“最佳”(==最接近感知负载)的数​​字。
  4. 有Apache进程正在做认真的工作。 也许一些PHP代码优化是为了?

但是,从上面的数据来看,我不清楚你的设置有多大的错误。 虽然你可能会扭曲更多的性能,你可能只是接近极限。

更新:

澄清重新:下面评论。

一个典型的面向networking的TCP服务器由一个守护进程组成,守护进程有一个监听套接字和一些到客户端的开放连接。 每个套接字都有一个等待的进程(一个进程可能在多个套接字上等待)。 这些进程将处于睡眠状态,并在某些数据到达时被操作系统唤醒。 如果它是有效的(比如说静态Web服务器),那么你可能永远不会赶上它,因为它只需要大约100微秒的时间来唤醒,提供一些数据并重新进入hibernate状态。

更新2:

现代操作系统将空闲内存分配给新的磁盘缓冲区,直到内存不足,然后重新使用最less使用的缓冲区。 因此,记忆将永远充满。 此外,有两种方法可以将多个内存页作为其大小的一部分进行报告。 这样做的结果是:a)现代操作系统总是内存不足,以及b)很难确切地说明如何使用内存。 最简单的指示是争取缓冲区和caching号码作为物理内存的一大部分。 在此框中,超过30%的内存位于高速caching的磁盘数据中。

如果你主要提供图片(静态文件),最好切换到NGINX,如果你使用PHP来调整图片大小,你应该使用memcached(直接从NGINX服务,你可以在NGINX的configuration文件中设置)会产生巨大的影响。 Apache不适合提供静态文件(我认为现在对任何事情都没有好处)