查找内核空间程序

查找内核空间程序

我们如何确定%sy消耗 CPU 的进程。

在以下情况下,没有 netfilter 并且流量低于 1 mbps,但系统进程仍然占用过多的 CPU,并且 niced 进程的 CPU 使用率也很高。我们如何从系统级别确定消耗 CPU 的进程。

top - 01:22:18 up  10:09,  3 users,  load average: 14.36, 13.68, 11.68
Tasks: 200 total,   3 running, 197 sleeping,   0 stopped,   0 zombie
Cpu0  :  3.1%us, 63.5%sy, 33.3%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  1.8%us, 34.2%sy, 64.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  16436984k total,  8449956k used,  7987028k free,    73420k buffers
Swap:  8385920k total,        0k used,  8385920k free,  5566404k cached
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
5706 tlmsys    27   4 4490m 1.6g  13m S 51.6 10.2  12:37.67 java
4233 oracle    25   0 3448m  47m  33m R  9.9  0.3   0:03.62 oracle
3166 root      15   0 62616 1216  656 S  0.7  0.0   0:01.47 sshd
5512 tlmsys    15   0 96992  12m 9424 S  0.7  0.1   0:04.03 stlfetch
5520 oracle    15   0 3424m  72m  69m S  0.7  0.5   0:08.42 oracle
6 root      10  -5     0    0    0 S  0.3  0.0   0:01.59 events/0
4476 monitor   15   0 90116 1764 1008 S  0.3  0.0   0:00.61 sshd
5872 tlmsys    25   4 4479m 135m  11m S  0.3  0.8   0:25.72 java
7139 oracle    16   0 12740 1180  824 S  0.3  0.0   0:06.76 top
9268 root      16   0 12740 1180  816 S  0.3  0.0   0:02.80 top
9978 root      15   0 12740 1176  820 R  0.3  0.0   0:00.07 top
1 root      15   0 10348  696  584 S  0.0  0.0   0:00.79 init
2 root      RT  -5     0    0    0 S  0.0  0.0   0:00.02 migration/0
3 root      34  19     0    0    0 S  0.0  0.0   0:00.03 ksoftirqd/0
4 root      RT  -5     0    0    0 S  0.0  0.0   0:00.01 migration/1
5 root      34  19     0    0    0 R  0.0  0.0   0:00.00 ksoftirqd/1
7 root      10  -5     0    0    0 S  0.0  0.0   0:00.16 events/1
8 root      10  -5     0    0    0 S  0.0  0.0   0:00.09 khelper
145 root      12  -5     0    0    0 S  0.0  0.0   0:00.03 kthread
150 root      10  -5     0    0    0 S  0.0  0.0   0:00.15 kblockd/0
151 root      10  -5     0    0    0 S  0.0  0.0   0:00.03 kblockd/1
152 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 kacpid
311 root      13  -5     0    0    0 S  0.0  0.0   0:00.00 cqueue/0
312 root      13  -5     0    0    0 S  0.0  0.0   0:00.00 cqueue/1
315 root      13  -5     0    0    0 S  0.0  0.0   0:00.00 khubd
317 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 kseriod
389 root      18   0     0    0    0 S  0.0  0.0   0:00.00 pdflush
390 root      15   0     0    0    0 S  0.0  0.0   0:00.78 pdflush
391 root      13  -5     0    0    0 S  0.0  0.0   0:00.00 kswapd0
392 root      13  -5     0    0    0 S  0.0  0.0   0:00.00 aio/0
393 root      13  -5     0    0    0 S  0.0  0.0   0:00.00 aio/1
599 root      11  -5     0    0    0 S  0.0  0.0   0:00.00 kpsmoused
645 root      10  -5     0    0    0 S  0.0  0.0   0:00.01 mpt_poll_0

很明显,java 占用了 51.6% 的 CPU,而 oracle 占用了 9.9,所以即使所有进程的 CPU 加起来也低于 100%,平均负载也应该低于 2,

但为什么平均负载是14。

我们如何才能看到使用高 CPU 的内核进程 (%sy)。

uname -a

Linux 2.6.18-155.el5 (todbase1) 

如果是内核错误,我们还能从系统端看到该进程吗?

答案1

%sy 既表示内核进程(实际上是内核线程)所花费的时间,也表示内核中不是进程的部分所花费的时间。内核进程通常会显示在 top 中(ksoftirqd/0是其中之一)。如果您按瞬时 CPU 使用率排序,并且是内核进程对 %sy 有所贡献,则该进程会显示出来。但是,如果它不是内核进程而是正在执行的内核,top 将不会提供任何信息。

具体来说,内核实际上有一个中断上下文(实际上有好几个,用于硬件和软件中断)和一个进程上下文(用于运行系统调用)。如果我没记错的话,后一种类型将显示为导致中断的进程的 CPU 时间。但是,内核的调度方面以及与系统调用或其他中断处理无关的内核组件的活动将没有详细的记帐信息。

答案2

对于系统时间,有两个主要的 IO 候选:

  • 网络 - 但缓冲区较低
  • 磁盘 IO - 通常你也应该看到等待 - 但这里不是这种情况
  • 次要候选可能是 RAM 吞吐量(Java 垃圾收集?)

我有点困惑的是你的高好的价值。

也许cat /proc/interrupts这里可以给你提供更多的信息。

我倾向于说您遇到了与网络相关的问题。

因此也添加 的输出ethtool -S IFACE |grep -vw 0。将 IFACE 替换为你的主 NIC 的名称。

答案3

使用较新的内核,您可以使用 perf top;在 redhat 5.X 上,如果您想深入了解,可以使用 systemtap。在实时生产系统上使用 systemtap 时要小心,因为它在内核空间中工作。

相关内容