Monitoring System Resources with pidstat: CPU, Memory, Threads, and Device I/O Usage

pidstat is a versatile command-line tool designed to monitor system resource usage, including CPU, memory, threads, and device I/O, across all or selected processes.

Overview:

pidstat is used to monitor the usage of CPU, memory, threads, device I/O, and other system resources for all or specific processes.

Syntax:

pidstat [options] [<interval> [<count>]]

Description:

When pidstat runs for the first time, it displays statistics from system startup. Subsequent executions will show data since the last run. Users can specify the interval and the number of times statistics should be displayed. It is part of the sysstat package, a performance monitoring toolkit, and can be accessed after installing sysstat.

Options:

  • -u – Display CPU usage of each process.
  • -r – Display memory usage of each process.
  • -d – Display I/O usage of each process.
  • -p <pid> – Specify process ID to monitor.
  • -w – Display context switch details for each process.
  • -t – Show additional thread statistics.
  • -V – Display the version of the tool.
  • -h – Display header in a more compact format to fit narrower terminal windows.
  • -I – On SMP systems, displays CPU usage per core.
  • -l – Show command name and all parameters.
  • -T {TASK | CHILD | ALL} – Scope of reported statistics:
    • TASK: Report stats for the specified task (process).
    • CHILD: Report stats only for child processes, useful for performance monitoring of a process’s descendants.
    • ALL: Comprehensive stats for both the task and all its child processes.
  • -C <command> – Monitor the status of processes associated with a specific command.

Parameters:

  • interval: Time between displays (in seconds).
  • count: Number of times to display, default is continuous.

Example Usage:

Basic Usage:

$ pidstat

Example output:

Linux 6.8.0-45-generic (Ubuntu22-VirtualBox)   2024-10-19   _x86_64_   (2 CPU)

Time       UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
16:03:44   0         1      0.00    0.00    0.00    0.00    0.00     0  systemd
16:03:44   0         2      0.00    0.00    0.00    0.00    0.00     0  kthreadd
16:03:44   0        16      0.00    0.00    0.00    0.00    0.00     0  ksoftirqd/0

Display CPU Usage for All Processes:

$ pidstat -u -p ALL

Example output:

Linux 6.8.0-45-generic (Ubuntu22-VirtualBox)   2024-10-19   _x86_64_   (2 CPU)

Time       UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
16:17:49   0         1      0.00    0.00    0.00    0.00    0.00     0  systemd
16:17:49   0         2      0.00    0.00    0.00    0.00    0.00     0  kthreadd

Display CPU Usage for a Specific Process:

$ pidstat -u -p 1

Example output:

Linux 6.8.0-45-generic (Ubuntu22-VirtualBox)   2024-10-19   _x86_64_   (2 CPU)

Time       UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
16:18:07   0         1      0.00    0.00    0.00    0.00    0.00     1  systemd

Display I/O Usage:

$ pidstat -d

Example output:

Linux 6.8.0-45-generic (Ubuntu22-VirtualBox)   2024-10-19   _x86_64_   (2 CPU)

Time       UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
16:26:23   1000      1606    0.23      0.02      0.02       0  systemd

Display Context Switches:

$ pidstat -w

Example output:

Linux 6.8.0-45-generic (Ubuntu22-VirtualBox)   2024-10-19   _x86_64_   (2 CPU)

Time       UID       PID   cswch/s nvcswch/s  Command
16:29:11   0         1     0.19      0.04  systemd

Display Thread Statistics:

$ pidstat -t

Example output:

Linux 6.8.0-45-generic (Ubuntu22-VirtualBox)   2024-10-19   _x86_64_   (2 CPU)

Time       UID      TGID       TID    %usr %system  %guest   %wait    %CPU   CPU  Command
16:31:15   0         1         -    0.00    0.00    0.00    0.00    0.00     0  systemd

Field Explanations:

  • PID: Process ID
  • %usr: CPU percentage used in user space
  • %system: CPU percentage used in kernel space
  • %guest: CPU percentage used in virtual machine
  • %CPU: Total CPU percentage used by the process
  • CPU: CPU core number
  • Command: Command associated with the process

pidstat provides an in-depth look at resource usage, helping users understand how individual processes consume system resources, making it invaluable for performance monitoring and troubleshooting.

pidstat用于监控进程的CPU、内存、线程、设备 IO 等系统资源的使用情况

功能说明:用于监控全部或指定进程的CPU、内存、线程、设备 IO 等系统资源的使用情况。

语  法:pidstat [ options ] [ <interval> [ <count> ] ]

补充说明:pidstat 首次运行时显示自系统启动开始的各项统计信息,之后运行 pidstat 将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。pidstat是sysstat性能监控工具包的工具之一,安装sysstat即可得到pidstat。

   项: 

-u           显示各个进程的cpu使用情况

-r           显示各个进程的内存使用情况

-d           显示各个进程的IO使用情况

-p           指定进程号

-w          显示每个进程的上下文切换情况

-t            显示选择任务的线程的统计信息外的额外信息

-V          版本号

-h           以更简洁的方式显示输出数据的表头,以便适应更窄的显示屏幕或终端窗口

