[Linux]Process Utilization

Process Utilization

1 进程跟踪:使用top命令

top 输出详解

运行 top 命令后,会看到如下输出:

1
2
3
4
5
6
7
8
9
10
11
top - 18:06:26 up 6 days,  4:07,  2 users,  load average: 0.92, 0.62, 0.59
Tasks: 389 total, 1 running, 387 sleeping, 0 stopped, 1 zombie
%Cpu(s): 1.8 us, 0.4 sy, 0.0 ni, 97.6 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 32870888 total, 27467976 used, 5402912 free, 518808 buffers
KiB Swap: 33480700 total, 39892 used, 33440808 free. 19454152 cached Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

6675 patty 20 0 1731472 520960 30876 S 8.3 1.6 160:24.79 chrome

6926 patty 20 0 935888 163456 25576 S 4.3 0.5 5:28.13 chrome
  • 第一行:显示当前时间、系统已运行时长、当前登录用户数及系统负载平均值。

  • 第二行:展示了系统中任务的状态,包括运行中、休眠、停止及僵尸状态的任务数量。

  • 第三行:CPU 使用情况细分

    • us:用户cpu时间

    • sy:系统cpu时间

    • ni:nice cpu时间

    • id:cpu空闲时间

    • wa:cpu等待I/O时间,如果很低,通常不会是网络或disk问题

    • hi:cpu花在处理硬件中断上的时间

    • si:cpu花在处理软中断上的时间

    • st:steal time,如果运行了虚拟机,这表示被其他任务偷走的cpu时间

  • 第四与第五行:分别展示内存和交换分区的使用情况。随后是进程列表,每个进程的信息包括:

    • PID: 进程ID

    • USER: 拥有该进程的用户

    • PR: 进程优先级

    • NI: nice值

    • VIRT: 虚拟内存使用量

    • RES: 物理内存使用量

    • SHR: 共享内存大小

    • S: 进程状态(S=睡眠,R=运行,Z=僵尸,D=不可中断,T=已停止)

    • %CPU: 占用的CPU百分比

    • %MEM: 占用的RAM百分比

    • TIME+: 总活动时间

    • COMMAND: 进程名称

若只想监控特定进程ID为1的进程,可以使用以下命令:

1
$ top -p 1

2 使用 lsoffuser 工具

当尝试卸载一个USB设备时,如果遇到“设备或资源忙”的错误,如何确定哪些文件正在被使用?这里介绍两个实用工具:lsoffuser

lsof

lsof(”list open files”的缩写)命令用于列出系统上所有打开的文件及其关联进程。在Linux系统中,“文件”不仅指文本文件、图像等,还包括磁盘、管道、网络套接字、设备等。

例如,要查看当前目录下有哪些文件被哪些进程打开:

1
pete@icebox:~$ lsof .

输出示例:

1
2
3
4
5
6
7
8
9
COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
lxsession 1491 pete cwd DIR 8,6 4096 131 .
update-no 1796 pete cwd DIR 8,6 4096 131 .
nm-applet 1804 pete cwd DIR 8,6 4096 131 .
indicator 1809 pete cwd DIR 8,6 4096 131 .
xterm 2205 pete cwd DIR 8,6 4096 131 .
bash 2207 pete cwd DIR 8,6 4096 131 .
lsof 5914 pete cwd DIR 8,6 4096 131 .
lsof 5915 pete cwd DIR 8,6 4096 131 .

这展示了每个进程的工作目录(cwd),帮助识别占用设备或文件的进程。

fuser

fuser 命令提供了另一种追踪文件使用的手段。它显示使用特定文件或文件系统的进程信息。

例如,查看哪个进程正在使用 /home/pete 目录:

1
pete@icebox:~$ fuser -v .

输出示例:

1
2
3
4
5
6
7
                     USER  PID ACCESS COMMAND
/home/pete: pete 1491 ..c.. lxsession
pete 1796 ..c.. update-notifier
pete 1804 ..c.. nm-applet
pete 1809 ..c.. indicator-power
pete 2205 ..c.. xterm
pete 2207 ..c.. bash

此输出揭示了哪些进程正在访问指定目录。通过这些信息,可以决定是否终止相关进程以释放设备或文件,从而顺利完成卸载操作。

3 线程

线程与进程类似,它们都是执行程序的实体,常被称为轻量级进程。

进程各自独立运作,并拥有隔离的系统资源,而线程则能够在同一进程中共享这些资源,这使得线程间的通信更为便捷。在某些情况下,采用多线程应用程序比使用多进程应用程序更加高效。

举例来说,当同时打开LibreOffice Writer和Chrome时,每个应用都作为独立的进程运行。在Writer中编辑文本时,编辑动作和自动保存功能可以并行作为两个“轻量级进程”,即线程来实现。

查看进程线程

要查看系统中的进程及其线程,可以使用ps m命令:

1
pete@icebox:~$ ps m

输出示例:

1
2
3
4
5
 PID TTY      STAT   TIME COMMAND
2207 pts/2 - 0:01 bash
- - Ss 0:01 -
5252 pts/2 - 0:00 ps m
- - R+ 0:00 -

在此示例中,PID表示各个进程,而在进程下的线程以“–”标识。从上述输出可以看出,这两个进程均为单线程进程。

4 CPU监控

uptime命令可以帮助我们快速了解系统的运行时间和负载情况。

1
2
pete@icebox:~$ uptime
17:23:35 up 1 day, 5:59, 2 users, load average: 0.00, 0.02, 0.05

