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


78

我们正在Web应用程序上看到巨大的性能问题,并且正在尝试寻找瓶颈。我不是系统管理员,所以有些东西我不太了解。一些基本调查显示,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
 r b w   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大部分处于空闲状态,队列中没有等待执行的进程,几乎没有交换。

运行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

我想念什么?


我不习惯使用Solaris,因此我会请别人帮忙,但是我将开始研究您的Web服务器配置。可能是以某种方式人为地控制性能,从而将大量线程留在运行队列中。(尽管不确定这是可能的,甚至是不可能的)。不过,对于一个书面问题的荣誉。
SmallClanger 2012年

4
我认为10个CPU可能是问题。在进行进一步调查之前,您应该更准确地了解正在运行的硬件。使用psrinfo -v显示CPU的实际数量。
jlliagre 2012年

我从未听说过此命令,但运行该命令时,大约有250个虚拟处理器。那有道理吗?在那种情况下,平均负载为50并不重要?
Spiff 2012年

我认为在磁盘已满时也会发生这种情况。我今天有1%的可用空间,/并且负载一直增加,直到19.00没有明显的原因为止。腾出一些空间可以解决此问题(在出现故障后不久);也可能是巧合。
nh2

Answers:


40

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

感谢您对这个问题的见解!


4
您是如何确认和解决这个问题的?我们看到了同样的问题,并希望检查我们是否有同样的问题
hobgoblin

32

当您说“高平均负载”时,我认为您的意思是prstat在“输出平均”的下面显示

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

这些数字看起来与top提供的数字相似,并且可能表示正在运行的进程的平均队列大小。这不是使用的处理器时间的百分比,而是多少“东西”正在骚扰CPU以便运行。诚然,它们看起来确实很高,但这全都取决于您正在运行的应用程序。进程获得插槽后实际上可能并不会做很多事情。请参阅此处以获取有关top的详细说明。

我对WebLogic不熟悉,但是我注意到,通常,使用Apache Tomcat可以同时生成许多Java线程,以用于显示请求不多的情况。这可能是导致这些高平均负载数的原因。确保在适当的地方使用连接池来连接到后端,并考虑增加应用程序可用来处理连接的空闲线程数(不确定如何在WebLogic上执行此操作; Tomcat具有每个连接器线程池或一般执行程序线程池)。如果您不这样做,则可能会产生全新的线程来处理请求。

至于性能,您需要确定应用程序的哪些部分受到影响。是WebLogic / Java方面正在发生的处理,数据库访问,DNS查找(如果由于某种原因而进行了查找...),网络问题或OS上的某些处理。

99%的时间将是您的代码以及如何与保持状态的数据库进行通信。然后将是Web应用程序的配置。到此为止,您将努力从应用程序中挤出最后几毫秒的时间,或者尝试使用相同的硬件提供更高的并发性。为了进行更细粒度的性能调整,您需要指标。

对于Java,我建议安装Java Melody。它可以提供有关程序执行情况的大量信息,并有助于缩小程序花费的时间。我仅将其与Tomcat一起使用,但应与任何Java EE容器/ servlet一起正常使用。

有很多方法可以调优Java,因此请查看它们的性能准则(我确定您可能有),并确保设置了适合您程序的正确堆大小等。Java Melody可以帮助您跟踪正在消耗的Java堆的大小以及垃圾收集器的工作强度/它中断程序清除对象的频率。

希望对您有所帮助。如果您提供更多信息,我也许可以更新此答案,并根据您的需求进行进一步的调整。


1
感谢您的回答,如果我的代表足够高,我会投票赞成。根据我的经验,代码或SQL查询通常是罪魁祸首。我进行了几次性能分析,但找不到任何热点,这就是为什么我开始研究更基本的因素的原因。我将进行更多调查,并在发现更多问题时更新问题。
2012年

4
我还将检查“ mpstat 1 5”的输出,以查看每个处理器的统计信息并查看“ csw”和“ syscl”列。从上方的vmstat看来,您正在执行许多系统调用和上下文切换,这似乎证明了webtoe的怀疑,即您有很多线程(Solaris称它们为LWPs-LightWeight进程)不断骚扰CPU。他们没有一个在运行时做得很好,但是许多人却花时间等待运行,因此平均负载很高。
eirescot,2012年

25

附带说明一下,平均负载还包括等待磁盘活动(即骚扰磁盘)的内容以及等待cpu的内容,这是两者的总和...因此,您可能会遇到一个问题。

请参见http://en.wikipedia.org/wiki/Load_(计算) “ Linux还包括处于不间断睡眠状态(通常在等待磁盘活动)的[平均负载]进程”

附带说明一下,我遇到的一个特殊问题是我的平均负载很高,但是还有很多空闲的cpu和较低的磁盘使用率。

看来,至少就我而言,有时等待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/s   r/s   w/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

进一步说明,这似乎还暗示着(至少在这种情况下-运行CentOS),平均负载将每个线程分别计入总数。


2
在Linux上,“平均负载还包括等待磁盘活动的内容” ,而这个问题最初与Solaris有关,它似乎仅在平均负载中包括正在运行和可运行(即等待CPU)的任务。这个问题的一个Linux版本是this
Nickolay

7

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

在shell /提示(Linux / Unix)类型

df -h

以查看计算机上的可用磁盘。如果磁盘用完,则可能是问题/问题。


我猜您是在交换那个吗,是造成它的原因吗?
rogerdpack

4

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

它包含在一个小包装中的多种方式,可以查看其他工具提供的相同数据。

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


2

除此之外,还没有提到一些在调试此类问题中有用的Solaris特定工具,例如“ intrstat”,“ mpstat”和“ lockstat”。以前,在运行一些繁重的ETL负载的主机上遇到了类似的问题,mpstat显示了大量的中断,这些中断处理大量的I / O,这提示了问题。

当时,在带有mpstat的T4-4上,我们看到vcpus在较短的监视周期内处理了超过30000个中断,此后性能开始下降。在这种情况下,唯一的解决方法是投入更多的CPU,但是随后进行了改进代码的工作。

布伦丹·格雷格(Brendan Gregg)多年来写了很多有关性能的文章,尤其是有关I / O的文章,如果您想了解更多信息,值得一搜。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.