高负载平均,CPU使用率低 – 为什么?

我们在Web应用程序上看到了巨大的性能问题,我们试图find瓶颈。 我不是一个系统pipe理员,所以有一些我不太明白的东西。 一些基本的调查显示CPU空闲,大量内存可用,不交换,没有I / O,但平均负载很高。

该服务器上的软件堆栈如下所示:

  • Solaris 10
  • Java 1.6
  • WebLogic 10.3.5(8个域)

在此服务器上运行的应用程序与不同服务器上的Oracle数据库进行通信。

这台服务器有32GB的RAM和10个CPU(我认为)。

运行prstat -Z给出这样的东西:

  PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP 3836 ducm0101 2119M 2074M cpu348 58 0 8:41:56 0.5% java/225 24196 ducm0101 1974M 1910M sleep 59 0 4:04:33 0.4% java/209 6765 ducm0102 1580M 1513M cpu330 1 0 1:21:48 0.1% java/291 16922 ducm0102 2115M 1961M sleep 58 0 6:37:08 0.0% java/193 18048 root 3048K 2440K sleep 59 0 0:06:02 0.0% sa_comm/4 26619 ducm0101 2588M 2368M sleep 59 0 8:21:17 0.0% java/231 19904 ducm0104 1713M 1390M sleep 59 0 1:15:29 0.0% java/151 27809 ducm0102 1547M 1426M sleep 59 0 0:38:19 0.0% java/186 2409 root 15M 11M sleep 59 0 0:00:00 0.0% pkgserv/3 27204 root 58M 54M sleep 59 0 9:11:38 0.0% stat_daemon/1 27256 root 12M 8312K sleep 59 0 7:16:40 0.0% kux_vmstat/1 29367 root 297M 286M sleep 59 0 11:02:13 0.0% dsmc/2 22128 root 13M 6768K sleep 59 0 0:10:51 0.0% sendmail/1 22133 smmsp 13M 1144K sleep 59 0 0:01:22 0.0% sendmail/1 22003 root 5896K 240K sleep 59 0 0:00:01 0.0% automountd/2 22074 root 4776K 1992K sleep 59 0 0:00:19 0.0% sshd/1 22005 root 6184K 2728K sleep 59 0 0:00:31 0.0% automountd/2 27201 root 6248K 344K sleep 59 0 0:00:01 0.0% mount_stat/1 20964 root 2912K 160K sleep 59 0 0:00:01 0.0% ttymon/1 20947 root 1784K 864K sleep 59 0 0:02:22 0.0% utmpd/1 20900 root 3048K 608K sleep 59 0 0:00:03 0.0% ttymon/1 20979 root 77M 18M sleep 59 0 0:14:13 0.0% inetd/4 20849 daemon 2856K 864K sleep 59 0 0:00:03 0.0% lockd/2 17794 root 80M 1232K sleep 59 0 0:06:19 0.0% svc.startd/12 17645 root 3080K 728K sleep 59 0 0:00:12 0.0% init/1 17849 root 13M 6800K sleep 59 0 0:13:04 0.0% svc.configd/15 20213 root 84M 81M sleep 59 0 0:47:17 0.0% nscd/46 20871 root 2568K 600K sleep 59 0 0:00:04 0.0% sac/1 3683 ducm0101 1904K 1640K sleep 56 0 0:00:00 0.0% startWebLogic.s/1 23937 ducm0101 1904K 1640K sleep 59 0 0:00:00 0.0% startWebLogic.s/1 20766 daemon 5328K 1536K sleep 59 0 0:00:36 0.0% nfsmapid/3 20141 daemon 5968K 3520K sleep 59 0 0:01:14 0.0% kcfd/4 20093 ducm0101 2000K 376K sleep 59 0 0:00:01 0.0% pfksh/1 20797 daemon 3256K 240K sleep 59 0 0:00:01 0.0% statd/1 6181 root 4864K 2872K sleep 59 0 0:01:34 0.0% syslogd/17 7220 ducm0104 1268M 1101M sleep 59 0 0:36:35 0.0% java/138 27597 ducm0102 1904K 1640K sleep 59 0 0:00:00 0.0% startWebLogic.s/1 27867 root 37M 4568K sleep 59 0 0:13:56 0.0% kcawd/7 12685 ducm0101 4080K 208K sleep 59 0 0:00:01 0.0% vncconfig/1 ZONEID NPROC SWAP RSS MEMORY TIME CPU ZONE 42 135 22G 19G 59% 87:27:59 1.2% dsuniucm01 Total: 135 processes, 3167 lwps, load averages: 54.48, 62.50, 63.11 

