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


我们在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

我错过了什么?


71
2018-02-29 22:29




我不在Solaris的家里,所以我会推荐给别人,但我会开始查看你的web服务器配置。也许某些东西是人为地控制性能,以便在运行队列中留下大量线程。 (不知道那可能是什么,或者即使它是可能的)。尽管如此,还是要写一个写得很好的问题。 - SmallClanger
10个CPU(我认为) 可能是个问题。在进一步调查之前,您应该更准确地了解您正在运行的硬件。使用 psrinfo -v 显示实际的CPU数量。 - jlliagre
我从来没有听说过这个命令,但是在运行它时,看起来大约有250个虚拟处理器。这甚至有意义吗?在这种情况下,平均负载50将是微不足道的? - Spiff
我认为当磁盘已满时也会发生这种情况。今天我有1%的可用空间 / 并且负载持续增加直到结束 19.00 没有明显的理由。腾出一些空间解决了这个问题(不久之后);虽然也可能是巧合。 - nh2


答案:


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

感谢您对此问题的见解!


39
2018-03-02 15:15





当你说'高负荷平均'时,我认为你的意思是prstat在输出数字的底部显示'负载平均值'

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

这些数字看起来类似于top提供的数字,可能意味着正在运行的进程的队列大小。这不是处理器使用时间的百分比,而是有多少'事情'正在骚扰CPU的运行时间。不可否认,这些确实看起来很高,但这完全取决于您正在运行的应用程序;一旦他们得到他们的插槽,这些过程实际上可能不会做太多。看到 这里 关于顶部的一个很好的解释。

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

至于性能,你需要确定 什么 你应用程序的一部分很痛苦。它是在WebLogic / Java方面发生的处理,数据库访问,DNS查找(如果它们由于某种原因而被完成......),网络问题或操作系统上的某些东西。

99%的时间它将是你的代码以及它如何与数据库进行对话。然后它将是Web应用程序的配置。在这一点上,您将努力从应用程序中挤出最后几毫秒,或者考虑使用相同的硬件提供更高的并发性。对于这种更精细的性能调优,您需要指标。

对于Java,我建议安装 Java旋律。它可以提供有关您的程序正在执行的操作的大量信息,并帮助缩小其花费时间的范围。我只使用它与Tomcat,但应该适用于任何Java EE容器/ servlet thingy。

您可以通过多种方式调整Java,因此请查看其性能指南(我相信您可能已经拥有),并确保您正在设置适合您的程序的正确堆大小等。 Java Melody可以帮助您追踪您正在使用的Java堆的大小,以及垃圾收集器工作的难度/中断程序清除对象的频率。

我希望这有帮助。如果您提供更多信息,我可以更新此答案并根据您的需求进行更新。


30
2018-03-01 00:36



谢谢你的回答,如果我的代表足够高,我会支持它。从我的经验代码或SQL查询通常是罪魁祸首。我做了一些分析运行,找不到任何热点,这就是为什么我开始考虑更基本的因素。我将进行更多调查,并在我发现更多问题时更新问题。 - Spiff
我还会检查'mpstat 1 5'的输出以查看每处理器的统计信息并查看“csw”和“syscl”列。从上面的vmstat看起来你正在进行大量的系统调用和上下文切换,这似乎证实了webtoe怀疑你有很多线程(Solaris称之为LWP- LightWeight进程)经常骚扰CPU。当他们跑步时,他们都没有做很多事情,但很多人都在等待时间,因此平均负荷很高。 - eirescot


作为旁注,负载平均值还包括等待磁盘活动(即骚扰磁盘)以及等待cpu的事物,它们是两者的总和......所以你可能在一个或另一个中遇到问题。

看到 http://en.wikipedia.org/wiki/Load_(computing) “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)负载平均值包括每个线程在总数中。


19
2017-07-19 17:46



“平均负载还包括等待磁盘活动的东西” 在Linux上虽然这个问题最初是关于Solaris的,但是 似乎只包括平均负载中的运行和可运行(即等待CPU)任务。这个问题的一个Linux版本是 这个。 - Nickolay


今天有同样的问题。 经过一些研究和诊断,我意识到我的小VPS是 磁盘耗尽

在shell / prompt(Linux / Unix)类型中

df -h

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


6
2018-01-23 17:36



那么你是在交换,我猜想,这是因为它造成的? - rogerdpack


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

它包括在一个小包中查看其他工具提供的相同数据的各种方法。

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


3
2017-07-19 18:17





只是为了补充一点,一些未提及的特定于Solaris的工具在调试这些问题时非常有用“intrstat”,“mpstat”和“lockstat”。之前在运行一些繁重的ETL加载的主机上经历过类似的问题后,mpstat发现大量的中断处理大量的I / O,暗示了这个问题。

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

Brendan Gregg写了很多关于性能的文章,尤其是I / O多年来,如果你想了解更多信息,那么值得搜索。


1
2018-06-23 14:20