jck-lucio-【实战】三剑客实战之性能、网络统计实战

# ps

ps 命令是一个常用的 Linux 命令,用于查看当前系统中运行的进程信息。它提供了关于进程的各种详细信息,如进程 ID(PID)、进程状态、CPU 使用情况、内存占用、运行时间等。

Ps -ef:查进程,不关注性能

UID:进程所有者的用户 ID

PID:进程的唯一 ID

PPID:(Parent Process ID)父进程的标识符

C:与 %CPU 的意思相同,进程使用的 CPU 资源的百分比,或者说进程的 CPU 使用率

STIME:与 START 的意思相同,进程启动的时间

TTY:与进程相关联的终端

TIME:进程运行过程中占用 CPU 的总时间

CMD:启动进程的命令名称

常用选项参数

以下是一些常用的 ps 命令选项参数:

-e:(every)显示所有进程,而不仅仅是当前用户的进程

-u:(user)显示面向用户的进程的详细信息,如进程所有者、CPU 使用率、内存使用率等

-f:(full-format)以全格式的列表显示进程的信息,包括进程之间的层级关系

-p:(pid)查找具有指定进程 ID 的进程

-C:(Command)查找具有指定命令名称的进程

-aux:以详细格式显示所有正在运行的进程,其中 x 指的是在没有控制终端的情况下列出进程,这些显示的主要是启动并运行在后台的进程

ps -ef | head -10

