ip命令管理IP地址、网络设备、路由表和路由规则、网络命名空间

功能说明:在Linux系统中,ip命令用于管理IP地址、网络设备、路由表和路由规则、网络命名空间。

语  法:

ip addr add|del IFADDR dev IFACE | show|flush [dev IFACE] [to PREFIX]

ip route list|flush|add|del|change|append|replace|test ROUTE

ip link set IFACE [up|down] [arp on|off] [multicast on|off]

        [promisc on|off] [mtu NUM] [name NAME] [qlen NUM] [address MAC]

        [master IFACE | nomaster] [netns PID]

ip tunnel add|change|del|show [NAME]

        [mode ipip|gre|sit] [remote ADDR] [local ADDR] [ttl TTL]

ip neigh show|flush [to PREFIX] [dev DEV] [nud STATE]

ip rule [list] | add|del SELECTOR ACTION

参  数:

# 辅助参数

ip -n s1 addr 在网络命名空间中执行 ip addr

ip -c link 彩色显示接口

ip -c addr 彩色显示IP地址

ip -c route 彩色显示路由

ip -brief link 简洁显示接口

ip -brief addr 简洁显示地址

ip -brief -c link 彩色简洁显示接口

# ip addr管理IP地址

ip addr 查看IP地址

ip addr add 192.168.1.1/24 dev eth0 给指定设备添加IP地址

ip addr del 192.168.1.1/24 dev eth0 删除指定设备的地址

ip addr flush dev eth0 删除指定设备的所有IP地址

# ip link管理网络设备

ip link 显示所有网络接口

ip link show dev eth0 显示指定设备的信息

ip link set eth0 up 把 eth0 接口设备开启

ip link set eth0 down 把 eth0 接口设备关闭

ip link set eth0 mtu 1450 设置设备的 MTU

ip link add br0 type bridge 添加一个网桥设备

ip link del br0 删除一个网桥设备

ip link set eth0 master br0 把 eth0 添加到网桥 br0

ip link set eth0 nomaster 从网桥中删除 eth0

ip link add veth0 type veth peer name veth1 添加虚拟以太网设备

ip link set veth0 netns s1 把 veth0 移动到网络命名空间

ip link set veth1 netns s2 把 veth1 移动到网络命名空间

ip link set veth0 netns 1 把设备移动到全局网络命名空间

# ip route管理路由表

ip route 显示主路由表

ip route show table [local|main|default|num] 显示路由表

ip route show table main 显示主路由表

ip route show table 520 显示编号为 520 的路由表

ip route get 8.8.8.8 查询一个地址经过的路由

ip route get 8.8.8.8 mark 666 查询经过的路由(带标记)

ip route add default via 10.8.1.1 dev eth0 添加默认路由

ip route add 10.8.1.0/24 via 10.8.1.1 添加静态路由

ip route add 10.8.1.0/24 dev eth0 添加直连路由

ip route add 10.8.1.0/24 dev eth0 metric 10 添加带有 metric 的直连路由

ip route add 10.8.1.0/24 dev eth0 table 520 添加路由到编号 520 的路由表

ip route add table 520 10.8.1.0/24 dev eth0 另一种写法,突出表名

ip route delete 10.8.1.0/24 via 10.8.1.1 删除静态路由

ip route replace 10.8.1.0/24 dev eth0 替换路由

ip route flush cache 路由表立即生效

ip route flush table 520 清空编号为 520 的路由表

# 显示当前定义了哪些路由表

ip route show table all | grep -Eo ‘table [^ ]+ ‘ | sort | uniq

# ip rule管理路由规则

ip rule 显示路由规则

ip rule add table 520 所有包走一下 520 路由表

ip rule add from 0/0 lookup 520 所有包走一下 520 路由表

ip rule add from 0/0 table 520 同上

ip rule add from 0/0 blackhole 所有包丢弃

ip rule add from 0/0 prohibit 所有包拒绝,通信被管理员禁止

ip rule add from 0/0 unreachable 返回 network unreachable

ip rule del table 520 删除所有包走 520 路由表的规则

ip rule add from 10.8.1.0/24 table 520 来自特定网络的包走 520 路由表

ip rule add to 10.8.2.0/24 table 521 发往某网络的包走 521 路由表

ip rule add fwmark 588 table 520 标记为 588 的包走 520 路由表

ip rule add not fwmark 588 table 51820 没有标记为 588 的包走该路由表

ip rule add from 8.8.3.2/32 tos 10 table 2 来自特定 IP 且 TOS 为 10 的包

