你可能也会遇到在 Linux 系统中找出 CPU 占用高的进程的情形。如果是这样,那么你需要列出系统中 CPU 占用高的进程列表来确定。我认为只有两种方法能实现:使用 top 命令 和 ps 命令。出于一些理由,我更倾向于用 top 命令而不是 ps 命令。但是两个工具都能达到你要的目的,所以你可以根据需求决定使用哪个。这两个工具都被 Linux 系统管理员广泛使用。

1) 怎样使用 top 命令找出 Linux 中 CPU 占用高的进程

在所有监控 Linux 系统性能的工具中,Linux 的 top 命令是最好的也是最知名的一个。top 命令提供了 Linux 系统运行中的进程的动态实时视图。它能显示系统的概览信息和 Linux 内核当前管理的进程列表。它显示了大量的系统信息,如 CPU 使用、内存使用、交换内存、运行的进程数、目前系统开机时间、系统负载、缓冲区大小、缓存大小、进程 PID 等等。默认情况下,top 命令的输出结果按 CPU 占用进行排序,每 5 秒中更新一次结果。如果你想要一个更清晰的视图来更深入的分析结果,以批处理模式运行 top 命令 是最好的方法。同时,你需要 理解 top 命令输出结果的含义 ,这样才能解决系统的性能问题。

[root@feiyu ~]# top -b | head -50
top - 06:23:00 up 1 day,  8:40,  2 users,  load average: 0.05, 0.05, 0.05
Tasks: 119 total,   1 running, 117 sleeping,   0 stopped,   1 zombie
%Cpu(s):  0.0 us,  3.2 sy,  0.0 ni, 96.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3880180 total,  2223808 free,   776504 used,   879868 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  2844704 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0   43584   3872   2560 S   0.0  0.1   0:01.69 systemd
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.03 kthreadd
    4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
    5 root      20   0       0      0      0 S   0.0  0.0   0:00.28 kworker/u4:0
    6 root      20   0       0      0      0 S   0.0  0.0   0:00.82 ksoftirqd/0
    7 root      rt   0       0      0      0 S   0.0  0.0   0:00.43 migration/0
    8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh
    9 root      20   0       0      0      0 S   0.0  0.0   0:32.17 rcu_sched
   10 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 lru-add-drain
   11 root      rt   0       0      0      0 S   0.0  0.0   0:00.39 watchdog/0
   12 root      rt   0       0      0      0 S   0.0  0.0   0:00.35 watchdog/1
   13 root      rt   0       0      0      0 S   0.0  0.0   0:00.42 migration/1
   14 root      20   0       0      0      0 S   0.0  0.0   0:00.38 ksoftirqd/1
   16 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/1:0H
   18 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kdevtmpfs
   19 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 netns
   20 root      20   0       0      0      0 S   0.0  0.0   0:00.02 khungtaskd
   21 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 writeback
   22 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kintegrityd
   23 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 bioset
   24 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 bioset
   25 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 bioset
   26 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kblockd
   27 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 md
   28 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 edac-poller
   29 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 watchdogd
   31 root      20   0       0      0      0 S   0.0  0.0   0:13.53 kworker/1:1
   36 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kswapd0
   37 root      25   5       0      0      0 S   0.0  0.0   0:00.00 ksmd
   38 root      39  19       0      0      0 S   0.0  0.0   0:00.53 khugepaged
   39 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 crypto
   47 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kthrotld
   49 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kmpath_rdacd
   50 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kaluad
   51 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kpsmoused
   53 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 ipv6_addrconf
   66 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 deferwq
  165 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kauditd
  206 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 iscsi_eh
  256 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 ata_sff
  263 root      20   0       0      0      0 S   0.0  0.0   0:00.00 scsi_eh_0
  264 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 scsi_tmf_0
  265 root      20   0       0      0      0 S   0.0  0.0   0:00.00 scsi_eh_1

上面的命令的各部分解释:

  • top:命令
  • -b:批次档模式
  • head -50:显示输出结果的前 50 个
  • PID:进程的 ID
  • USER:进程的归属者
  • PR:进程的等级
  • NI:进程的 NICE 值
  • VIRT:进程使用的虚拟内存
  • RES:进程使用的物理内存
  • SHR:进程使用的共享内存
  • S:这个值表示进程的状态: S = 睡眠,R = 运行,Z = 僵尸进程
  • %CPU:进程占用的 CPU 比例
  • %MEM:进程使用的 RAM 比例
  • TIME+:进程运行了多长时间
  • COMMAND:进程名字

如果你想看命令的完整路径而不是命令名字,以运行下面的格式 top 命令:

