我们在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服务器配置。可能是以某种方式人为地控制性能,从而在运行队列中留下很多线程。 (尽管不知道那将是什么,甚至是不可能的)。不过,对于一个写得很好的问题,我们表示敬意。

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

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

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

#1 楼

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

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

评论


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

–妖精
18年11月2日在20:31

#2 楼

当您说“高平均负载”时,我假设您的意思是prstat在

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


这些数字的输出数字的底部显示“平均负载”到顶部提供的值,可能意味着正在运行的进程的平均队列大小。这不是使用的处理器时间的百分比,而是有多少“东西”骚扰了CPU以便运行。诚然,它们看起来确实很高,但这全都取决于您正在运行的应用程序。进程获得插槽后实际上可能并不会做太多事情。请参阅此处以获取有关top的详细说明。这可能是导致这些高平均负载数的原因。确保在适当的地方使用连接池连接到后端,并考虑增加应用程序可用于处理连接的空闲线程数(不确定如何在WebLogic上执行此操作; Tomcat具有每个连接器线程池或一般执行程序线程池)。如果不这样做,则可能会产生全新的线程来处理请求。

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

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

对于Java,我建议安装Java Melody。它可以提供有关程序执行情况的大量信息,并有助于缩小程序花费的时间。我只在Tomcat上使用过它,但在任何Java EE容器/ servlet上都可以正常工作。

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

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

评论


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

– Spiff
2012年1月1日14:02

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

– eirescot
2012年3月1日22:43

#3 楼

附带说明一下,平均负载还包括等待磁盘活动(例如,骚扰磁盘)以及等待cpu的事物,这是两者的总和...因此您可能会遇到一个问题。 >
请参见http://en.wikipedia.org/wiki/Load_(计算)“ Linux还包括处于不间断睡眠状态(通常等待磁盘活动)的[平均负载]进程”“ br />作为一个侧面说明,我遇到的一个特殊问题是我的平均负载较高,但也有大量的闲置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}}}


哪个给出了这样的顶部输出:大量的闲置CPU(0.0%WA),但平均负载非常高。另请参见http://linuxgazette.net/141/misc/lg/tracking_load_average_issues.html

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

评论


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

– Nickolay
18年9月12日在11:49

#4 楼

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

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

df -h


查看计算机上的可用磁盘。
如果磁盘空间不足,可能是问题/问题。

评论


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

–rogerdpack
13年7月19日在16:33

#5 楼

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

它以一个小包装包含了多种查看其他工具提供的相同数据的方法。

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

#6 楼

除此之外,还没有提到某些在调试此类问题中有用的Solaris特定工具,例如“ intrstat”,“ mpstat”和“ lockstat”。以前,在运行一些繁重的ETL负载的主机上遇到了类似的问题,mpstat显示了大量的中断,这些中断处理着大量的I / O,暗示了这个问题。使用mpstat 4,我们看到在短的监视周期内,vcpus处理了超过30000个中断,此后性能开始下降。在这种情况下,唯一的解决方法是投入更多的CPU,但是后来进行了改进代码的工作。如果您想了解更多信息,值得进行搜索。