ip rule add prio 100 fwmark 1 lookup 100 优先级 100 的规则

# ip netns管理网络命名空间

ip netns 显示网络命名空间

ip netns add s1 创建一个网络命名空间

ip netns del s1 删除一个网络命名空间

ip netns attach NAME PID 改变进程网络命名空间

ip netns exec s1 command 在网络命名空间中执行命令

ip netns exec s1 ip link set lo up 在网络命名空间中设置 lo 设备

ip netns identify 查看当前进程的网络命名空间

ip netns identify PID 查看指定进程的网络命名空间

ip netns pids NAME 查看网络命名空间中的进程

ip -n s1 addr add 192.168.64.1/24 dev veth0 在网络命名空间中添加地址

   例:

1 设置MTU

MTU(Maximum Transmission Unit)是最大传输单元的缩写,表示网络中单个数据包在传输过程中能够承载的最大字节数。简单来说,MTU定义了在网络设备上(如网卡、路由器等)单次能够发送的最大数据量。

为什么MTU很重要?

  • 网络性能:较大的MTU可以提高网络传输效率,减少网络分片的发生。但如果MTU设置过大,可能导致某些网络设备无法处理,从而造成数据包丢失或传输失败。
  • 数据包分片:如果发送的数据包超过了MTU的限制,数据包就需要被分片,分片后每个小的数据包会分别发送到目标设备并重新组装。过多的分片会增加网络开销,降低性能。
  • 兼容性:不同的网络设备和协议可能对MTU有不同的要求,设置不当可能导致网络不兼容或丢包。

你可以使用以下命令来查看当前网络设备eth0的 MTU 设置:

ip link show eth0

设置网络设备 eth0 的 MTU 为 1450 字节:

ip link set eth0 mtu 1450

这意味着 eth0 网络接口上通过的每个数据包不能超过 1450 字节。如果某个应用程序尝试发送更大的数据包,网络协议栈就会将其拆分成多个小包进行发送。

常见网络的MTU值

  • 以太网(Ethernet):默认的MTU值通常是 1500 字节。
  • PPPoE(Point-to-Point Protocol over Ethernet):通常 MTU 为 1492 字节,因为额外的 8 字节用于标头。
  • Wi-Fi:通常与以太网相同,也为 1500 字节,但某些无线网络可能因为协议开销而略低。

参考

https://github.com/skywind3000/awesome-cheatsheets/blob/master/tools/ip.txt

newgrp更改当前用户所属的组

功能说明:更改当前用户所属的组。

语  法:newgrp [群组名称]

补充说明:newgrp指令类似login指令,它是以相同的帐号,使用另一个群组名称,再次登入系统。它的作用是将当前用户的有效组切换为指定的组,这样做会影响文件权限等操作,但它只能在当前登录的用户上下文中运行,不能用于切换其他用户的组。欲使用newgrp指令切换群组,你必须是该群组的用户,否则将无法登入指定的群组。若不指定群组名称,则newgrp指令会登入该用户名称的预设群组。一旦你通过 newgrp 切换了组,你可以通过exit命令退出当前 shell 会话来恢复原有的组。

参  数:

群组名称

    例:

将用户添加到 Docker 组:

$ sudo usermod -aG docker username

你需要将 username 替换为实际的用户名。可以使用以下命令添加当前用户:

$ sudo usermod -aG docker $USER

用户被添加到 docker 组后,需要重新登录或重启系统,才能使更改生效。也可以运行以下命令重新加载用户的组:

$ newgrp docker

jq处理JSON数据

功能说明:jq是一个用于处理JSON数据的命令行工具,可以解析、筛选、格式化JSON数据。与sed、awk工具类似,jq在处理JSON数据方面非常强大。

语  法:

jq [options] <jq filter> [file…]

jq [options] –args <jq filter> [strings…]

jq [options] –jsonargs <jq filter> [JSON_TEXTS…]

补充说明:jq是一个处理 JSON 输入的工具,应用给定的过滤器到其 JSON 文本输入,并将过滤器的结果作为 JSON 输出到标准输出。最简单的过滤器是.符号,它将jq的输入原封不动地复制到输出(除了格式化,注意内部使用 IEEE754 进行数字表示)。有关更高级的过滤器,请参见jq(1)手册页(“man jq”)和/或 https://stedolan.github.io/jq

          项:

-c 压缩输出,去除空白和换行符,以便生成紧凑的 JSON 格式,而非美化格式

