Linux 进阶学习 - 系统性能优化和常用性能检查命令使用说明
一、cpu(进程)
1、top:查看系统整体的内存和cpu使用情况,以及各个进程资源使用情况
[root@k8s-master ~]# top
top - 14:42:31 up 480 days, 5:55, 1 user, load average: 0.01, 0.03, 0.05
Tasks: 114 total, 2 running, 112 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.3 sy, 0.0 ni, 99.3 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3880360 total, 170376 free, 458004 used, 3251980 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 3133412 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21376 root 20 0 1120540 158948 13860 S 1.0 4.1 1337:33 YDService
1331 etcd 20 0 11.0g 60020 844 S 0.3 1.5 2857:06 etcd
26392 root 20 0 673632 12528 1120 S 0.3 0.3 66:11.97 docker-containe
30311 root 20 0 1091936 10688 744 S 0.3 0.3 12:51.73 sh
1 root 20 0 48288 7840 1720 S 0.0 0.2 274:27.62 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:17.87 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 97:12.14 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 99:28.45 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 R 0.0 0.0 338:39.80 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 2:08.07 watchdog/0
12 root rt 0 0 0 0 S 0.0 0.0 1:46.56 watchdog/1
输入top,再输入1,可查看每个cpu的使用情况
[root@k8s-master ~]# top
top - 15:13:14 up 480 days, 6:26, 1 user, load average: 0.00, 0.02, 0.05
Tasks: 112 total, 1 running, 111 sleeping, 0 stopped, 0 zombie
%Cpu0 : 1.0 us, 1.0 sy, 0.0 ni, 98.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.7 us, 0.3 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3880360 total, 169700 free, 456684 used, 3253976 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 3134732 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8360 root 20 0 680204 14540 2292 S 1.3 0.4 137:03.43 barad_agent
21376 root 20 0 1120540 157040 13860 S 0.7 4.0 1337:56 YDService
1331 etcd 20 0 11.0g 60244 844 S 0.3 1.6 2857:12 etcd
23539 root 20 0 161892 2192 1552 R 0.3 0.1 0:00.07 top
26386 root 20 0 1126056 35352 9664 S 0.3 0.9 136:22.46 dockerd-current
1 root 20 0 48288 7840 1720 S 0.0 0.2 274:28.36 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:17.87 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 97:12.17 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 99:28.49 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 338:40.14 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
2、ps -ef:查看每个进程的资源使用情况
[root@k8s-master ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 2021 ? 04:34:27 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 2021 ? 00:00:17 [kthreadd]
root 4 2 0 2021 ? 00:00:00 [kworker/0:0H]
root 6 2 0 2021 ? 01:37:12 [ksoftirqd/0]
root 7 2 0 2021 ? 01:39:28 [migration/0]
root 8 2 0 2021 ? 00:00:00 [rcu_bh]
root 9 2 0 2021 ? 05:38:39 [rcu_sched]
root 10 2 0 2021 ? 00:00:00 [lru-add-drain]
root 11 2 0 2021 ? 00:02:08 [watchdog/0]
root 12 2 0 2021 ? 00:01:46 [watchdog/1]
root 13 2 0 2021 ? 01:38:56 [migration/1]
root 14 2 0 2021 ? 01:31:22 [ksoftirqd/1]
root 16 2 0 2021 ? 00:00:00 [kworker/1:0H]
3、ps -aux:查看每个进程的详细资源使用情况
[root@k8s-master ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 48288 7840 ? Ss 2021 274:27 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 2021 0:17 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 2021 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 2021 97:12 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 2021 99:28 [migration/0]
root 8 0.0 0.0 0 0 ? S 2021 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 2021 338:39 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< 2021 0:00 [lru-add-drain]
root 11 0.0 0.0 0 0 ? S 2021 2:08 [watchdog/0]
root 12 0.0 0.0 0 0 ? S 2021 1:46 [watchdog/1]
root 13 0.0 0.0 0 0 ? S 2021 98:56 [migration/1]
root 14 0.0 0.0 0 0 ? S 2021 91:22 [ksoftirqd/1]
root 16 0.0 0.0 0 0 ? S< 2021 0:00 [kworker/1:0H]
root 18 0.0 0.0 0 0 ? S 2021 0:00 [kdevtmpfs]
4、pidstat 1 5 :每隔1秒输出1组数据,共输出5组数据
[root@k8s-master ~]# pidstat 1 5
Linux 3.10.0-1062.12.1.el7.x86_64 (k8s-master) 05/11/2022 _x86_64_ (2 CPU)
03:14:57 PM UID PID %usr %system %guest %CPU CPU Command
03:14:58 PM 0 21376 0.00 0.99 0.00 0.99 1 YDService
03:14:58 PM UID PID %usr %system %guest %CPU CPU Command
03:14:59 PM 0 25773 0.00 1.00 0.00 1.00 1 pidstat
03:14:59 PM 0 26386 0.00 1.00 0.00 1.00 0 dockerd-current
03:14:59 PM UID PID %usr %system %guest %CPU CPU Command
03:15:00 PM 993 1331 1.00 0.00 0.00 1.00 0 etcd
03:15:00 PM 0 21376 0.00 1.00 0.00 1.00 1 YDService
03:15:00 PM UID PID %usr %system %guest %CPU CPU Command
03:15:01 PM 0 21376 0.00 1.00 0.00 1.00 1 YDService
03:15:01 PM 0 25773 0.00 1.00 0.00 1.00 1 pidstat
03:15:01 PM UID PID %usr %system %guest %CPU CPU Command
03:15:02 PM 0 1 0.00 2.00 0.00 2.00 1 systemd
03:15:02 PM 0 9 0.00 1.00 0.00 1.00 1 rcu_sched
03:15:02 PM 0 13 0.00 1.00 0.00 1.00 1 migration/1
03:15:02 PM 81 778 2.00 0.00 0.00 2.00 1 dbus-daemon
03:15:02 PM 0 13711 0.00 1.00 0.00 1.00 1 systemd-journal
03:15:02 PM 0 21376 0.00 7.00 0.00 7.00 1 YDService
03:15:02 PM 0 25773 0.00 1.00 0.00 1.00 1 pidstat
03:15:02 PM 0 26386 1.00 0.00 0.00 1.00 0 dockerd-current
Average: UID PID %usr %system %guest %CPU CPU Command
Average: 0 1 0.00 0.40 0.00 0.40 - systemd
Average: 0 9 0.00 0.20 0.00 0.20 - rcu_sched
Average: 0 13 0.00 0.20 0.00 0.20 - migration/1
Average: 81 778 0.40 0.00 0.00 0.40 - dbus-daemon
Average: 993 1331 0.20 0.00 0.00 0.20 - etcd
Average: 0 13711 0.00 0.20 0.00 0.20 - systemd-journal
Average: 0 21376 0.00 2.00 0.00 2.00 - YDService
Average: 0 25773 0.00 0.60 0.00 0.60 - pidstat
Average: 0 26386 0.20 0.20 0.00 0.40 - dockerd-current
用户态 CPU 使用率 (%usr);
内核态 CPU 使用率(%system);
运行虚拟机 CPU 使用率(%guest);
总的 CPU 使用率(%CPU)。
5、/proc是虚拟文件系统,Linux通过/proc向用户空间提供了系统内部状态的信息。其中,/proc/stat提供了系统的CPU和任务统计信息。
[root@k8s-master ~]# cat /proc/stat | grep ^cpu
cpu 344328477 204196 441284856 6991127129 23228567 0 1901439 0 0 0
cpu0 172236235 102245 220655561 3495037978 11581866 0 960380 0 0 0
cpu1 172092241 101951 220629295 3496089151 11646701 0 941058 0 0 0
user(通常缩写为 us),代表用户态 CPU 时间。注意,它不包括下面的 nice 时间,但包括了 guest 时间。
nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低。
system(通常缩写为 sys),代表内核态 CPU 时间。
idle(通常缩写为 id),代表空闲时间。注意,它不包括等待 I/O 的时间(iowait)。
iowait(通常缩写为 wa),代表等待 I/O 的 CPU 时间。
irq(通常缩写为 hi),代表处理硬中断的 CPU 时间。
softirq(通常缩写为 si),代表处理软中断的 CPU 时间。
steal(通常缩写为 st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间。
guest(通常缩写为 guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的 CPU 时间。
guest_nice(通常缩写为 gnice),代表以低优先级运行虚拟机的时间。
6、perf
perf top :查看系统CPU的使用情况
perf top -f 2233 :查看2233进程CPU的使用情况
二、平均负载
1、top/uptime: 查看平均负载
[root@k8s-master ~]# uptime
14:54:05 up 480 days, 6:07, 1 user, load average: 0.02, 0.08, 0.07
2、grep 'model name' /proc/cpuinfo | wc -l :查看cpu个数
[root@k8s-master ~]# grep 'model name' /proc/cpuinfo | wc -l
2
3、一般情况下,平均负载超出CPU数量70%的时候,就需要排查负载过高的原因了。具体是根据监控结果进行判断。
三、cpu上下文切换
1、vmstat:查看上下文切换
[root@k8s-master ~]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 171128 276528 2976316 0 0 482 46 0 0 4 6 90 0 0
2 0 0 168804 276528 2976316 0 0 0 4 1658 3125 5 8 88 0 0
0 0 0 169760 276528 2976348 0 0 0 2940 3950 7260 12 14 74 0 0
1 0 0 164632 276528 2976920 0 0 0 132 1409 2495 9 2 89 0 0
0 0 0 171024 276528 2976324 0 0 0 0 870 1683 0 1 99 0 0
cs(context switch)是每秒上下文切换的次数。
in(interrupt)则是每秒中断的次数。
r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数。
b(Blocked)则是处于不可中断睡眠状态的进程数。
2、pidstat :查看上下文切换
[root@k8s-master ~]# pidstat -w 5 1
Linux 3.10.0-1062.12.1.el7.x86_64 (k8s-master) 05/11/2022 _x86_64_ (2 CPU)
02:57:30 PM UID PID cswch/s nvcswch/s Command
02:57:35 PM 0 1 1.60 0.00 systemd
02:57:35 PM 0 7 0.40 0.00 migration/0
02:57:35 PM 0 9 23.80 0.00 rcu_sched
02:57:35 PM 0 11 0.40 0.00 watchdog/0
02:57:35 PM 0 12 0.40 0.00 watchdog/1
02:57:35 PM 0 13 0.60 0.00 migration/1
02:57:35 PM 0 37 0.20 0.00 khugepaged
02:57:35 PM 0 330 0.20 0.00 kworker/0:1H
02:57:35 PM 0 353 0.80 0.00 kworker/1:1H
02:57:35 PM 0 357 0.60 0.00 jbd2/vda1-8
02:57:35 PM 993 1331 19.20 0.00 etcd
Average: UID PID cswch/s nvcswch/s Command
Average: 0 1 1.60 0.00 systemd
Average: 0 7 0.40 0.00 migration/0
Average: 0 9 23.80 0.00 rcu_sched
Average: 0 11 0.40 0.00 watchdog/0
Average: 0 12 0.40 0.00 watchdog/1
Average: 0 13 0.60 0.00 migration/1
Average: 0 37 0.20 0.00 khugepaged
Average: 0 330 0.20 0.00 kworker/0:1H
Average: 0 353 0.80 0.00 kworker/1:1H
Average: 0 357 0.60 0.00 jbd2/vda1-8
Average: 993 1331 19.20 0.00 etcd
一个是 cswch ,表示每秒自愿上下文切换(voluntary context switches)的次数,另一个则是 nvcswch ,表示每秒非自愿上下文切换(non voluntary context switches)的次数。
所谓自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
而非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。
四、内存
1、free:不加参数
[root@k8s-master ~]# free
total used free shared buff/cache available
Mem: 3880360 458048 194128 1764 3228184 3133360
Swap: 0 0 0
free -h:以合适的单位显示
free -m:以单位MB显示
free -k:以单位KB显示
total是总内存的大小。
used是已使用内存的大小,包含了共享内存。
free是未使用内存的大小。
shared是共享内存的大小。
buff/cache是缓存和缓存区的大小。
available是新进程可用内存的大小。available不仅包含未使用内存,还包含了可回收的缓存,所以一般会比使用内存更大。不过,并不是所有缓存都可以回收,因为有些缓存可能正在使用中。
2、top
[root@k8s-master ~]# top
top - 15:13:14 up 480 days, 6:26, 1 user, load average: 0.00, 0.02, 0.05
Tasks: 112 total, 1 running, 111 sleeping, 0 stopped, 0 zombie
%Cpu0 : 1.0 us, 1.0 sy, 0.0 ni, 98.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.7 us, 0.3 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3880360 total, 169700 free, 456684 used, 3253976 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 3134732 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8360 root 20 0 680204 14540 2292 S 1.3 0.4 137:03.43 barad_agent
21376 root 20 0 1120540 157040 13860 S 0.7 4.0 1337:56 YDService
1331 etcd 20 0 11.0g 60244 844 S 0.3 1.6 2857:12 etcd
23539 root 20 0 161892 2192 1552 R 0.3 0.1 0:00.07 top
26386 root 20 0 1126056 35352 9664 S 0.3 0.9 136:22.46 dockerd-current
1 root 20 0 48288 7840 1720 S 0.0 0.2 274:28.36 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:17.87 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 97:12.17 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 99:28.49 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 338:40.14 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
VIRT 是进程虚拟内存的大小,只要是进程申请过的内存,即便还没有真正分配物理内存,也会计算在内。
RES 是常驻内存的大小,也就是进程实际使用的物理内存大小,但不包括 Swap 和共享内存。
SHR 是共享内存的大小,比如与其他进程共同使用的共享内存、加载的动态链接库以及程序的代码段等。
%MEM 是进程使用物理内存占系统总内存的百分比。
3、vmstat
[root@k8s-master ~]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 171128 276528 2976316 0 0 482 46 0 0 4 6 90 0 0
2 0 0 168804 276528 2976316 0 0 0 4 1658 3125 5 8 88 0 0
0 0 0 169760 276528 2976348 0 0 0 2940 3950 7260 12 14 74 0 0
1 0 0 164632 276528 2976920 0 0 0 132 1409 2495 9 2 89 0 0
0 0 0 171024 276528 2976324 0 0 0 0 870 1683 0 1 99 0 0
free是未使用内存的大小。
buff是对磁盘数据缓存的大小。
cache是对文件数据缓存的大小。
4、htop
5、总结
首先使用free,查看系统整体的内存使用情况。
其次使用top,查看使用最高内存的进程。
再次使用vmstat 或者pidstat,查看一段时间的内存使用趋势,从而判断出内存问题的类型。
最后进行详细分析,比如内存分配分析、缓存 / 缓冲区分析、具体进程的内存使用分析等。
五、磁盘
1、iostat:查看磁盘io
[root@k8s-master ~]# iostat -d -x 1
Linux 3.10.0-1062.12.1.el7.x86_64 (k8s-master) 2022年04月17日 _x86_64_ (2 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.05 6.82 8.56 8.09 1006.02 87.39 131.35 0.10 0.95 10.34 4.49 0.50 0.83
scd0 0.00 0.00 0.00 0.00 0.00 0.00 7.14 0.00 0.48 0.48 0.00 0.48 0.00
%util ,就是我们前面提到的磁盘 I/O 使用率;
r/s+ w/s ,就是 IOPS;
rkB/s+wkB/s ,就是吞吐量;
r_await+w_await ,就是响应时间。在观测指标时,需要结合请求的大小( rareq-sz 和 wareq-sz)一起分析。
2、pidstat :查看进程io
[root@k8s-master ~]# pidstat -d 1
Linux 3.10.0-1062.12.1.el7.x86_64 (k8s-master) 2022年04月17日 _x86_64_ (2 CPU)
13时02分18秒 UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
13时02分19秒 0 8360 0.00 3.96 0.00 barad_agent
用户 ID(UID)和进程 ID(PID) 。
每秒读取的数据大小(kB_rd/s) ,单位是 KB。
每秒发出的写请求数据大小(kB_wr/s) ,单位是 KB。
每秒取消的写请求数据大小(kB_ccwr/s) ,单位是 KB。
3、iotop:查看进程io
[root@k8s-master ~]# iotop
Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd -~rialize 22
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
9643 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % docker-co~group=true
4 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:0H]
6 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
前两行分别表示,进程的磁盘读写大小总数和磁盘真实的读写大小总数。因为缓存、缓冲区、I/O 合并等因素的影响,它们可能并不相等。
剩下的部分,则是从各个角度来分别表示进程的 I/O 情况,包括线程 ID、I/O 优先级、每秒读磁盘的大小、每秒写磁盘的大小、换入和等待 I/O 的时钟百分比等。
六、网络
1、netstat 查看网络情况
[root@k8s-master ~]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 9346/sshd: root@pts
tcp 0 0 127.0.0.1:2379 0.0.0.0:* LISTEN 1331/etcd
tcp 0 0 127.0.0.1:2380 0.0.0.0:* LISTEN 1331/etcd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1544/sshd
-l表示只显示监听套接字。
-t表示只显示TCP套接字。
-n表示显示数字地址和端口(而不是名字)。
-p表示显示进程信息。
2、ss -s 查看网络情况
[root@k8s-master ~]# ss -s
Total: 161 (kernel 214)
TCP: 8 (estab 4, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0
Transport Total IP IPv6
* 214 - -
RAW 1 1 0
UDP 7 5 2
TCP 8 8 0
INET 16 14 2
FRAG 0 0 0
七、三剑客
1、grep
[root@k8s-master ~]# tail -f test.txt | grep '192.168.1.1'
test1:test2 test3 test4 192.168.1.1 establish
test1:test2 test3 test4 192.168.1.1 establish
2、awk
[root@k8s-master ~]# tail -f test.txt | awk '{print $4}'
192.168.1.1
192.168.1.2
192.168.1.1
[root@k8s-master ~]# tail -f test.txt | cut -d ' ' -f 4
192.168.1.1
192.168.1.2
192.168.1.1
八、杀掉进程
1、kill + 进程id
2、for i in ps -aux|grep '进程id'|awk '{print $2}';do kill $i;done
Thanks for your blog, nice to read. Do not stop.