-I           在SMP环境,表示任务的CPU使用率/内核数量

-l            显示命令名和所有参数

-T { TASK | CHILD | ALL }        指定报告统计信息的进程的范围:

  • TASK:仅报告特定任务(任务即进程)。
  • CHILD:仅报告子进程的统计信息。这通常用于查看某个进程派生的所有子进程的相关性能数据。
  • ALL:报告所有相关信息,即当前任务及其所有子进程的综合统计信息。这可以用于全面了解进程及其子进程的资源使用情况。

-C <command>         查看对应command进程的状态

   数:

interval         显示间隔,单位s

count            显示次数,默认一直显示

   例:

$ pidstat

Linux 6.8.0-45-generic (Ubuntu22-VirtualBox)       2024年10月19日   _x86_64_  (2 CPU)

16时03分44秒   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command

16时03分44秒     0         1    0.00    0.00    0.00    0.00    0.00     0  systemd

16时03分44秒     0         2    0.00    0.00    0.00    0.00    0.00     0  kthreadd

16时03分44秒     0        16    0.00    0.00    0.00    0.00    0.00     0  ksoftirqd/0

16时03分44秒     0        17    0.00    0.00    0.00    0.01    0.00     1  rcu_preempt

对输出信息中的字段的解释:

PID        进程ID

%usr      进程在用户空间占用cpu的百分比

%system       进程在内核空间占用cpu的百分比

%gues          进程在虚拟机占用cpu的百分比

%CPU          进程占用cpu的百分比

CPU             运行当前进程的cpu的编号

Command    当前进程对应的命令

显示所有进程使用cpu的情况:

$ pidstat -u -p ALL

Linux 6.8.0-45-generic (Ubuntu22-VirtualBox)       2024年10月19日   _x86_64_  (2 CPU)

16时17分49秒   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command

16时17分49秒     0         1    0.00    0.00    0.00    0.00    0.00     0  systemd

16时17分49秒     0         2    0.00    0.00    0.00    0.00    0.00     0  kthreadd

16时17分49秒     0         3    0.00    0.00    0.00    0.00    0.00     0  pool_workqueue_release

显示pid为1的进程的CPU的使用情况:

$ pidstat -u -p 1

Linux 6.8.0-45-generic (Ubuntu22-VirtualBox)       2024年10月19日   _x86_64_  (2 CPU)

16时18分07秒   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command

16时18分07秒     0         1    0.00    0.00    0.00    0.00    0.00     1  systemd

显示各个进程的IO使用情况:

$ pidstat -d

Linux 6.8.0-45-generic (Ubuntu22-VirtualBox)       2024年10月19日   _x86_64_  (2 CPU)

16时26分23秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command

16时26分23秒  1000      1606      0.23      0.02      0.02       0  systemd

16时26分23秒  1000      1614      0.00      0.00      0.00       0  pipewire-media-

16时26分23秒  1000      1615      0.00      0.00      0.00       0  pulseaudio

对输出信息中的的字段的解释:

PID               进程id

kB_rd/s        每秒从磁盘读取的KB

kB_wr/s        每秒写入磁盘KB

kB_ccwr/s           任务取消的写入磁盘的KB

COMMAND       当前进程对应的命令

显示每个进程的上下文切换情况:

$ pidstat -w

Linux 6.8.0-45-generic (Ubuntu22-VirtualBox)   2024年10月19日         _x86_64_        (2 CPU)

16时29分11秒   UID       PID   cswch/s nvcswch/s  Command

16时29分11秒     0         1      0.19      0.04  systemd

16时29分11秒     0         2      0.00      0.00  kthreadd

16时29分11秒     0         3      0.00      0.00  pool_workqueue_release

对输出信息中的的字段的解释:

PID               进程id

Cswch/s        每秒主动任务上下文切换数量

Nvcswch/s    每秒被动任务上下文切换数量

Command           当前进程对应的命令

显示线程的统计信息外的其它信息:

$  pidstat -t

Linux 6.8.0-45-generic (Ubuntu22-VirtualBox) 2024年10月19日          _x86_64_     (2 CPU)

16时31分15秒   UID      TGID       TID    %usr %system  %guest   %wait    %CPU   CPU  Command

16时31分15秒     0         1         –    0.00    0.00    0.00    0.00    0.00     0  systemd

16时31分15秒     0         –         1    0.00    0.00    0.00    0.00    0.00     0  |__systemd

16时31分15秒  1000      2722         –    0.04    0.05    0.00    0.00    0.09     0  VBoxClient

16时31分15秒  1000         –      3008    0.00    0.00    0.00    0.00    0.00     1  |__dndHGCM

16时31分15秒  1000         –      3009    0.04    0.04    0.00    0.11    0.09     0  |__dndX11

对输出信息中的的字段的解释:

TGID            主线程的表示

TID              线程id

%usr             进程在用户空间占用cpu的百分比

%system       进程在内核空间占用cpu的百分比

%guest         进程在虚拟机占用cpu的百分比

%CPU          进程占用cpu的百分比

CPU             执行当前进程的cpu的编号

Command    当前进程对应的命令