-r 以原始格式输出,不加引号,通常用于输出字符串值

-R 读取原始字符串,而非 JSON 文本

-s 将所有输入的 JSON 对象合并为一个数组

-n 使用 `null` 作为唯一输入值。也就是不读取输入,通常与其他表达式结合使用,可以用于生成新的 JSON 对象

-e 根据输出设置退出状态码

-S 对输出的对象按键进行排序

-C 为 JSON 上色。jq默认会为输出的JSON数据上色

-M 单色(不为 JSON 上色)

–tab 使用制表符进行缩进

–arg a v 将变量 $a 设置为值<v>

–argjson a v 将shell变量 $a 设置为 JSON 值 <v>

–slurpfile a f 将shell变量 $a 设置为从 <f> 文件读取的 JSON 文本数组

–rawfile a f 将shell变量 $a 设置为由 <f> 文件的内容组成的字符串

–args 剩余参数是字符串参数,而非文件

–jsonargs 剩余参数是 JSON 参数,而非文件

— 终止参数处理

其中,命名参数也可以作为 $ARGS.named[] 使用,而位置参数可以作为 $ARGS.positional[] 使用。

   数:

file… 一个或多个文件

strings… 一个或多个字符串

JSON_TEXTS… 一个或多个JSON字符串

器:

. 表示当前输入的 JSON 对象,可以用来访问字段

[] 用于访问数组中的元素

| 用于将前一个表达式的输出作为下一个表达式的输入

{} 用于创建新的 JSON 对象

[] | .field 用于遍历数组并提取特定字段

运算符和内建函数:

+,-

*,/,%

>, >=, <=, <

and, or, not

==,!=

in

abs

length

utf8bytelength

has(key)

map(f), map_values(f)

path(path_expression)

del(path_expression)

select(boolean_expression)

add

any

all

bsearch(x)

repeat(exp)

while(cond; update)

indices(s)

index(s), rindex(s)

contains(element)

unique, unique_by(path_exp)

min, max, min_by(path_exp), max_by(path_exp)

flatten, flatten(depth)

字符串相关函数

join(str)

split(str)

implode

explode

rtrimstr(str)

ltrimstr(str)

endswith(str)

startswith(str)

reverse

正则表达式相关函数

test(val), test(regex; flags)

match(val), match(regex; flags)

capture(val), capture(regex; flags)

sub(regex; tostring), sub(regex; tostring; flags)

splits(regex), splits(regex; flags)

split(regex; flags)

scan(regex), scan(regex; flags)

gsub(regex; tostring), gsub(regex; tostring; flags)

数学相关函数

sqrt

range(upto), range(from; upto), range(from; upto; by)

floor

更多参考官方文档https://jqlang.github.io/jq/manual/#builtin-operators-and-functions

流程控制语句:

if A then B else C end

try-catch

break

   例:

1 简单的实例

压缩输出,去除空白和换行符,以便生成紧凑的 JSON 格式:

echo ‘{“name”: “Alice”, “age”: 30}’ | jq -c .

输出:{“name”:”Alice”,”age”:30}

以原始格式输出,不加引号,通常用于输出字符串值:

echo ‘{“name”: “Alice”, “age”: 30}’ | jq -r .name

输出:Alice

将所有输入的 JSON 对象合并为一个数组:

$ echo ‘{“name”: “Alice”, “age”: 30}{“name”: “Bob”, “age”: 25}{“name”: “Charlie”, “age”: 35}’ | jq -s .

输出:

[

  {

    “name”: “Alice”,

    “age”: 30

  },

  {

    “name”: “Bob”,

    “age”: 25

  },

  {

    “name”: “Charlie”,

    “age”: 35

  }

]

将 shell 变量传递给 jq 作为变量

name=”Alice”

echo ‘{}’ | jq –arg name “$name” ‘{name: $name}’

输出:{“name”:”Alice”}

2 过滤器实例

[] 用于访问JSON数组中的元素

echo ‘[{“name”: “Alice”}, {“name”: “Bob”}, {“name”: “Charlie”}]’ | jq ‘.[1]’

输出:

{

  “name”: “Bob”

}

在这个例子中,.[1] 访问数组中的第二个元素(索引从0开始)。

{}用于创建新的JSON对象,可以根据需要定义键值对

jq -n ‘{name: “Alice”, age: 30}’

输出:

{

  “name”: “Alice”,

  “age”: 30

}

这里使用 -n 选项表示不读取输入,而是直接创建一个新的 JSON 对象。