[root@feiyu ~]# top -c -b | head -50
top - 06:23:48 up 1 day,  8:41,  2 users,  load average: 0.13, 0.07, 0.05
Tasks: 120 total,   1 running, 118 sleeping,   0 stopped,   1 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 93.8 id,  3.1 wa,  0.0 hi,  3.1 si,  0.0 st
KiB Mem :  3880180 total,  2221596 free,   778064 used,   880520 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  2843048 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0   43584   3872   2560 S   0.0  0.1   0:01.69 /usr/lib/systemd/systemd --switched-root --system --deseri+
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.03 [kthreadd]
    4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [kworker/0:0H]
    5 root      20   0       0      0      0 S   0.0  0.0   0:00.28 [kworker/u4:0]
    6 root      20   0       0      0      0 S   0.0  0.0   0:00.82 [ksoftirqd/0]
    7 root      rt   0       0      0      0 S   0.0  0.0   0:00.43 [migration/0]
    8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 [rcu_bh]
    9 root      20   0       0      0      0 S   0.0  0.0   0:32.19 [rcu_sched]
   10 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [lru-add-drain]
   11 root      rt   0       0      0      0 S   0.0  0.0   0:00.39 [watchdog/0]
   12 root      rt   0       0      0      0 S   0.0  0.0   0:00.35 [watchdog/1]
   13 root      rt   0       0      0      0 S   0.0  0.0   0:00.42 [migration/1]
   14 root      20   0       0      0      0 S   0.0  0.0   0:00.38 [ksoftirqd/1]
   16 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [kworker/1:0H]
   18 root      20   0       0      0      0 S   0.0  0.0   0:00.00 [kdevtmpfs]
   19 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [netns]
   20 root      20   0       0      0      0 S   0.0  0.0   0:00.02 [khungtaskd]
   21 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [writeback]
   22 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [kintegrityd]
   23 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [bioset]
   24 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [bioset]
   25 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [bioset]
   26 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [kblockd]
   27 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [md]
   28 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [edac-poller]
   29 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [watchdogd]
   31 root      20   0       0      0      0 S   0.0  0.0   0:13.53 [kworker/1:1]
   36 root      20   0       0      0      0 S   0.0  0.0   0:00.00 [kswapd0]
   37 root      25   5       0      0      0 S   0.0  0.0   0:00.00 [ksmd]
   38 root      39  19       0      0      0 S   0.0  0.0   0:00.53 [khugepaged]
   39 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [crypto]
   47 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [kthrotld]
   49 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [kmpath_rdacd]
   50 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [kaluad]
   51 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [kpsmoused]
   53 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [ipv6_addrconf]
   66 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [deferwq]
  165 root      20   0       0      0      0 S   0.0  0.0   0:00.03 [kauditd]
  206 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [iscsi_eh]
  256 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [ata_sff]
  263 root      20   0       0      0      0 S   0.0  0.0   0:00.00 [scsi_eh_0]
  264 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [scsi_tmf_0]
  265 root      20   0       0      0      0 S   0.0  0.0   0:00.00 [scsi_eh_1]

2) 怎样使用 ps 命令找出 Linux 中 CPU 占用高的进程

ps 是进程状态process status的缩写,它能显示系统中活跃的/运行中的进程的信息。它提供了当前进程及其详细信息,诸如用户名、用户 ID、CPU 使用率、内存使用、进程启动日期时间、命令名等等的快照。

[root@feiyu ~]# ps -eo pid,ppid,%mem,%cpu,cmd --sort=-%cpu | head
  PID  PPID %MEM %CPU CMD
 2695     1  1.1  1.0 /usr/local/qcloud/YunJing/YDEyes/YDService
 1235     1  0.0  0.9 /usr/sbin/rshim
23203  1491  0.1  0.4 sshd: root@pts/0,pts/1
 1536     1  0.1  0.1 /usr/local/qcloud/tat_agent/tat_agent
 2708  2695  0.5  0.1 /usr/local/qcloud/YunJing/YDEdr
23390 23245  0.0  0.1 top
24549  2043  0.0  0.1 [python] <defunct>
    1     0  0.0  0.0 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
    2     0  0.0  0.0 [kthreadd]

上面的命令的各部分解释:

  • ps:命令名字
  • -e:选择所有进程
  • -o:自定义输出格式
  • –sort=-%cpu:基于 CPU 使用率对输出结果排序
  • head:显示结果的前 10 行
  • PID:进程的 ID
  • PPID:父进程的 ID
  • %MEM:进程使用的 RAM 比例
  • %CPU:进程占用的 CPU 比例
  • Command:进程名字

如果你只想看命令名字而不是命令的绝对路径,以运行下面的格式 ps 命令:

[root@feiyu ~]# ps -eo pid,ppid,%mem,%cpu,cmd --sort=-%cpu | head
  PID  PPID %MEM %CPU CMD
 2695     1  1.1  1.0 /usr/local/qcloud/YunJing/YDEyes/YDService
 1235     1  0.0  0.9 /usr/sbin/rshim
23203  1491  0.1  0.4 sshd: root@pts/0,pts/1
 1536     1  0.1  0.1 /usr/local/qcloud/tat_agent/tat_agent
 2708  2695  0.5  0.1 /usr/local/qcloud/YunJing/YDEdr
23390 23245  0.0  0.1 top
24549  2043  0.0  0.1 [python] <defunct>
    1     0  0.0  0.0 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
    2     0  0.0  0.0 [kthreadd]
[root@VM-8-8-centos ~]# ps -eo pid,ppid,%mem,%cpu,comm --sort=-%cpu | head
  PID  PPID %MEM %CPU COMMAND
 2695     1  1.1  1.0 YDService
 1235     1  0.0  0.9 rshim
23203  1491  0.1  0.4 sshd
 1536     1  0.1  0.1 tat_agent
 2708  2695  0.5  0.1 YDEdr
23390 23245  0.0  0.1 top
    1     0  0.0  0.0 systemd
    2     0  0.0  0.0 kthreadd
    4     2  0.0  0.0 kworker/0:0H