uptime命令提供了关于系统运行时间、当前登录用户数以及过去1分钟、5分钟和15分钟的平均负载的信息。

平均负载

平均负载是衡量CPU负载的一个良好指标,所谓CPU负载,指的是等待CPU执行的进程数的平均值。

对于多核处理器而言,每个核心可以被视为一条独立的车道。例如,拥有四核处理器(4个核心)的计算机,其平均负载为1时,实际上只使用了25%的CPU资源。可以通过查看/proc/cpuinfo文件来确认系统中的核心数量:

1
cat /proc/cpuinfo

监控与分析

观察平均负载时,必须考虑核心数量。如果发现系统的平均负载持续偏高,可能意味着存在需要解决的问题。

5 I/O监控

除了CPU使用情况,还可以通过iostat来监控磁盘使用情况。下面是一个示例输出:

1
2
3
4
5
6
7
8
9
pete@icebox:~$ iostat

Linux 3.13.0-39-lowlatency (icebox) 01/28/2016 _i686_ (1 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.13 0.03 0.50 0.01 0.00 99.33

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.17 3.49 1.92 385106 212417

第一部分是CPU信息

  • %user: 显示执行用户级应用程序时的CPU利用率百分比。
  • %nice: 显示在执行具有优先级调整的用户级进程时的CPU利用率百分比。
  • %system: 显示执行系统级别(内核)任务时的CPU利用率百分比。
  • %iowait: 显示CPU在有未完成磁盘I/O请求期间处于空闲状态的时间百分比。
  • %steal: 显示虚拟CPU等待其他虚拟处理器服务时所花费的时间百分比。
  • %idle: 显示CPU在没有未完成磁盘I/O请求的情况下处于空闲状态的时间百分比。

第二部分是磁盘利用率

  • tps: 每秒传输到设备的次数。一次传输即为对设备的一个I/O请求,多个逻辑请求可以合并成一个I/O请求。
  • kB_read/s: 每秒从设备读取的数据量,以KB表示。
  • kB_wrtn/s: 每秒写入设备的数据量,以KB表示。
  • kB_read: 从设备读取的总数据量,单位是KB。
  • kB_wrtn: 写入设备的总数据量,单位是KB。

6 内存监控

可以使用vmstat工具来监控内存使用情况。以下是一个示例输出:

1
2
3
4
5
pete@icebox:~$ vmstat

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 396528 38816 384036 0 0 4 2 38 79 0 0 99 0 0

进程(procs)

  • r: 处于运行状态的进程数量。
  • b: 处于不可中断睡眠状态的进程数量。

内存(memory)

  • swpd: 已使用的虚拟内存大小。
  • free: 空闲内存大小。
  • buff: 用作缓冲区的内存大小。
  • cache: 用作缓存的内存大小。

交换(swap)

  • si: 从磁盘交换进内存的数据量。
  • so: 从内存交换到磁盘的数据量。

I/O

  • bi: 从块设备接收到的数据块数量。
  • bo: 发送到块设备的数据块数量。

系统(system)

  • in: 每秒发生的中断次数。
  • cs: 每秒上下文切换次数。

CPU

  • us: 用户态时间占比。
  • sy: 内核态时间占比。
  • id: 空闲时间占比。
  • wa: 等待I/O操作完成的时间占比。

7 持续监控

当系统出现问题时,使用监控工具进行检查是很有帮助的。然而,对于那些在不观察时发生的问题,需要依赖持续监控工具。这类工具能够收集、报告并保存系统活动信息,便于后续分析。

安装sar

sar用于对系统进行历史数据分析。首先,请确保已安装sysstat包,以便使用sar。可以通过以下命令安装:

1
sudo apt install sysstat

设置数据收集

通常,在安装sysstat后,系统会自动开始收集数据。如果没有自动开启,可以通过修改/etc/default/sysstat文件中的ENABLED字段来启用数据收集功能。

使用sar

  • 查看当天系统负载详情:

    1
    sudo sar -q
  • 查看当天内存使用情况:

    1
    sudo sar -r
  • 查看CPU使用情况:

    1
    sudo sar -P

要查看其他日期的数据,可以访问/var/log/sysstat/saXX目录,其中XX是要查看的日期。例如,查看2号的数据,可以使用如下命令:

1
sar -q /var/log/sysstat/sa02

8 定时任务(Cron Jobs)

cron是Linux中用于定时执行任务的工具。通过cron服务,可以在指定的时间自动运行程序,这对于需要每日或定期执行的脚本尤其有用。

例如,假设有一个位于/home/pete/scripts/change_wallpaper的脚本,希望每天早晨用它来更换壁纸。但目前每次都需要手动执行这个脚本。此时,可以通过创建一个cron作业,在指定时间自动执行该脚本。

以下是一个示例:

1
30 08 * * * /home/pete/scripts/change_wallpaper

各字段从左至右分别表示:

  • 分钟(0-59)
  • 小时(0-23)
  • 月份中的某一天(1-31)
  • 月(1-12)
  • 星期几(0-7),其中0和7均代表星期日

星号(*)表示匹配所有可能值。因此,上述示例将在每天的上午8:30执行。

要创建cron作业,只需编辑crontab文件:

1
crontab -e

这将打开当前用户的cron作业列表,可以在此添加新的作业。


[Linux]Process Utilization
https://erlsrnby04.github.io/2025/03/22/Linux-Process-Utilization/
作者
ErlsrnBy04
发布于
2025年3月22日
许可协议