[] | .field用于遍历一个数组并提取每个对象中的特定字段

echo ‘[{“name”: “Alice”}, {“name”: “Bob”}, {“name”: “Charlie”}]’ | jq ‘.[].name’

输出:

“Alice”

“Bob”

“Charlie”

在这个例子中,[].name 遍历数组中的每个对象,提取 name 字段的值。

3 运算符、流程控制语句和内置函数实例

echo ‘[{“name”: “Alice”, “age”: 30}, {“name”: “Bob”, “age”: 25}, {“name”: “Charlie”, “age”: 35}]’ | jq ‘map(if .name==”Alice” then “yes” else “no” end)’

输出:

[

  “yes”,

  “no”,

  “no”

]

4 jq脚本实例

你可以将复杂的 jq 脚本写入一个 .jq 文件,然后在命令行中引用该文件。步骤如下。首先,创建一个名为 script.jq 的文件,并将你的 jq 脚本写入其中:

# script.jq

map(select(.age > 28) | {name: .name, status: (if .age < 35 then “年轻” else “成熟” end)})

然后在命令行中使用 jq 运行这个脚本:

echo ‘[{“name”: “Alice”, “age”: 30}, {“name”: “Bob”, “age”: 25}, {“name”: “Charlie”, “age”: 35}]’ | jq -f script.jq

输出:

[

  {

    “name”: “Alice”,

    “status”: “年轻”

  },

  {

    “name”: “Charlie”,

    “status”: “成熟”

  }

]

也可以把JSON数据放到一个文件中,再运行jq脚本来过滤它,例如:

$ echo ‘[{“name”: “Alice”, “age”: 30}, {“name”: “Bob”, “age”: 25}, {“name”: “Charlie”, “age”: 35}]’>input.json

$ jq -f script.jq input.json

输出:

[

  {

    “name”: “Alice”,

    “status”: “年轻”

  },

  {

    “name”: “Charlie”,

    “status”: “成熟”

  }

]

echo用于在终端打印字符串或变量的值

功能说明:echo用于在终端打印字符串或变量的值

语  法:echo [options] [args]

补充说明:echo非常适合输出文本信息、打印变量、生成格式化输出等

   项:

-e           启用转义字符,如换行 \n、制表符 \t 等。常用转义字符如下:

\n    换行

\t     水平制表符(Tab)

\\     反斜杠

\”    双引号

\a    警报(蜂鸣)

\b    退格

\v    垂直制表符

-n           禁止自动换行。默认情况下,echo 命令会在输出末尾自动添加换行符,使用 -n 可以取消自动换行

   数:

args       要输出的一个或多个字符串或变量

   例:

1 简单输出文本

$ echo “Hello, World!”

Hello, World!

2 输出变量(包括环境变量)的值

可以使用 echo 打印变量的值,在变量名前加 $ 符号:

$ name=”Alice”

$ echo “Hello, $name”

Hello, Alice

输出环境变量的值:

$ echo $PATH

/home/john/.config/composer/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

$ echo $HOME

/home/john

$ echo $USER

john

3 使用变量或命令替换

echo 可以和命令替换 $(command) 一起使用,将命令的输出结果插入到输出中:

$ echo “Today is $(date)”

Today is Sun Oct 25 10:20:22 AM

4 输出多行文本

使用 -e 参数可以使 \n 等转义字符生效,从而输出多行文本:

$ echo -e “Line 1\nLine 2\nLine 3”

Line 1

Line 2

Line 3

5 禁止自动换行

echo 默认在输出末尾添加换行符,可以使用 -n 禁止换行:

$ echo -n “Hello, World!”

# 输出:Hello, World!(无换行)

6使用转义字符

使用 -e 参数可以启用多种转义字符,如 \t (制表符) 和 \n (换行符) 等:

$ echo -e “Column1\tColumn2\nData1\tData2”

Column1   Column2

Data1     Data2

7 重定向输出到文件

可以将 echo 的输出重定向到文件中,> 会覆盖文件内容,而 >> 会追加内容:

$ echo “Hello, World!” > output.txt    # 覆盖写入到文件

$ echo “Another Line” >> output.txt     # 追加写入到文件

8 输出包含特殊字符的字符串

如果字符串中包含特殊字符(如 $, “, \),可以用单引号或在特殊字符前加 \ 进行转义:

$ echo “This is a dollar sign: \$ and a quote: \” “

This is a dollar sign: $ and a quote: “

