如何控制特定进程的系统负载?例如 Java

如何控制特定进程的系统负载?例如 Java

所以 Java 一直困扰着我们的系统。我们的开发人员仍在调查此事,但作为管理员,我们能做些什么呢?

在总共有 8 个核心的双插槽系统上,负载峰值在 40 时达到。白天平均负载:17.78、23.18、24.71 根据此:http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages
这不正常。

除了升级系统,还能做什么呢?我们目前的问题是系统随机挂起,出现“任务 java:4242 被阻止超过 120 秒”的情况,然后在高负载期间出现混乱。

我们能做什么?

在负载期间:平均负载:21.40、21.76、21.80

iostat:

      avg-cpu:  %user   %nice %system %iowait  %steal   %idle
                13.75    0.00    0.49    0.00    0.00   85.77

      Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
      xvda              2.16         1.82        32.63     832500   14917166

虚拟机状态:

      procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
      r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
      0  0  21172 1272200 138540 583268   0    0     0     3    9    5 14  0 86  0

顶部:

top - 14:41:02 up 5 days,  7:26,  2 users,  load average: 23.01, 22.17, 21.82
Tasks: 103 total,   1 running, 102 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   5291864k total,  4017092k used,  1274772k free,   138544k buffers
Swap:  1959924k total,    21172k used,  1938752k free,   583332k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
25637 root      20   0 1691m 559m  13m S    2 10.8   4:46.91 java
  848 root      20   0 3044m 2.3g 9844 S    1 45.4   5521:37 java
27729 root      20   0 19272 1272  948 R    0  0.0   0:00.03 top
    1 root      20   0 23760 1696 1200 S    0  0.0   0:01.49 init
    2 root      20   0     0    0    0 S    0  0.0   0:00.00 kthreadd
    3 root      20   0     0    0    0 S    0  0.0   0:00.29 ksoftirqd/0
    4 root      20   0     0    0    0 S    0  0.0   0:00.00 kworker/0:0

答案1

答案2

我觉得还发生了一些你没有注意到或者没有告诉我们的事情。

  • 您没有 I/O 问题,甚至没有显著的 I/O 负载
  • 您不是在裸机上运行。xvda是虚拟设备的指示器。
  • 你拥有“充足的时间”——尽管显示的平均负载很高,但你的系统报告的空闲率为 85%。

以下是我最有可能的猜测:

  • 您在错误的时间拍摄了演示快照。CPU 实际上负担更重,您应该使用类似 的工具sar进行报告。atop也是我的最爱。
  • 您的负载通常较低,但瞬间突发量非常高,导致总体平均负载较高。
  • 您遇到了一个隐蔽的错误或硬件问题。您应该发布已终止进程的堆栈跟踪记录,以便我们猜测问题出在哪里。

至于问题本身的主题:降低平均负载的唯一方法是减少主动竞争 CPU 时间的进程数量。

相关内容