![|554x128](file:///C:\Users\86159\AppData\Local\Temp\ksohtml4616\wps1.jpg)

ps -e -o thcount,pid,comm,user|head

![|542x169](file:///C:\Users\86159\AppData\Local\Temp\ksohtml4616\wps2.jpg)

ps -e -o uname,pid,ppid,thcount,ni,pri,psr,pcpu,pmem,rss,vsz,sz,time,user,start_time,time,comm,c,command “$@”|head -5

![|553x134](file:///C:\Users\86159\AppData\Local\Temp\ksohtml4616\wps3.jpg)

Ps -aux:关注性能

USER:进程所有者的用户名

PID:进程的唯一标识符,即进程 ID

%CPU:进程使用的 CPU 资源的百分比

%MEM:进程使用的内存资源的百分比

VSZ:(Virtual Memory Size)进程的虚拟内存大小(以 KB 为单位)

RSS:(Resident Set Size)进程占用的物理内存大小(以 KB 为单位)

TTY:进程所关联的终端

STAT:进程的状态(例如,R 表示运行,S 表示睡眠,Z 表示僵尸(Zombie)等)

START:进程启动的时间

TIME:进程运行过程中占用 CPU 的总时间

COMMAND:启动进程的命令名称

ps aux | head -5

![|554x83](file:///C:\Users\86159\AppData\Local\Temp\ksohtml4616\wps4.jpg)

# top

常用参数

top命令支持一些参数,下面是一些常用的参数:

  • -d:设置刷新频率。

  • -n:设置刷新的次数。

  • -p:显示指定进程的信息。

  • -u:显示指定用户的进程信息。

  • -o:指定排序字段。

  • -h:显示帮助信息。

![|554x89](file:///C:\Users\86159\AppData\Local\Temp\ksohtml4616\wps5.jpg)

top - 21:56:31 up 1089 days代表当前系统的时间是21:56:31 ,并且该机器已经启动了1089 days。17 users代表当前有两个用户登录。load average: 0.02, 0.65, 2.75代表的是系统最近5、10和15分钟内的平均负载。

系统总共有167个进程,其中1个进程处于running状态,163个进程处于sleeping状态,0个进程处于stop状态,3个进程处于僵尸进程状态。

这里的每一个参数的含义如下所示: - us, user: 用户空间的CPU百分比 - sy,system: 内核空间占用的CPU百分比 - ni,niced:调整过优先级的用户进程占用CPU百分比 - id,idle: 空闲CPU的百分比 - wa,IO wait: 用于等待IO完成的CPU时间 - hi:处理硬件中断的CPU时间 - si: 处理软件中断的CPU时间 - st:这个虚拟机被hypervisor偷去的CPU时间(译注:如果当前处于一个hypervisor下的vm,实际上hypervisor也是要消耗一部分CPU处理时间的)。

![|554x94](file:///C:\Users\86159\AppData\Local\Temp\ksohtml4616\wps6.jpg)

第一行的含义如下: - 3635.0 total — 物理内存总量(3265MB ) - 3229.8 free — 空闲的内存总量( 3229.8MB ) - 441.0 used — 使用中的内存总量( 441.0MB ) - 170.1 buff/cache — block buffer + page cache 所占用的内存大小 (169M)

这里补充一句buff/cache的内容,在Linux 2.4以前,page cache和buffer cache是两个独立的缓存,Linux 2.4开始page cache和buffer cache进行了统一。

第二行的含义如下: - 2072.0 total - 交换分区的总量 - 2072.0 free - 空闲的交换分区的总量 - 0.0 used - 已使用的交换分区大小 - 3194.0 avail Mem: 这个值是系统的估算值,表示可用于启动新程序的物理内存大小(不包括 swap 空间)

![|553x383](file:///C:\Users\86159\AppData\Local\Temp\ksohtml4616\wps7.jpg)

PID:进程ID,进程的唯一标识符

USER:进程所有者的实际用户名。

PR:进程的调度优先级。这个字段的一些值是’rt’。这意味这这些进程运行在实时态。

NI:进程的nice值(优先级)。NI的值处于[-20, 19],越小的值意味着越高的优先级。

VIRT:进程使用的虚拟内存。默认是KB。

RES:驻留内存大小。驻留内存是任务使用的非交换物理内存大小,默认是KB。

SHR:SHR是进程使用的共享内存,默认是KB。

S:这个是进程的状态。它有以下不同的值:

D – 不可中断的睡眠态。

R – 运行态

S – 睡眠态

T – 被跟踪或已停止

Z – 僵尸态

CPU:自从上一次更新时到现在任务所使用的CPU时间百分比。

MEM:进程使用的可用物理内存百分比。

TIME:任务启动后到现在所使用的全部CPU时间,精确到百分之一秒。

top -p 23920 -b (3s一次统计)

[jck287213@shell.ceshiren.com ~]$ ps -ef |grep -i aliyun

root 23774 1 0 Sep15 ? 00:23:56 /usr/local/aegis/aegis_update/AliYunDunUpdate

root 23920 1 0 Sep15 ? 02:02:24 /usr/local/aegis/aegis_client/aegis_11_73/AliYunDun

root 23931 1 1 Sep15 ? 12:44:32 /usr/local/aegis/aegis_client/aegis_11_73/AliYunDunMonitor

jck2872+ 30664 30459 0 20:17 pts/12 00:00:00 grep --color=auto -i aliyun

[jck287213@shell.ceshiren.com ~]$ top -p 23920 -b(3s一次统计)

top - 20:18:07 up 1089 days, 9:00, 8 users, load average: 0.18, 0.14, 0.25

Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie

%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

KiB Mem : 3881920 total, 271332 free, 1137468 used, 2473120 buff/cache

KiB Swap: 0 total, 0 free, 0 used. 373244 avail Mem

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

23920 root 10 -10 104792 2844 548 S 0.0 0.1 122:24.34 AliYunDun

top - 20:18:10 up 1089 days, 9:00, 8 users, load average: 0.25, 0.15, 0.25

Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie

%Cpu(s): 0.7 us, 0.5 sy, 0.0 ni, 98.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

KiB Mem : 3881920 total, 271332 free, 1137460 used, 2473128 buff/cache

KiB Swap: 0 total, 0 free, 0 used. 373252 avail Mem

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

23920 root 10 -10 104792 2844 548 S 0.0 0.1 122:24.34 AliYunDun

![|554x262](file:///C:\Users\86159\AppData\Local\Temp\ksohtml4616\wps8.jpg)

top -p 23920 -b -d 1(1s统计一次)

![|554x344](file:///C:\Users\86159\AppData\Local\Temp\ksohtml4616\wps9.jpg)

top -p 23920 -b -d 1 -n 5(1s统计一次,20次结束)

![|553x323](file:///C:\Users\86159\AppData\Local\Temp\ksohtml4616\wps10.jpg)

Q&A

问题:统计一个进程的实时cpu数据需要用到哪个命令

[jck287213@shell.ceshiren.com ~]$ ps -ef | head -10

UID PID PPID C STIME TTY TIME CMD

root 1 0 0 2020 ? 12:32:33 /usr/lib/systemd/systemd --system --deserialize 21

root 2 0 0 2020 ? 00:00:15 [kthreadd]

root 3 2 0 2020 ? 05:32:51 [ksoftirqd/0]

root 5 2 0 2020 ? 00:00:00 [kworker/0:0H]

root 7 2 0 2020 ? 00:06:53 [migration/0]

root 8 2 0 2020 ? 00:00:00 [rcu_bh]

root 9 2 0 2020 ? 06:20:13 [rcu_sched]

root 12 2 0 2020 ? 00:06:56 [migration/1]

root 13 2 0 2020 ? 05:34:50 [ksoftirqd/1]

[jck287213@shell.ceshiren.com ~]$ ps aux | head -10

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 1 0.0 0.0 60360 3068 ? Ss 2020 752:33 /usr/lib/systemd/systemd --system --deserialize 21

root 2 0.0 0.0 0 0 ? S 2020 0:15 [kthreadd]

root 3 0.0 0.0 0 0 ? S 2020 332:51 [ksoftirqd/0]

root 5 0.0 0.0 0 0 ? S< 2020 0:00 [kworker/0:0H]

root 7 0.0 0.0 0 0 ? S 2020 6:53 [migration/0]

root 8 0.0 0.0 0 0 ? S 2020 0:00 [rcu_bh]

root 9 0.0 0.0 0 0 ? S 2020 380:13 [rcu_sched]

root 12 0.0 0.0 0 0 ? S 2020 6:56 [migration/1]

root 13 0.0 0.0 0 0 ? S 2020 334:50 [ksoftirqd/1]

## 统计top的性能(资源使用情况)

perf_get(){

/#todo: 输出20s内某个进程的每秒的cpu和mem,并最后空出一行统计平均性能

top -b -d 1 -n 10 |grep --line-buffered -i yundun$|awk ‘BEGIN{print “cpu”,“mem”}{cpu+=$9;mem+=$10;print $9,$10}END{print “”;print cpu/NR,mem/NR}’

}

Type perf_get()

[jck287213@shell.ceshiren.com ~]$ top -b -d 1 -n 10 |grep --line-buffered -i yundun$|awk ‘BEGIN{print “cpu”,“mem”}{cpu+=$9;mem+=$10;print $9,$10}END{print “”;print cpu/NR,mem/NR}’

![|552x103](file:///C:\Users\86159\AppData\Local\Temp\ksohtml4616\wps11.jpg)

top -b -d 1 -n 10 |

grep --color=auto --line-buffered -i yundun$|

Awk

'BEGIN{print “cpu”,“mem”}

{cpu+=$9;mem+=$10;print $9,$10}

END{print “”;print cpu/NR,mem/NR}’

# netstat命令详解

## 作用

netstat 命令: 查看系统中网络连接状态信息

## 1. 常用参数

|参数|作用

-a, --all |显示本机所有连接和监听的端口

n, --numeric | 不解析域名

-u | 显示udp协议连接

-t |显示tcp协议连接

-p | 显示连接对应的PID与程序名

c|设置几秒钟更新一次

o|显示计时器

M |显示伪装的链接

-l |监听

netstat -tnlp

![|554x240](file:///C:\Users\86159\AppData\Local\Temp\ksohtml4616\wps12.jpg)

netstat -tnp

![|554x258](file:///C:\Users\86159\AppData\Local\Temp\ksohtml4616\wps13.jpg)

## 找出链接总数

connection_summary(){

#todo: 链接所有的端口和对应的tcp连接状态,找出他们的连接总数吧

netstat -tn | awk ‘NR>2{print $4,$6}’| awk -F: ‘{print $ 2}’|sort|uniq -c | sort -nr| awk ‘{print $2"\t"$3"\t"$1}’|head -5

}

统计端口、状态,

[jck287213@shell.ceshiren.com ~]$ netstat -tn | awk ‘NR>2{print $4,$6}’| awk -F: ‘{print $ 2}’|sort|uniq -c | sort -nr| awk ‘{print $2"\t"$3"\t"$1}’|head -5

22 ESTABLISHED 15

25 TIME_WAIT 2

9100 ESTABLISHED 1

59962 ESTABLISHED 1

39664 TIME_WAIT 1

[jck287213@shell.ceshiren.com ~]$ netstat -tn | awk ‘NR>2{print $4,$6}’| awk -F: ‘{print $ 2}’|sort|uniq -c | sort -nr| awk ‘{print $2,$3,$1}’|head -5

22 ESTABLISHED 15

9100 ESTABLISHED 1

59962 ESTABLISHED 1

37190 ESTABLISHED 1

37188 ESTABLISHED 1

![|553x88](file:///C:\Users\86159\AppData\Local\Temp\ksohtml4616\wps14.jpg)