常用Linux性能检测命令

Posted 果子哥丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用Linux性能检测命令相关的知识,希望对你有一定的参考价值。

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

https://www.cnblogs.com/f-ck-need-u/p/7064286.html

写入文件:

-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.2192.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.380端口接收到的数据包
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.254192.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

https://www.cnblogs.com/pyng/p/9698723.html

tcpdump输出内容分析 16进制
https://blog.csdn.net/Qevery678/article/details/89182872

-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;

数据概况解读:

  • https://blog.csdn.net/weixin_34117211/article/details/93020529
  • https://blog.51cto.com/13444271/2125346

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命令的用法详细详解:https://www.cnblogs.com/zhoug2020/p/6336453.html

• 按“P”键:可根据CPU使用时间的多少来排序。
• 按“M”键:可根据内存使用量的多少来排序,如图12-3所示。
• 按“T”键:可根据执行时间的多少来排序。

监视特定用户
因为top命令显示的数据有很多,所以要找出与特定用户有关的进程很不方便,此时您可在top画面中按下“shift+u”键,然后输入用户名称,系统即会过滤出与指定用户有关的进程信息。

删除指定进程
如果您具有管理员或所有者的身份,则可将某个进程由top中删除,这通常是因为该进程占用太多的系统资源。以下是删除指定进程所需执行的步骤:

  1. 步骤1 执行top命令,然后在数据画面中按“k”键。
  2. 步骤2 画面中会出现“PID to kill:”信息,接着输入该进程的PID。
  3. 步骤3 输入PID后按键,会出现“Kill PID xxxxx with signal [15]:”提示信息(此处的xxxxx是指PID编号),此时需输入signal号码,如果直接按键,则以默认的15进行处理。
  4. 步骤4 如果无法顺利删除,则输入9来强制删除该进程。
top:https://www.cnblogs.com/zhoug2020/p/6336453.html

mpstat: https://blog.csdn.net/quiet_girl/article/details/50697412

vmstat: https://blog.csdn.net/quiet_girl/article/details/50666906

sar: https://blog.csdn.net/quiet_girl/article/details/50687140
- https://blog.csdn.net/xusensen/article/details/54606401
  ⭐️https://www.cnblogs.com/howhy/p/6396437.html

  - 网络统计:sar -n DEV 
  - 内存统计:sar -r

iostat: https://blog.csdn.net/quiet_girl/article/details/50668790

dstat: https://wangchujiang.com/linux-command/c/dstat.html

nc命令

以上是关于常用Linux性能检测命令的主要内容,如果未能解决你的问题,请参考以下文章

Linux性能检测常用的10个基本命令

Linux性能检测常用的10个基本命令

常用Linux性能检测命令

Linux常用命令学习

前端开发常用代码片段(中篇)

如何检测 SUSE Linux 系统中的音频可用性