我明白,CPU大多是空闲的,但平均负载很高,这对我来说很奇怪。 内存似乎不成问题。

运行vmstat 15给出了这样的东西:

  kthr memory page disk faults cpu rbw swap free re mf pi po fr de sr s0 s1 s4 sd in sy cs us sy id 0 0 0 32531400 105702272 317 1052 126 0 0 0 0 13 13 -0 8 9602 107680 10964 1 1 98 0 0 0 15053368 95930224 411 2323 0 0 0 0 0 0 0 0 0 23207 47679 29958 3 2 95 0 0 0 14498568 95801960 3072 3583 0 2 2 0 0 3 3 0 21 22648 66367 28587 4 4 92 0 0 0 14343008 95656752 3080 2857 0 0 0 0 0 3 3 0 18 22338 44374 29085 3 4 94 0 0 0 14646016 95485472 1726 3306 0 0 0 0 0 0 0 0 0 24702 47499 33034 3 3 94 

我明白,CPU大部分是空闲的,队列中没有任何进程正在执行,很less进行交换。

运行iostat 15给出了这个:

  tty sd0 sd1 sd4 ssd0 cpu tin tout kps tps serv kps tps serv kps tps serv kps tps serv us sy wt id 0 676 324 13 8 322 13 8 0 0 0 159 8 0 1 1 0 98 1 1385 0 0 0 0 0 0 0 0 0 0 0 0 3 4 0 94 0 584 89 6 24 89 6 25 0 0 0 332 19 0 2 1 0 97 0 296 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 97 1 1290 43 5 24 43 5 22 0 0 0 297 20 1 3 3 0 94 

运行netstat -i 15给出以下内容:

  input aggr26 output input (Total) output packets errs packets errs colls packets errs packets errs colls 1500233798 0 1489316495 0 0 3608008314 0 3586173708 0 0 10646 0 10234 0 0 26206 0 25382 0 0 11227 0 10670 0 0 28562 0 27448 0 0 10353 0 9998 0 0 29117 0 28418 0 0 11443 0 12003 0 0 30385 0 31494 0 0 

我错过了什么?

经过进一步调查,性能问题似乎主要是由于两个系统(Oracle SSXA和UCM)之间的大量networking调用所致。 这些调用很快,但很多,并且序列化,因此CPU使用率低(主要是等待I / O),高负载平均(等待处理的许多调用),特别是响应时间长(通过积累响应时间小)。

感谢您对这个问题的洞察!

当你说'高负荷平均值'时,我假设你的意思是prstat在输出值的底部显示'负荷平均值'

 Total: 135 processes, 3167 lwps, load averages: 54.48, 62.50, 63.11 

这些数字看上去类似于顶层提供的数据,可能意味着正在运行的进程的平均队列大小。 这不是处理器使用时间的百分比,而是有多less“事情”在时间上运行。 无可否认,这些看起来相当高,但这一切都取决于你正在运行的应用程序; 一旦他们获得他们的位置,这个过程实际上可能不会有太多的事 看到这里顶部的一个很好的解释。

我对WebLogic并不熟悉,但是我注意到,通常在Apache Tomcat中,可以同时产生很多Java线程,看起来不是很多请求。 这可能是导致那些高平均负荷数字。 确保在适当的情况下使用连接池来连接到后端,并考虑增加可用于应用程序的空闲线程的数量以处理连接(不确定如何在WebLogic上执行此操作; Tomcat具有每个连接器线程池或一个普通的执行程序线程池)。 如果你不这样做,那么可能会产生新的线程来处理请求。

至于性能,你需要确定你的应用程序的哪个部分正在受苦。 是在WebLogic / Java方面发生的事情,数据库访问,DNS查找(如果他们正在完成某种原因…),networking问题或操作系统上的东西。