cifsiostat用于监控CIFS文件系统的I/O性能

功能说明:cifsiostat用于监控CIFS文件系统的I/O性能

语  法:cifsiostat [ 选项 ] [ <时间间隔> [ <次数> ] ] [挂载点]

补充说明:cifsiostat 是一个用于监控 CIFS (Common Internet File System) 文件系统的 I/O 性能的工具,类似于 iostat。它是 sysstat 软件包的一部分,专门用来显示 CIFS 客户端挂载点的 I/O 统计信息。CIFS 是一种基于 SMB(Server Message Block)的网络文件共享协议,主要用于跨网络共享文件和打印机,通常在 Windows 环境中使用,但也支持 Linux 和其他操作系统。

   项:

-k           显示I/O活动统计信息以千字节每秒为单位,而不使用块每秒

-m          显示I/O活动统计信息以兆字节每秒为单位

参  数:

时间间隔            每隔几秒输出一次统计信息

次数                    总共输出几次统计信息

挂载点                只显示特定挂载点的I/O活动统计信息

   例:

显示当前所有 CIFS 挂载点的 I/O 活动统计信息:

cifsiostat

每隔 5 秒输出一次统计信息,总共 10 次:

cifsiostat 5 10

只显示特定挂载点的统计信息:

cifsiostat /mnt/cifs

查看两个挂载点的 I/O 统计信息:

cifsiostat /mnt/shared /mnt/backup

cifsiostat 输出的内容类似于 iostat,包括读写操作次数、读写的数据量、平均 I/O 大小、I/O 等待时间等。示例输出如下:

Filesystem: /mnt/cifs

rMB/s    wMB/s    rIO/s    wIO/s   rSizeKB   wSizeKB

0.000    0.012    1.00     10.00   0.00      4.00

字段解释:

rMB/s           每秒读取的 MB

wMB/s         每秒写入的 MB

rIO/s             每秒读取的 I/O 请求次数

wIO/s           每秒写入的 I/O 请求次数

rSizeKB       平均每次读取的大小(KB)

wSizeKB      平均每次写入的大小(KB)

nfsiostat用于显示NFS(网络文件系统)客户端每个挂载点的I/O统计信息

功能说明:nfsiostat是一个用于显示NFS客户端每个挂载点I/O统计信息的工具,类似于iostat。

语  法:nfsiostat [ interval [ count ] ] [ options ] [ <mount point> ]

补充说明:Ubuntu系统可以通过以下命令安装nfsiostat:

sudo apt install nfs-common

   项:

-a, –attr        显示与属性缓存(attribute cache)相关的统计信息

-d, –dir         显示与目录操作(directory operations)相关的统计信息

-p, –page     显示与页面缓存(page cache)相关的统计信息

-s, –sort        按每秒操作数(ops/second)对 NFS 挂载点进行排序,用于识别哪些挂载点 I/O 活动最多

-l LIST, –list=LIST   只打印前 LIST 个挂载点的统计信息。这个选项适用于只查看几个主要挂载点的统计信息。

参  数:

interval                设置每次报告的时间间隔(以秒为单位)。命令会持续输出,直到手动终止或者报告了count次

count                   总共报告count次统计信息,然后终止命令

mount point         网络文件系统(NFS)的挂载点。你可以指定一个或多个 NFS 挂载点来查看这些挂载点的特定统计信息,而不是默认地统计所有的NFS挂载点。

   例:

每 5 秒输出一次统计信息,持续 10 次:

nfsiostat 5 10

哪些挂载点 I/O 活动最多:

nfsiostat -s

打印前 2 个挂载点的统计信息:

nfsiostat -l 2

查看 /mnt/nfs 挂载点的统计信息:

nfsiostat /mnt/nfs

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    当前进程对应的命令

iostat用于统计系统I/O状态信息

功能说明:用于统计系统I/O状态信息,常用于分析磁盘性能。

语  法:iostat [options]

补充说明:也能显示CPU使用情况。

   项:

-c    仅显示CPU使用情况

-d    仅显示设备利用率

-k    显示状态以千字节每秒为单位,而不使用块每秒

-m   显示状态以兆字节每秒为单位

-p    仅显示块设备和所有被使用的其他分区的状态

-t     显示每个报告产生时的时间

-V   显示版号并退出

-x    显示扩展状态

参  数:

   例:

显示当前时刻所有设备使用情况:

$ iostat -x

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

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.10    0.02    0.27    0.01    0.00   99.60

