1、计数器
系统级别:
- vmstat: 虚拟内存和物理内存的统计,系统级别
- mpstat: 每个 CPU 的使用情况
- iostat: 每个磁盘 I/O 的使用情况,由块设备接口报告
- netstat: 网络接口的统计,TCP/IP 栈的统计,以及每个连接的一些统计信息
- sar: 各种各样的统计,能归档历史数据
进程级别:
- ps: 进程状态,显示进程的各种统计信息,包括内存和 CPU 的使用
- top: 按一个统计数据排序,显示排名高的进程
- pmap: 将进程的内存段和使用统计一起列出
一般来说,上述这些工具是从 /proc
文件系统里读取统计信息的
2、跟踪
跟踪收集每一个事件的数据以供分析。跟踪框架一般默认是不启用的,因为跟踪捕获数据会有 CPU 开销,另外还需要不小的存储空间来存放数据。
系统级别:
- tcpdump: 网络包跟踪(libpcap lib)
- blktrace: 块 I/O 跟踪
- DTrace: 跟踪内核的内部活动和所有资源的使用情况,支持静态和动态的跟踪
- SystemTap: 同上
- perf: Linux 性能事件,跟踪静态和动态的指针
进程级别:
- strace: 系统调用跟踪
- gbd: 源码级别的调试器
tcpdump与Wireshark
tcpdump和wireshark配合使用效果很不错,tcpdump提供了方便的抓包存储命令,wireshark提供了优秀的解析展示,可以方便包解析后的查看。
用tcpdump抓包以后用Wireshark打开分析。
tcpdump
写入文件:
-w filename 监听内容写入文件
监听端口设置:
port 80 监听80端口
tcp port 80 tcp80端口
udp port 80 udp80端口
src port 80 来源端口80
dst port 80 发往端口80
监听IP设置:
host 192.168.0.1监听与主机192.168.0.1通信内容
src 192.168.0.1 监听来源自192.168.0.1内容
dst 192.168.0.1 监听发往192.168.0.1内容
监听指定网络接口:
-i eth0 监听eth0接口
注:执行tcpdump -D可以查看支持的接口有哪些
# kolor @ kolordeMacBook-Pro in ~ [9:36:02]
$ tcpdump -D
1.en0 [Up, Running]
2.p2p0 [Up, Running]
常用案例:
1.监听访问baidu网站的443端口
命令:tcpdump host www.baidu.com and port 443
带写入文件时:
- tcpdump host www.baidu.com and port 443 -w wike.cap
- 使用tcpdump监听主机为192.168.1.1,tcp端口为80的数据,同时将输出结果保存输出到tcpdump.log。
tcpdump 'host 192.168.1.1 and port 80' > tcpdump.log
2.监听与192.168.0.1的udp协议通信情况
命令:tcpdump host 192.168.0.1 and udp
带写入文件:tcpdump host 192.168.0.1 and udp -w 1udp.cap
3.语法
类型的关键字
host(缺省类型): 指明一台主机,如:host 210.27.48.2
net: 指明一个网络地址,如:net 202.0.0.0
port: 指明端口号,如:port 23
确定方向的关键字
src: src 210.27.48.2, IP包源地址是210.27.48.2
dst: dst net 202.0.0.0, 目标网络地址是202.0.0.0
dst or src(缺省值)
dst and src
协议的关键字:缺省值是监听所有协议的信息包
tcp
udp
ip
arp等
其他关键字
gateway
broadcast
less
greater
常用表达式:多条件时可以用括号,但是要用转义
非 : ! 或 not (去掉双引号)
且 : && 或 and
或 : || 或 or
【提取TCP具体标识字段 秘籍】
1、如果想查看哪些ICMP包中“目标不可达、主机不可达”的包,请使用这样的过滤表达式:
icmp[0:2]==0x0301
2、要提取TCP协议的SYN、ACK、FIN标识字段,语法是:
tcp[tcpflags] & tcp-syn
tcp[tcpflags] & tcp-ack
tcp[tcpflags] & tcp-fin
3、如果要抓取一个区间内的端口,可以使用portrange语法:
tcpdump -i eth0 -nn 'portrange 52-55' -c 1 -XX
4、监听tcpdump中的多个端口
tcpdump port 80 or port 3128
或者,
tcpdump port '(80 or 443)'
4.选项
-A:以ASCII编码打印每个报文(不包括链路层的头)
-a:将网络和广播地址转换成名称;
-c<数据包数目>:收到指定的数据包数目后,tcpdump就会停止;
🌟-D:tcpdump会列出所有可以选择的抓包对象
-d:把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出;
-dd:把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出;
-ddd:把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出;
-e:在每列倾倒资料上显示连接层级的文件头;
-f:用数字显示网际网络地址;
-F<表达文件>:指定内含表达方式的文件;
-i<网络界面>:使用指定的网络截面送出数据包;
-l:使用标准输出列的缓冲区;
-n:指定将每个监听到数据包中的域名转换成IP地址后显示,不把网络地址转换成名字;
-nn:指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示
-N:不列出域名;
-O:不将数据包编码最佳化;
-p:不让网络界面进入混杂模式;
-q :快速输出,仅列出少数的传输协议信息;
-r<数据包文件>:从指定的文件读取数据包数据;
-s<数据包大小>:设置每个数据包的大小; #-s0 : tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容
-S:用绝对而非相对数值列出TCP关联数;
-t:在每列倾倒资料上不显示时间戳记;
-tt: 在每列倾倒资料上显示未经格式化的时间戳记;
-T<数据包类型>:强制将表达方式所指定的数据包转译成设置的数据包类型;
-v:详细显示指令执行过程;
-vv:更详细显示指令执行过程;
-x:用十六进制字码列出数据包资料;
-XX:则tcpdump会从以太网部分就开始显示网络包内容,而不是仅从网络层协议开始显示。
-w<数据包文件>:把数据包数据写入指定的文件。
5.示例
监视指定网络接口的数据包
tcpdump -i eth1
如果不指定网卡,默认tcpdump只会监视第一个网络接口,一般是eth0
用tcpdump嗅探80端口的访问看看谁最高。
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4"."}' | sort | uniq -c | sort -nr | head -5
抓取所有经过eth0,目的或源地址是192.168.1.1的网络数据
tcpdump -i eth0 host 192.168.1.1
抓取主机 192.168.1.1 和 主机 192.168.1.2或192.168.1.3的通信
tcpdump host 192.168.1.1 and (192.168.1.2 or 192.168.1.3)
抓取主机 192.168.2.1 除了和主机 192.168.1.1之外所有主机通信的数据包:
tcpdump -n host 192.168.2.1 and !192.168.1.1
抓取主机192.168.1.1发送的所有数据
tcpdump -i eth0 src host 192.168.1.1
抓取主机192.168.1.1接收的所有数据
tcpdump -i eth0 dst host 192.168.1.1
抓取主机192.168.1.1所有在TCP 80端口的数据包
tcpdump -i eth0 host 192.168.1.1 and tcp port 80
抓取主机10.37.63.3在80端口接收到的数据包
tcpdump -i eth0 host 10.37.63.3 and dst port 80
抓取所有经过eth0,网络是192.168上的数据包
tcpdump -i eth0 net 192.168
tcpdump -i eth0 net 192.168.1.0/24
协议过滤
tcpdump -i eth0 arp
tcpdump -i eth0 ip
抓取所有经过 en0,目的地址是 192.168.1.254 或 192.168.1.200 端口是 80 的 TCP 数据
tcpdump -i en0 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'
抓取所有经过en0,目标MAC地址是14:7d:da:bc:xx:xx 的 ICMP 数据
tcpdump -i en0 '((icmp) and ((ether dst host 14:7d:da:bc:xx:xx)))'
抓取所有经过en0,目的网络是192.168,但目的主机不是192.168.1.200的TCP数据
tcpdump -i en0 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'
只抓SYN包
tcpdump -i en0 'tcp[tcpflags] = tcp-syn'
只捕获TCP SYN包:
# tcpdump -i <interface> "tcp[tcpflags] & (tcp-syn) != 0"
只捕获TCP ACK包:
# tcpdump -i <interface> "tcp[tcpflags] & (tcp-ack) != 0"
只捕获TCP FIN包:
# tcpdump -i <interface> "tcp[tcpflags] & (tcp-fin) != 0"
只捕获TCP SYN或ACK包:
# tcpdump -r <interface> "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0"
-
-S:用绝对而非相对数值列出TCP关联数;
tcpdump -S -i en0 host www.baidu.com
分析抓取到的报文
第一列是时间戳:时、分、秒、微秒
第二列是网际网路协议的名称
第三列是报文发送方的十进制网际网路协议地址,以及紧跟其后的端口号。
第四列是\>流向符,数据包从左边发往右边
第五列是报文接收方的十进制网际网路协议地址,以及紧跟其后的端口号
第六列是冒号
第七列是Flags标识,可能的取值是`[S.][.][P.][F.]`, Flags的标记,此处为[P.],代表PST和ACK(.代表ACK确认)
tcpdump的Flags代表了这个数据包的用途,这些标记是TCP首部的内容
[S]:SYN同步标识<br>[.]:<code>.</code>表示ACK确认标识<br>[S.]:SYN同步标识,以及确认[S]的ACK<br>[P.]:PSH,push推送,数据传输<br>[R.]:RST,连接重置<br>[F.]:FIN结束连接<br>[DF]:Don't Fragment(不允许分片),当DF=0时,表示允许分片,一般<code>-v</code>时才有这个标识<br>[FP.]:标记FIN、PUSH、ACK组合,这样做是为了提升网络效率,减少数据来回确认等
第八列往后,seq 463752178:463752321, ack 1861813478, win 4096, length 143: HTTP: GET / HTTP/1.1
- seq为序列号
- ack为确认码
- win为滑动窗口大小
- length为承载的数据(payload)长度length,如果没有数据则为0
wireshark
1.No:代表数据包标号。
2.Time:在软件启动的多长时间内抓到。
3.Source:来源ip。
4.Destination: 目的ip。
5.Protocol:协议。
6.Length:数据包长度。
7.info:数据包信息。
Frame:物理层的数据帧概况;
EthernetⅡ:数据链路层以太网帧头部信息;
Internet Protocol Version 4:互联网层IP包头部;
Transmission Control Protocol:传输层的数据段头部信息
Hypertext Transfer Protocol:应用层的信息,这里的是HTTP;
数据概况解读:
SYN——》SYN,ACK——〉ACK
方法
1、过滤源ip、目的ip。在wireshark的过滤规则框Filter中输入过滤条件。
查找目的地址为192.168.101.8的包,ip.dst==192.168.101.8;
查找源地址为ip.src==1.1.1.1;
ip.src_host==
2、端口过滤。
过滤80端口,在Filter中输入,tcp.port==,这条规则是把源端口和目的端口为80的都过滤出来。
使用tcp.dstport==80只过滤目的端口为80的,tcp.srcport==80只过滤源端口为80的包;
3、协议过滤比较简单,直接在Filter框中直接输入协议名即可,如过滤HTTP的协议;
4、http模式过滤。
过滤get包,http.request.method=="GET"
过滤post包,http.request.method=="POST";
HTTP协议
http.host == "http://baidu.net"
DNS协议
dns.qry.name=="www.baidu.com"
5、连接符and的使用。
过滤两种条件时,使用and连接,如过滤ip为192.168.101.8并且为http协议的,ip.src==192.168.101.8 and http。
简述TCP包头的内容
- 序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
- 确认号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1
- 标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
URG:紧急指针有效
ACK:确认序号有效
PSH:接收方应该尽快将这个报文交给应用层。
RST:重置连接。
SYN:发起一个新连接。
FIN:释放一个连接。
三次握手
概念:指在发送数据的准备阶段,服务器和客户端之间需要三次交互
第一次握手:建立连接时,客户端向服务器发送一个SYN包,并进入SYN_SENT状态,等待服务器确认
第二次握手:当服务器收到客户端的请求后,此时要给客户端给一个确认信息ACK,同时发送SYN包,此时服务器进入 SYN_RECV状态
第三次握手:客户端收到服务器发的ACK+SYN包后,向服务器发送ACK,发送完毕之后,客户端和服务器进入 ESTABLISHED(TCP连接成功)状态,完成三次握手
四次挥手
概念:所谓四次挥手就是说关闭TCP连接的过程,当断开一个TCP连接时,需要客户端和服务器共发送四个包确认
第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传输,客户端进入FIN_WAIT_1状态
第二次挥手:服务器收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序 号),服务器进入CLOSE_WAIT状态
第三次挥手:服务器发送一个FIN,用来关闭服务器到客户端的数据传输,服务器进入LAST_ACK状态
第四次挥手:客户端收到FIN后,客户端进入TIME_WAIT状态,接着发送一个ACK给服务器,确认序号为收到序号+1,服务器进入CLOSED状态,完成四次挥手
3、CPU分析工具
top命令
TOP命令的用法详细详解:
- 按“P”键:可根据CPU使用时间的多少来排序。
- 按“M”键:可根据内存使用量的多少来排序,如图12-3所示。
- 按“T”键:可根据执行时间的多少来排序。
- 多U多核CPU监控:按键盘数字“1”,可监控每个逻辑CPU的状况:
- 高亮显示当前运行进程:敲击键盘“b”(打开/关闭加亮效果)
- 进程字段排序:敲击键盘“x”(打开/关闭排序列的加亮效果)
通过”shift + >”或”shift + <”可以向右或左改变排序列
监视特定用户
因为top命令显示的数据有很多,所以要找出与特定用户有关的进程很不方便,此时您可在top画面中按下“shift+u”键,然后输入用户名称,系统即会过滤出与指定用户有关的进程信息。
删除指定进程
如果您具有管理员或所有者的身份,则可将某个进程由top中删除,这通常是因为该进程占用太多的系统资源。以下是删除指定进程所需执行的步骤:
- 步骤1 执行top命令,然后在数据画面中按“k”键。
- 步骤2 画面中会出现“PID to kill:”信息,接着输入该进程的PID。
- 步骤3 输入PID后按键,会出现“Kill PID xxxxx with signal [15]:”提示信息(此处的xxxxx是指PID编号),此时需输入signal号码,如果直接按键,则以默认的15进行处理。
- 步骤4 如果无法顺利删除,则输入9来强制删除该进程。
- 第一行后面的三个值是系统在之前 1、5、15 的平均负载,也可以看出系统负载是上升、平稳、下降的趋势,当这个值超过 CPU 可执行单元的数目,则表示 CPU 的性能已经饱和成为瓶颈了。
- 第二行统计了系统的任务状态信息。running 很自然不必多说,包括正在 CPU 上运行的和将要被调度运行的;sleeping 通常是等待事件(比如 IO 操作)完成的任务,细分可以包括 interruptible 和 uninterruptible 的类型;stopped 是一些被暂停的任务,通常发送 SIGSTOP 或者对一个前台任务操作 Ctrl-Z 可以将其暂停;zombie 僵尸任务
僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源
- 第三行 cpu状态信息:
5.9% us:用户空间占用CPU的百分比。
3.4% sy:内核空间占用CPU的百分比。—— IO操作相关
0.0% ni:改变过优先级的进程占用CPU的百分比
90.4% id:空闲CPU百分比
0.0% wa:IO等待占用CPU的百分比。 —— 该值过高,反应IO操作效率低
0.0% hi:硬中断(Hardware IRQ)占用CPU的百分比。 —— 该值过高,外设可能出现问题,cat /proc/interrupts
0.2% si:软中断(Software Interrupts)占用CPU的百分比 - 第四行和第五行是物理内存和虚拟内存(交换分区)的信息:
total = free + used + buff/cache,现在buffers和cached Mem信息总和到一起了,但是buffers和cached
内存状态,具体信息如下:
32949016k total — 物理内存总量(32GB)
14411180k used — 使用中的内存总量(14GB)
18537836k free — 空闲内存总量(18GB)
169884k buffers — 缓存的内存量 (169M)
swap交换分区信息,具体信息说明如下:
32764556k total — 交换区总量(32GB)
0k used — 使用的交换区总量(0K)
32764556k free — 空闲交换区总量(32GB)
3612636k cached — 缓冲的交换区总量(3.6GB)
各进程(任务)的状态监控,项目列信息说明如下:
PID:进程id
USER:进程所有者
PR:进程优先级
NI:nice值。负值表示高优先级,正值表示低优先级
VIRT:进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES:进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR:共享内存大小,单位kb
S:进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU:上次更新到现在的CPU时间占用百分比
%MEM:进程使用的物理内存百分比
TIME+:进程使用的CPU时间总计,单位1/100秒
COMMAND:进程名称(命令名/命令行)
buffer与cache
buffers 和 cached 都是缓存,两者有什么区别呢?
为了提高磁盘存取效率,Linux 做了一些精心的设计,除了对 dentry 进行缓存(用于VFS,加速文件路径名到 inode 的转换),还采取了两种主要 Cache 方式:Buffer Cache 和Page Cache。前者针对磁盘块的读写,后者针对文件 inode 的读写。这些 Cache 有效缩短了 I/O 系统调用(比如 read,write,getdents)的时间。
Buffer cache 是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。
简单说来,page cache 用来缓存文件数据,buffer cache 用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到 page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到 buffer cache。
vmstat
vmstat:
命令参数
-a:显示活跃和非活跃内存
-f:显示从系统启动至今的fork数量 。
-m:显示slabinfo
-n:只在开始时显示一次各字段名称。
-s:显示内存相关统计信息及多种系统活动数量。
delay:刷新时间间隔。如果不指定,只显示一条结果。
count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
-d:显示磁盘相关统计信息。
-p:显示指定磁盘分区统计信息
-S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
-V:显示vmstat版本信息。
字段说明:
Procs(进程):
r: 运行队列中进程数量
b: 等待IO的进程数量
Memory(内存):
swpd: 使用虚拟内存大小
虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free: 可用内存大小
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小
Swap:
si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。
so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
IO:(现在的Linux版本块的大小为1024bytes)
bi: 每秒读取的块数
bo: 每秒写入的块数
例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
系统:
in: 每秒中断数,包括时钟中断。
cs: 每秒上下文切换数。
CPU(以百分比表示):
us: 用户进程执行时间(user time)
sy: 系统进程执行时间(system time)
id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。
id + us + sy = 100
wa: 等待IO时间
那这个性能大于多少代表不好呢?
r 表示运行队列(就是说多少个进程真的分配到CPU),当这个值超过了CPU数目,就会出现CPU瓶颈
iostat
iotop 可以直观的显示各个进程、线程的磁盘读取实时速率
iostat:
- iowait% 表示CPU等待IO时间占整个CPU周期的百分比,如果iowait值超过50%,或者明显大于%system、%user以及%idle,表示IO可能存在问题。
- avgqu-sz 表示磁盘IO队列长度,即IO等待个数。
- await 表示每次IO请求等待时间,包括等待时间和处理时间
- svctm 表示每次IO请求处理的时间(ms),如果 svctm 与 await 很接近,表示几乎没有 I/O 等待,磁盘性能很好,否则磁盘队列等待时间较长,磁盘响应较差;
- %util 表示磁盘忙碌情况,一般该值超过80%表示该磁盘可能处于繁忙状态。
$ iostat
Linux 3.10.0-957.el7.x86_64 (ip131) 05/26/2020 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.07 0.00 0.25 0.00 0.00 99.68
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 1.23 32.90 4.46 201941 27407
dm-0 1.18 27.54 4.13 169074 25359
dm-1 0.01 0.40 0.00 2460 0
avg-cpu: 总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值。重点关注iowait值,表示CPU用于等待io请求的完成时间。
Device: 各磁盘设备的IO统计信息。各列含义如下:
tps: 每秒进程下发的IO读、写请求数量
KB_read/s: 每秒从驱动器读入的数据量,单位为K。
KB_wrtn/s: 每秒从驱动器写入的数据量,单位为K。
KB_read: 读入数据总量,单位为K。
KB_wrtn: 写入数据总量,单位为K。
1) -x:输出更详细的io设备统计信息
2) -d:单独输出Device结果,不包括cpu结果
3) -k/-m:输出结果以kB/mB为单位,而不是以扇区数为单位
4) -c:只显示系统CPU统计信息,即单独输出avg-cpu结果,不包括device结果
5) interval/count:每次输出间隔时间,count表示输出次数,不带count表示循环输出
$ iostat -xd 2 1
Linux 3.10.0-957.el7.x86_64 (ip131) 05/26/2020 _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
sda 0.00 0.01 0.86 0.59 41.81 5.11 64.45 0.00 0.79 0.86 0.69 0.51 0.07
dm-0 0.00 0.00 0.77 0.61 34.76 4.67 57.10 0.00 0.85 0.93 0.76 0.53 0.07
dm-1 0.00 0.00 0.02 0.00 0.53 0.00 54.67 0.00 0.13 0.13 0.00 0.04 0.00
%util: IO队列非空的时间比率
rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
wrqm/s: 每秒对该设备的写请求被合并次数
r/s: 每秒完成的读次数
w/s: 每秒完成的写次数
rkB/s: 每秒读数据量(kB为单位)
wkB/s: 每秒写数据量(kB为单位)
avgrq-sz:平均每次IO操作的数据量(扇区数为单位)
avgqu-sz: 平均等待处理的IO请求队列长度
await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
svctm: 平均每次IO请求的处理时间(毫秒为单位)
ss命令
ss命令
统计服务器并发连接数
netstat -ant | grep EST | wc -l
ss -o state established | wc -l
总结:ss效率完胜netstat
ss -l 显示本地打开的所有端口
ss -pl 显示每个进程具体打开的socket
ss -t -a 显示所有tcp socket
ss -u -a 显示所有的UDP Socekt
ss -o state established '( dport = :smtp or sport = :smtp )' 显示所有已建立的SMTP连接
ss -o state established '( dport = :http or sport = :http )' 显示所有已建立的HTTP连接
ss列出处在FIN-WAIT-1状态的http、https连接
ss -o state fin-wait-1 '( sport = :http or sport = :https )'
ss常用的state状态:
established
syn-sent
syn-recv
fin-wait-1
fin-wait-2
time-wait
closed
close-wait
last-ack
listen
closing
ss使用IP地址筛选:
ss src ADDRESS_PATTERN
src:表示来源
ADDRESS_PATTERN:表示地址规则
如下:ss src 120.33.31.1 # 列出来之20.33.31.1的连接
# 列出来至120.33.31.1,80端口的连接
ss src 120.33.31.1:http
ss src 120.33.31.1:80
ss使用端口筛选:
ss dport OP PORT
OP:是运算符
PORT:表示端口
dport:表示过滤目标端口、相反的有sport
OP运算符如下:
<= or le : 小于等于 >= or ge : 大于等于
== or eq : 等于
!= or ne : 不等于端口
< or lt : 小于这个端口 > or gt : 大于端口
OP实例:
ss sport = :http 也可以是 ss sport = :80
ss dport = :http
ss dport \> :1024
ss sport \> :1024
ss sport \< :32000
ss sport eq :22
ss dport != :22
ss state connected sport = :http
ss \( sport = :http or sport = :https \)
ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 192.168.
为什么ss比netstat快:
netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多
其他
mpstat:
sar:
- ⭐️
- 网络统计:sar -n DEV
- 内存统计:sar -r
dstat: https://wangchujiang.com/linux-command/c/dstat.html
nc命令