FreeBSD 顶层实现中总 CPU 使用率和进程列表下的 CPU 使用率不同?

FreeBSD 顶层实现中总 CPU 使用率和进程列表下的 CPU 使用率不同?

由于某种原因,我的 FreeBSD 机器上的总体 CPU 使用率在 1% 到 85% 之间波动,但进程列中的 CPU 使用率加起来永远不会达到这个数量。例如这里整体CPU使用率为83.5%,但进程列表中的CPU使用率低于2%:

last pid: 22965;  load averages:  1.45,  1.72,  3.06                                                                                                                                                                                                  up 151+20:08:57 12:32:38
137 processes: 2 running, 135 sleeping
CPU: 83.5% user,  0.0% nice, 12.8% system,  0.0% interrupt,  3.8% idle
Mem: 222M Active, 88M Inact, 315M Wired, 16M Cache, 110M Buf, 342M Free
Swap: 1996M Total, 30M Used, 1966M Free, 1% Inuse

  PID USERNAME    THR PRI NICE   SIZE    RES STATE    TIME    CPU COMMAND
22965 martin       1  96    0  7704K  4172K RUN      0:00  1.27% snmpset
 1234 root          1  44    0  3804K  1068K select  50:36  0.00% hald-addon-storage
 1204 haldaemon     1  44    0  7236K  2300K select  24:13  0.00% hald
 1135 root          1  44    0  3372K   928K nanslp   9:34  0.00% cron
46828 martin       1  44    0 11844K  4140K select   6:06  0.00% irssi
  407 _pflogd       1  44    0  3528K   604K bpf      5:41  0.00% pflogd
86984 root          1  44    0  5284K   996K select   5:14  0.00% gam_server
95843 martin       1  76    0  4560K  1192K wait     5:03  0.00% bash
 6714 martin       1  44    0  5748K  2512K select   4:46  0.00% screen
  775 root          1  44    0  3344K   532K select   3:48  0.00% syslogd

这两个领域有何CPU不同?什么可能导致这种行为?当 CPU 总使用率在 60 - 80% 左右时,机器的响应速度肯定会变慢。

编辑:

top还显示了如果内核线程的输出( Shift + s):

last pid: 54866;  load averages:  0.62,  0.90,  1.02                                                                                                                                                                                                  up 153+19:26:17 11:49:58
208 processes: 3 running, 188 sleeping, 17 waiting
CPU: 75.3% user,  0.0% nice, 12.4% system,  0.0% interrupt, 12.4% idle
Mem: 395M Active, 154M Inact, 324M Wired, 16M Cache, 110M Buf, 94M Free
Swap: 1996M Total, 112M Used, 1883M Free, 5% Inuse, 8K In

  PID USERNAME    THR PRI NICE   SIZE    RES STATE    TIME    CPU COMMAND
   11 root          1 171 ki31     0K     8K RUN    2809.4 52.78% idle
54866 martin       1  96    0  6680K  3548K RUN      0:00  0.98% snmpset
15836 root          1  44    0   322M   307M select  31:51  0.29% Xorg
   12 root         17 -60    -     0K   136K WAIT   455:55  0.00% intr
   17 root          1  44    -     0K     8K syncer 162:57  0.00% syncer
 1234 root          1  44    0  3804K  1068K select  51:16  0.00% hald-addon-storage
    3 root          1  -8    -     0K     8K -       27:06  0.00% g_up
 1204 haldaemon     1  44    0  7236K  2268K select  24:32  0.00% hald
    4 root          1  -8    -     0K     8K -       23:52  0.00% g_down
   13 root          1 -16    -     0K     8K -       20:20  0.00% yarrow
   14 root         20 -64    -     0K   160K -       14:37  0.00% usb
    2 root          1  -8    -     0K     8K -       10:42  0.00% g_event

答案1

默认top只显示用户进程(即除内核及其线程之外的进程)。内核可能正忙于磁盘或网络 IO,但未显示在top显示中。您可以top通过按 来切换内核线程的显示SHIFTs

您可以使用该vmstat实用程序显示自系统启动以来有关网络和磁盘活动(除其他外)的统计信息。vmstat -i将显示自启动以来每个设备接收到的中断数量,以及每秒接收中断的平均速率。用于vmstat -p da查看您的磁盘正在做什么。

其他工具,如iostatsystatnetstat也可能提供丰富的信息。

您可以通过调整调度程序配置来提高系统在负载下的响应能力。要立即更改它,请sysctl kern.sched.preempt_thresh=240以 root 身份运行。要在启动时应用相同的设置,请确保/etc/sysctl.conf也将其添加到。这应该会有所帮助,但请注意,其有效性将受到您的工作负载和硬件特性的限制。

相关内容