Device            r/s     rkB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wkB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dkB/s   drqm/s  %drqm d_await dareq-sz     f/s f_await  aqu-sz  %util

loop0            0.00      0.00     0.00   0.00    0.00     1.21    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

loop1            0.00      0.00     0.00   0.00    0.07     2.88    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

loop10           0.02      0.05     0.00   0.00    0.02     3.20    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

loop11           0.00      0.00     0.00   0.00    0.29     4.80    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

loop12           0.00      0.00     0.00   0.00    0.24     7.20    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

loop13           0.00      0.01     0.00   0.00    0.27    13.64    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

loop14           0.00      0.00     0.00   0.00    0.46    12.07    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

loop15           0.00      0.16     0.00   0.00    0.04    50.89    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

loop16           0.00      0.00     0.00   0.00    0.32    18.27    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

loop17           0.00      0.00     0.00   0.00    0.06     8.36    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

loop2            0.00      0.00     0.00   0.00    0.05     2.88    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

loop3            0.00      0.00     0.00   0.00    0.06     4.50    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

loop4            0.00      0.03     0.00   0.00    0.20    13.73    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

loop5            0.00      0.00     0.00   0.00    0.23    14.72    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

loop6            0.00      0.23     0.00   0.00    0.55    52.20    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

loop7            0.00      0.01     0.00   0.00    0.03     3.79    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

loop8            0.00      0.01     0.00   0.00    0.05     3.89    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

loop9            0.02      0.36     0.00   0.00    0.16    19.87    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00

sda              0.30     10.96     0.10  24.42    0.35    36.60    0.51     23.23     0.64  55.59    0.41    45.13    0.00      0.00     0.00   0.00    0.00     0.00    0.13    0.72    0.00   0.02

输出结果中的字段解释:

Device   设备名称

rrqm/s    每秒需要读取需求的数量

wrqm/s  每秒需要写入需求的数量

r/s          每秒实际读取需求的数量

w/s         每秒实际写入需求的数量

rsec/s     每秒读取区段的数量

wsec/s   每秒写入区段的数量

rkB/s     每秒实际读取的大小,单位为KB

wkB/s    每秒实际写入的大小,单位为KB

avgrq-sz       需求的平均大小区段

avgqu-sz       需求的平均队列长度

await     等待I/O平均的时间(milliseconds)

svctm    I/O需求完成的平均时间

%util     被I/O需求消耗的CPU百分比

显示当前时刻设备sda使用情况:

$ iostat -x /dev/sda

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

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.10    0.02    0.27    0.01    0.00   99.60

Device            r/s     rkB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wkB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dkB/s   drqm/s  %drqm d_await dareq-sz     f/s f_await  aqu-sz  %util

sda              0.30     10.95     0.10  24.42    0.35    36.60    0.51     23.21     0.64  55.57    0.41    45.09    0.00      0.00     0.00   0.00    0.00     0.00    0.13    0.72    0.00   0.02

可以使用-d选项不显示cpu使用情况,只显示设备的使用情况:

$ iostat -xd /dev/sda

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

Device            r/s     rkB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wkB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dkB/s   drqm/s  %drqm d_await dareq-sz     f/s f_await  aqu-sz  %util

sda              0.30     10.95     0.10  24.42    0.35    36.60    0.51     23.21     0.64  55.57    0.41    45.09    0.00      0.00     0.00   0.00    0.00     0.00    0.13    0.72    0.00   0.02

显示系统整体I/O状态信息:

$ iostat

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

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.10    0.02    0.27    0.01    0.00   99.60

Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd

loop0             0.00         0.00         0.00         0.00         17          0          0

loop1             0.00         0.00         0.00         0.00       1000          0          0

loop10            0.02         0.05         0.00         0.00      22978          0          0

loop11            0.00         0.00         0.00         0.00        456          0          0

loop12            0.00         0.00         0.00         0.00        367          0          0

loop13            0.00         0.01         0.00         0.00       4052          0          0

loop14            0.00         0.00         0.00         0.00        495          0          0

loop15            0.00         0.16         0.00         0.00      68346          0          0

loop16            0.00         0.00         0.00         0.00       1681          0          0

loop17            0.00         0.00         0.00         0.00        301          0          0

loop2             0.00         0.00         0.00         0.00        991          0          0

loop3             0.00         0.00         0.00         0.00       1786          0          0

loop4             0.00         0.03         0.00         0.00      15142          0          0

loop5             0.00         0.00         0.00         0.00       1148          0          0