99%的时间将是你的代码,以及它如何与数据库进行交stream。 那么这将是Web应用程序的configuration。 通过这一点,您将努力将最后的毫秒压缩到您的应用程序之外,或者考虑使用相同的硬件提供更高的并发性。 为了进行更细粒度的性能调优,您需要指标。

对于Java我build议安装Java旋律 。 它可以提供关于你的程序正在做什么的许多信息,并帮助缩小它花费的时间。 我只使用它与Tomcat,但应该适用于任何Java EE容器/ servlet thingy。

有很多方法可以调整Java,所以看看他们的性能指导(我相信你可能有),并确保你正在设置正确的堆大小等适合你的程序。 Java Melody可以帮助您追踪Java消耗的堆的大小以及垃圾收集器的工作难度/中断程序以清除对象的频率。

我希望这是有帮助的。 如果你提供更多的信息,我可能会更新这个答案,并更多地磨练你的需求。

作为一个侧面说明,平均负载还包括等待磁盘活动(即骚扰磁盘)以及等待cpu的东西,这是两者的总和…所以您可能在某个方面有问题。

请参阅http://en.wikipedia.org/wiki/Load_(computing)“Linux在其不间断睡眠状态(通常等待磁盘活动)中还包括%5B在其平均负载%5D进程”

作为一个侧面说明,我遇到的特殊问题是我的平均负载很高,但也有大量闲置的CPU和低磁盘使用率。

看来,至less在我的情况下,有时等待I / O的线程/进程出现在平均负载,但不会导致“等待”列增加。 但是他们仍然是I / O绑定的。

如果你在jruby中运行它(只有100个线程有很多的I / O),你可以知道下面的代码是这样的:

 100.times { Thread.new { loop { File.open('big', 'w') do |f| f.seek 10_000_000_000; f.puts 'a'; end}}} 

其中给出了这样的顶级输出:

 top - 17:45:32 up 38 days, 2:13, 3 users, load average: 95.18, 50.29, 23.83 Tasks: 181 total, 1 running, 180 sleeping, 0 stopped, 0 zombie Cpu(s): 3.5%us, 11.3%sy, 0.0%ni, 85.1%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 32940904k total, 23239012k used, 9701892k free, 983644k buffers Swap: 34989560k total, 0k used, 34989560k free, 5268548k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 31866 packrd 18 0 19.9g 12g 11m S 117.0 41.3 4:43.85 java 912 root 11 -5 0 0 0 S 2.0 0.0 1:40.46 kjournald 

所以你可以看到,它有很多空闲的CPU,0.0%WA,但是很高的平均负载。

iostat同样显示磁盘空闲:

 avg-cpu: %user %nice %system %iowait %steal %idle 9.62 0.00 8.75 0.00 0.00 81.62 Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util sda 0.00 49.00 0.00 6.40 0.00 221.60 69.25 0.01 0.81 0.66 0.42 sda1 0.00 49.00 0.00 6.40 0.00 221.60 69.25 0.01 0.81 0.66 0.42 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 

另见http://linuxgazette.net/141/misc/lg/tracking_load_average_issues.html

作为另一方面,这似乎也意味着(至less在这种情况下 – 运行CentOS),负载平均值包括总线中的每个线程。

今天有同样的问题。 经过一些研究和诊断,我意识到我的小VPS 磁盘已经用完了

在shell /提示符下(Linux / Unix)键入

 df -h 

在您的机器上看到免费磁盘 。 如果您的磁盘用完了,可能是问题。

在这种情况下另一个有用的工具是nmon。

它包括多种方式来查看其他工具提供的相同数据,只需一个小包装。

如果这是无法caching的内容,我build议在tcp模式下将多个服务器放在负载均衡器(如haproxy)后面以分配负载。

只是为了补充一点,在debugging这些问题时有些没有提到的特定于Solaris的工具是“intrstat”,“mpstat”和“lockstat”。 在运行一些繁重的ETL加载的主机之前,经历过类似的问题,mpstat显示了大量的中断,处理大量I / O,暗示了这个问题。

当时在T4-4上用mpstat我们看到vcpus在短暂的监控周期内处理了超过30000个中断,之后性能开始受到影响。 在这种情况下,唯一的解决方法是将更多的CPU放在它上面,然后继续工作以改进代码。

Brendan Gregg写了很多关于性能的信息,尤其是在多年来的I / O方面,如果您想了解更多信息,值得一搜。