loop6             0.00         0.23         0.00         0.00     102514          0          0

loop7             0.00         0.01         0.00         0.00       2567          0          0

loop8             0.00         0.01         0.00         0.00       2434          0          0

loop9             0.02         0.36         0.00         0.00     155861          0          0

sda               0.81        10.95        23.21         0.00    4791860   10157237          0

只显示CPU的I/O状态:

$ iostat -c

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

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.10    0.02    0.27    0.01    0.00   99.60

以兆字节每秒为单位显示:

$ iostat -m

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

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.10    0.02    0.27    0.01    0.00   99.60

Device             tps    MB_read/s    MB_wrtn/s    MB_dscd/s    MB_read    MB_wrtn    MB_dscd

loop0             0.00         0.00         0.00         0.00          0          0          0

loop1             0.00         0.00         0.00         0.00          0          0          0

loop10            0.02         0.00         0.00         0.00         22          0          0

loop11            0.00         0.00         0.00         0.00          0          0          0

loop12            0.00         0.00         0.00         0.00          0          0          0

loop13            0.00         0.00         0.00         0.00          3          0          0

loop14            0.00         0.00         0.00         0.00          0          0          0

loop15            0.00         0.00         0.00         0.00         66          0          0

loop16            0.00         0.00         0.00         0.00          1          0          0

loop17            0.00         0.00         0.00         0.00          0          0          0

loop2             0.00         0.00         0.00         0.00          0          0          0

loop3             0.00         0.00         0.00         0.00          1          0          0

loop4             0.00         0.00         0.00         0.00         14          0          0

loop5             0.00         0.00         0.00         0.00          1          0          0

loop6             0.00         0.00         0.00         0.00        100          0          0

loop7             0.00         0.00         0.00         0.00          2          0          0

loop8             0.00         0.00         0.00         0.00          2          0          0

loop9             0.02         0.00         0.00         0.00        152          0          0

sda               0.81         0.01         0.02         0.00       4679       9920          0

Linux工具软件sar (System Activity Report)收集和报告系统活动信息

sar(System Activity Report)是 sysstat 工具包中的核心工具之一,用于收集和报告系统活动信息,包括CPU利用率、内存使用、I/O活动、网络流量等。可以从历史数据中生成报告,帮助分析系统性能随时间的变化。

常用选项

(1) CPU 相关选项

-u:显示 CPU 利用率。

示例:

sar -u 1 3

每 1 秒采样一次,连续采样 3 次,报告 CPU 的用户态、系统态、空闲时间等利用率。

-P:指定处理器,显示单个或所有 CPU 核心的利用率。

示例:

sar -P ALL 1 5

每 1 秒采样一次,连续采样 5 次,显示每个 CPU 核心的利用率。

(2) 内存相关选项

-r:显示内存和交换分区的使用情况。

示例:

sar -r 1 3

每 1 秒采样一次,连续采样 3 次,报告内存的使用情况(包括空闲内存、已用内存、交换空间的使用情况等)。

(3) 网络相关选项

-n:显示网络活动信息。

-n DEV:显示每个网络接口的传输情况(发送/接收的数据包和字节数)。

示例:

sar -n DEV 1 3

每 1 秒采样一次,连续采样 3 次,报告各个网络接口的流量信息。

-n TCP:显示 TCP 连接的活动状态。

示例:

sar -n TCP 1 3

每 1 秒采样一次,连续采样 3 次,报告 TCP 连接的状态,例如主动连接、被动连接、错误等。

(4) I/O 相关选项

-b:显示块设备的 I/O 传输统计信息。

示例:

sar -b 1 3

每 1 秒采样一次,连续采样 3 次,报告块设备的传输率、读写次数等信息。

-d:显示具体块设备的 I/O 活动。

示例:

sar -d 1 3

每 1 秒采样一次,连续采样 3 次,报告每个块设备的 I/O 活动情况(包括读写次数、等待时间等)。

(5) 上下文切换和中断

-w:显示系统的上下文切换和进程创建的统计信息。

示例:

sar -w 1 3

每 1 秒采样一次,连续采样 3 次,报告每秒的上下文切换和进程创建情况。

-I:显示中断统计信息。

示例:

sar -I SUM 1 3

每 1 秒采样一次,连续采样 3 次,显示所有中断的总和。

(6) 文件系统相关选项

-v:显示文件句柄的使用情况。

示例:

sar -v 1 3

每 1 秒采样一次,连续采样 3 次,报告文件句柄、inode 和其他资源的使用情况。

(7) 历史数据查看

-f:从保存的日志文件中读取历史数据。

示例:

sar -u -f /var/log/sysstat/sa01

从日志文件 /var/log/sysstat/sa01 中读取 CPU 使用率数据,显示历史的 CPU 利用率。

常用场景

(1) 监控 CPU 使用情况

当系统变得响应缓慢或 CPU 负载过高时,你可以使用 sar -u 或 sar -P ALL 来监控 CPU 的使用情况,以确定 CPU 是否成为瓶颈,是否有特定的 CPU 核心超载。

sar -u 1 5

sar -P ALL 1 5

(2) 分析内存使用

如果系统内存耗尽或交换空间使用过高,导致性能下降,可以使用 sar -r 来检查物理内存和交换空间的使用情况,帮助分析是否需要增加内存或调整交换空间的大小。

sar -r 1 5

(3) 网络性能监控

在分析网络问题时,可以使用 sar -n DEV 来查看各个网络接口的数据包收发情况,帮助判断网络负载,排查网络瓶颈和接口故障。

sar -n DEV 1 5

(4) 磁盘 I/O 性能分析

如果磁盘 I/O 性能下降,可能影响系统整体响应时间。可以使用 sar -b 和 sar -d 查看系统的磁盘 I/O 活动,判断是否是磁盘瓶颈或特定设备读写过多。

sar -b 1 5

sar -d 1 5

(5) 上下文切换和中断监控

如果系统中断频繁或上下文切换过多,可能会影响系统性能。可以使用 sar -w 和 sar -I 监控上下文切换和中断次数,帮助确定这些问题是否是性能瓶颈的原因。

sar -w 1 5

sar -I SUM 1 5

(6) 历史数据分析

sar 可以保留系统性能的历史数据,方便管理员在问题出现后回顾过去的系统状态。通过 sar -f 可以读取过去的数据文件,分析系统在某一时段的性能情况。例如,分析1号的 CPU 使用历史记录: sar -u -f /var/log/sysstat/sa01

mpstat显示各个可用CPU的状态统计

功能说明:mpstat显示各个可用CPU的状态统计

语  法:mpstat [ options ]

补充说明:mpstat(Multi-Processor Statistics)工具软件用于显示各个可用CPU的状态统计,是一个实时监控工具,与vmstat类似,但只能监控CPU的整体性能状态。Ubuntu系统可以通过以下命令安装mpstat:

sudo apt install sysstat

CentOS系统可以通过以下命令安装mpstat:

sudo yum install sysstat

   项:

-P           指定CPU编号或ALL值表示统计所有CPU的整体性能信息

参  数:

   例:

不加任何选项直接运行mpstat统计的是所有CPU的整体性能信息:

$ mpstat

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

13时48分03秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle

13时48分03秒  all    0.11    0.02    0.10    0.01    0.00    0.17    0.00    0.00    0.00   99.60

使用-P ALL选项既能统计所有CPU的整体性能信息,又能单独统计每一个CPU的性能信息:

$ mpstat -P ALL

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

13时59分40秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle

13时59分40秒  all    0.11    0.02    0.10    0.01    0.00    0.17    0.00    0.00    0.00   99.60

13时59分40秒    0    0.11    0.02    0.10    0.01    0.00    0.31    0.00    0.00    0.00   99.45

13时59分40秒    1    0.10    0.02    0.10    0.01    0.00    0.03    0.00    0.00    0.00   99.75

使用-P n选项指定CPU编号n单独统计某一个CPU的性能信息,其中n从0开始:

$ mpstat -P 0

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

14时18分14秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle

14时18分14秒    0    0.11    0.02    0.10    0.01    0.00    0.31    0.00    0.00    0.00   99.45

$ mpstat -P 1

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

14时18分17秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle

14时18分17秒    1    0.10    0.02    0.10    0.01    0.00    0.03    0.00    0.00    0.00   99.75

统计字段说明:

%user    在internal时间段里,用户态的CPU时间(%),不包含nice值为负的进程  (usr/total)*100

%nice    在internal时间段里,nice值为负进程的CPU时间(%)(nice/total)*100

%sys      在internal时间段里,内核时间(%)(system/total)*100

%iowait 在internal时间段里,硬盘IO等待时间(%) (iowait/total)*100
%irq      在internal时间段里,硬中断时间(%)(irq/total)*100
%soft     在internal时间段里,软中断时间(%)(softirq/total)*100
%idle     在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) (idle/total)*100