目录

5 网络IO性能监控

5.1 性能指标

5.2 网络信息

5.2.1 套接字信息

5.2.2 协议栈统计信息-netstat命令

5.2.3 网络吞吐-sar命令

5.2.4 连通性和延时

5.3 其他常用的网络相关命令

telnet

nc

mtr连通性测试

nslookup

traceroute

iptraf强大的网络监控

tcpdump- 抓包,然后用wireshark分析

nmap

lsof

ethtool

5 网络IO性能监控

5.1 性能指标

通常用带宽、吞吐量、延时、PPS(Packet Per Second)等指标衡量网络的性能。

1. 带宽,表示链路的最大传输速率,单位通常为 b/s (比特 / 秒)。

2. 吞吐量,表示单位时间内成功传输的数据量,单位通常为 b/s(比特 / 秒)或者 B/s(字节 / 秒)。吞吐量受带宽限制,而吞吐量 / 带宽,也就是该网络的使用率。

3. 延时,表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟。在不同场景中,这一指标可能会有不同含义。比如,它可以表示,建立连接需要的时间(比如 TCP 握手延时),或一个数据包往返所需的时间(比如 RTT)。

4. PPS,是 Packet Per Second(包 / 秒)的缩写,表示以网络包为单位的传输速率。PPS 通常用来评估网络的转发能力,比如硬件交换机,通常可以达到线性转发(即 PPS 可以达到或者接近理论最大值)。而基于 Linux 服务器的转发,则容易受网络包大小的影响。

除了这些指标,网络的可用性(网络能否正常通信)、并发连接数(TCP 连接数量)、丢包率(丢包百分比)、重传率(重新传输的网络包比例)等也是常用的性能指标。

5.2 网络信息

5.2.1 套接字信息

使用netstat 或者 ss ,来查看套接字、网络栈、网络接口以及路由表的信息。

PS:查询网络的连接信息ss比netstat查询速度更快。

# head -n 3 表示只显示前面3行

-a (all)显示所有选项,默认不显示LISTEN相关

-t (tcp)仅显示tcp相关选项

-u  (udp)仅显示udp相关选项

-n 拒绝显示别名,能显示数字的全部转化成数字。

-l 仅列出有在 Listen (监听) 的服务状态

-p 显示建立相关链接的程序名

-r 显示路由信息,路由表

-e 显示扩展信息,例如uid等

-s 按各个协议进行统计

-c 每隔一个固定时间,执行该netstat命令。

linux监控watch网卡 linux监控网络io_linux监控watch网卡

# -l 表示只显示监听套接字

# -t 表示只显示 TCP 套接字

# -n 表示显示数字地址和端口(而不是名字)

# -p 表示显示进程信息

linux监控watch网卡 linux监控网络io_运维_02

 netstat 和 ss 的输出也是类似的,都展示了套接字的状态、接收队列、发送队列、本地地址、远端地址、进程 PID 和进程名称等。其中,接收队列(Recv-Q)和发送队列(Send-Q)需要特别关注,它们通常应该是 0。当你发现它们不是 0 时,说明有网络包的堆积发生。当然还要注意,在不同套接字状态

下,它们的含义不同。

当套接字处于连接状态(Established)时:

Recv-Q 表示套接字缓冲还没有被应用程序取走的字节数(即接收队列长度)。

Send-Q 表示还没有被远端主机确认的字节数(即发送队列长度)。

当套接字处于监听状态(Listening)时:

Recv-Q 表示全连接队列的长度。

Send-Q 表示全连接队列的最大长度。

所谓全连接,是指服务器收到了客户端的 ACK,完成了 TCP 三次握手,然后就会把这个连接挪到全连接队列中。这些全连接中的套接字,还需要被 accept() 系统调用取走,服务器才可以开始真正处理客户端的请求。

与全连接队列相对应的,还有一个半连接队列。所谓半连接是指还没有完成 TCP 三次握手的连接,连接只进行了一半。服务器收到了客户端的 SYN 包后,就会把这个连接放到半连接队列中,然后再向客户端发送 SYN+ACK 包。

5.2.2 协议栈统计信息-netstat命令

使用 netstat 或 ss 查看协议栈的信息

 

linux监控watch网卡 linux监控网络io_linux_03

linux监控watch网卡 linux监控网络io_linux监控watch网卡_04

 这些协议栈的统计信息都很直观。

ss 只显示已经连接、关闭、孤儿套接字等简要统计,而 netstat 则提供的是更详细的网络协议栈信息。

上面 netstat 的输出示例,就展示了 TCP 协议的主动连接、被

动连接、失败重试、发送和接收的分段数量等各种信息

5.2.3 网络吞吐-sar命令

给 sar 增加 -n 参数就可以查看网络的统计信息,比如网络接口(DEV)、网络接口错误(EDEV)、TCP、UDP、ICMP 等等。执行下面的命令,你就可以得到网络接口统计信息:

linux监控watch网卡 linux监控网络io_运维_05

 输出指标含义

1.rxpck/s 和 txpck/s 分别是接收和发送的 PPS,单位为包 / 秒。

2.rxkB/s 和 txkB/s 分别是接收和发送的吞吐量,单位是 KB/ 秒。

3.rxcmp/s 和 txcmp/s 分别是接收和发送的压缩数据包数,单位是包 / 秒。

4.%ifutil 是网络接口的使用率,即半双工模式下为 (rxkB/s+txkB/s)/Bandwidth,而全双工模式下为max(rxkB/s, txkB/s)/Bandwidth。

linux监控watch网卡 linux监控网络io_linux_06

 从输出中可以看到网卡的读写速度和流量,在应急过程中可以用来判断服务器是否上量。

此命令除了可以用于查看网卡的信息,还可以用来收集如下服务的状态信息。

-A:所有报告的总和。

-u:CPU利用率。

-v:进程、I节点、文件和锁表状态。

-d:硬盘的使用报告。

-r:没有使用的内存页面和硬盘快。

-g:串口I/O的情况。

-b:缓冲区的使用情况。

-a:文件的读写情况。

-c:系统的调用情况。

-R:进程的活动情况。

-y:终端设备的活动情况。

-w:系统的交换活动

5.2.4 连通性和延时

通常使用 ping ,来测试远程主机的连通性和延时

ping

说明

ping命令是用于检测网络故障的常用命令,可以用来钡J试一台主机到另外一台主机的网络是否连通。

语法

ping [-dfnqrRv][-c<完成次数>][-i<间隔秒数>][-I<网络界面>][-l<前置载入>][-p<范本样式>][-s<数据包大小>][-t<存活数值>][主机名称或IP地址]

-d 使用Socket的SO_DEBUG功能。

-c<完成次数> 设置完成要求回应的次数。

-f 极限检测。

-i<间隔秒数> 指定收发信息的间隔时间。

-I<网络界面> 使用指定的网络接口送出数据包。

-l<前置载入> 设置在送出要求信息之前,先行发出的数据包。

-n 只输出数值。

-p<范本样式> 设置填满数据包的范本样式。

-q 不显示指令执行过程,开头和结尾的相关信息除外。

-r 忽略普通的Routing Table,直接将数据包送到远端主机上。

-R 记录路由过程。

-s<数据包大小> 设置数据包的大小。

-t<存活数值> 设置存活数值TTL的大小。

-v 详细显示指令的执行过程。

检测和主机是否连通

ping baidu.com

ping指定次数

linux监控watch网卡 linux监控网络io_网络_07

1. ping目标主机的域名和IP(ping会自动将域名转换为IP)

2. 不带包头的包大小和带包头的包大小(参考“-s”参数)

3. icmp_seq:ping序列,从1开始;如果数字不是按顺序递增也就意味着丢包了ttl:剩余的ttl;见TTL解释time: 响应时间,数值越小,连通速度越快;

4. 发出去的包数,返回的包数,丢包率,耗费时间;

5. 最小/最大/平均响应时间和本机硬件耗费时间;

TTL:每经过一个‘路由点‘,就把预先设定的这个TTL数值减1,直到最后TTL=1时报文就被扔掉,不向下转发。ping显示的TTL是指:被ping主机那里返回的报文,到了你这里,从它自己预设的TTL减小到还剩下多少。

mdev 往返时延

mdev是 Mean Deviation 的缩写, 表示 ICMP包的RTT(Round-Trip Time,往返时延)偏离平均值的程度, 主要用来衡量网速的稳定性。 mdev 的值越大说明 网速越不稳定。 另外,不同的操作系统的mdev的名字也有所不同, 在mac下它叫作 stddev, 而在 Windows 下则根本没有这个统计指标。

RTT参考值

场景

参考值

本机

0.001ms

同机房

0.1ms

同城

1ms

不同城

20ms

中国北方到南方

50ms

国内到国外

200ms

制定ping数据包的大小

默认ping命令的数据包大小是64Bytes,通过-s选项可以制定数据包的大小

范围:1Byte-65507Byte

linux监控watch网卡 linux监控网络io_运维_08

 补充:,如果以最大值去ping服务器,并且以多进程多终端的方式,可能会造成服务器响应迟缓,可以认为是一种网络攻击手段   

TTL 生成时间

TTL(Time to Live) ,即生存时间,指的是数据包被路由器丢弃之前允许通过的路由器的跳数,为了防止数据包在路由器之间无限转发,必须设置一个TTL值,每次路由器转发后都会将这个值减1,直到TTL的值为0,这个数据包的生命就被终结了.

补充:

通过TTL设定值我们可以找到某主机到某主机的最小跳跃次数,即路由转发次数,如下,可以看到我的主机到百度的最小跳至少是11,因为ttl为10是显示跳跃超限,说明数据包在传给百度服务器的路上已经死了

5.3 其他常用的网络相关命令

telnet

telnet是TCP/IP协议族的一员,是网络远程登录服务的标准协议,帮助用户在本地计算机上连接远程主机。

使用方式:telnet IP PORT

和ssh 的区别

端口区别:telnet是23 ssh是22

本质:telnet是明码传输,ssh是加密传输

nc

验证服务器端口有没有开放

nc是NetCat的简称,在网络调试工具中享有“瑞士军刀”的美誉,此命令功能丰富、短小精悍、简单实用,被设计成一款易用的网络工具,可通过TCP/LJDP传输数据。

参数

-l 用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接。

-p 暂未用到(老版本的nc可能需要在端口号前加-p参数,下面测试环境是centos6.6,nc版本是nc-1.84,未用到-p参数)

-s 指定发送数据的源IP地址,适用于多网卡机

-u 指定nc使用UDP协议,默认为TCP

-v 输出交互或出错信息,新手调试时尤为有用

-w 超时秒数,后面跟数字

常用示例

nc -l 9999 # 开启一个本地9999的TCP协议端口,由客户端主动发起连接,一旦连接必须由服务端发起关闭

nc -vw 2 114.215.169.66 9999 # 通过nc去访问129.204.197.215主机的11111端口,确认是否存活;可不加参数

nc -ul 9999 # 开启一个本地9999的UDP协议端口,客户端不需要由服务端主动发起关闭

nc 129.204.197.215 9999 < test # 通过129.204.197.215的9999TCP端口发送数据文件

nc -l 9999 > zabbix.file # 开启一个本地9999的TCP端口,用来接收文件内容

# 测试网速

A机器操作如下:

nc -l 9999 > /dev/null

# B机器开启数据传输

nc 129.204.197.215 9999 </dev/zero

# A机器进行网络监控

sar -n DEV 2 100000

在不熟悉公司的防火墙设置时,也可以通过监听端口来确定指定的端口是否被封。

mtr连通性测试

mtr命令是Linux系统中的网络连通性测试工具,也可以用来检测丢包率。

使用方式:mtr baidu.com

linux监控watch网卡 linux监控网络io_网络_09

其中的第2列为丢包率,可以用来判断网络中两台机器的连通质量。

模拟丢包:sudo tc qdisc add dev eth0 root netem loss 10%

云服务器选点:声网做音视频通话 节点选取测试

nslookup

这是一款检测网络中DNS服务器能否正确解析域名的工具命令,并且可以输出。

使用方式: nslookup sina.com

linux监控watch网卡 linux监控网络io_运维_10

从输出中可以看到,sina.com域名被正确解析到IP地址66.102.251.33

traceroute

traceroute可以提供从用户的主机到互联网另一端的主机的路径,虽然每次数据包由同一出发点到达同一目的地的路径可能会不一样,但通常来说大多数情况下路径是相同的。

使用方式:traceroute sina.com

在输出中记录按序列号从1开始,每个记录代表网络一跳,每跳一次表示经过一个网关或者路由;我们看到每行有三个个时间,单位是毫秒,指的是这一跳需要的时间。

iptraf强大的网络监控

iptraf是一个实时监控网络流量的交互式的彩色文本屏幕界面。它监控的数据比较全面,可以输出TCP连接、网络接口、协议、端口、网络包大小等信息,但是耗费的系统资源比较多,且需要管理员权限。

使用方式:sudo iptraf

在进入主界面之前可以选择不同的选项,在不同的选项下可以查看不同维度的网络信息。

tcpdump- 抓包,然后用wireshark分析

tcpdump是网络状况分析和跟踪工具,是可以用来抓包的实用命令,使用前需要对TCP/IP有所熟悉,因为过滤使用的信息都是TCP/IP格式。

Ubuntu安装:sudo apt-get install tcpdump

捕获及停止条件

n -D 列举所有网卡设备

n -i 选择网卡设备

n -c 抓取多少条报文

n --time-stamp-precision 指定捕获时的时间精度,默认微妙micro,可选纳秒nano

n -s 指定每条报文的最大字节数,默认262144字节

练习:

tcpdump 抓取各种报文

tcpdump -D 显示网卡设备

tcpdump -i eth0 抓取eth0的报文

tcpdump -i lo 抓取回环报文

tcpdump -i eth0 -c 2 抓取2条报文后退出

tcpdump -i eth0 -c 2 --time-stamp-precision=nano 默认按纳秒

telnet 127.0.0.1 80 可以通过telnet 上去测试抓包,此时应用抓取lo

表达式

原语:名称或数字,以及描述它的多个限定词组成

限定词:

Type:设置数字或者名称所指示类型,例如host www.baidu.com

Dir:设置网络出入方向,例如dst port 80

Proto: 指定协议类型,例如udp

原语运算:

与:&&或者and

或:||或者or

非:!或者not

例如:src or dst portrange 6000-8000 && tcp

练习:

tcpdump -i eth0 -c 10 host www.0voice.com and port 80

同时在另一个终端curl www.0voice.com

限定词

Type:设置数字或者名称所指示类型

host、port

net, 设定子网, net 192.168.0.0 mask 等价于net 192.168.0.0/24

portrange,设置端口范围,例如portrange 6000-8000

Dir:设置网络出入方向

src、dst、src or dst、src and dst

ra、ta、addr1、addr2、addr3、addr4(仅对IEEE 802.11 Wireless Lan有效)Proto**:指定协议类型**

ethr、fddi、tr、wlan、ip、ip6、arp、tcp、udp等

文件操作

-w 输出结果至文件

-C 限制输入文件的大小,超出以后缀1等数字的方式递增。注意单位是1,000,000字节

-W 指定输出文件的最大数量,到达后重新复写第一个文件

-G 指定每个N秒就重新输出至新文件,注意-w参数应基于strftime参数指定文件名

-r 读取一个抓包文件

-V 将待读取的多个文件名写入一个文件中,通过读取该文件同时读取多个文件

练习:

tcpdump -c 2 -w a 保存2个包到a文件

tcpdump -r a 读取a文件显示

tcpdump -c 2 -w b 保存2个包到b文件

strftime参考:

%a 星期几的简写

%A 星期几的全称

%b 月分的简写

%B 月份的全称

%c 标准的日期的时间串

%C 年份的后两位数字%d 十进制表示的每月的第几天

%D 月/天/年

%e 在两字符域中,十进制表示的每月的第几天

%F 年-月-日

%g 年份的后两位数字,使用基于周的年

%G 年分,使用基于周的年

%h 简写的月份名

%H 24小时制的小时

%I 12小时制的小时

%j 十进制表示的每年的第几天

%m 十进制表示的月份

%M 十时制表示的分钟数

%n 新行符

%p 本地的AM或PM的等价显示

%r 12小时的时间

%R 显示小时和分钟:hh:mm

%S 十进制的秒数

%t 水平制表符

%T 显示时分秒:hh:mm:ss

%u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)

%U 第年的第几周,把星期日做为第一天(值从0到53)

%V 每年的第几周,使用基于周的年

%w 十进制表示的星期几(值从0到6,星期天为0)

%W 每年的第几周,把星期一做为第一天(值从0到53)

%x 标准的日期串

%X 标准的时间串

%y 不带世纪的十进制年份(值从0到99)

%Y 带世纪部分的十进制年份

%z,%Z 时区名称,如果不能得到时区名称则返回空字符。

%% 百分号

输出时间格式

-t 不显示时间戳

-tt 自1970年1月1日0点至今的秒数

-ttt 显示邻近两行报文间经过的秒数-tttt 带日期的完整时间

-ttttt 自第一个抓取的报文起经历的秒数

练习

sudo tcpdump -c 5 -t

sudo tcpdump -c 5 -tt

sudo tcpdump -c 5 -ttt

sudo tcpdump -c 5 -tttt

sudo tcpdump -c 5 -ttttt

分析信息详情

-e 显示数据链路层头部

-q 不显示传输层信息

-v 显示网络层头部更多的信息,如TTL、id等

-n 显示IP地址、数字端口代替hostname等

-S TCP信息以绝对序列号代替相对序列号

-A 以ASCII方式显示报文内容,适用HTTP分析

-x 以16进制方式显示报文内容,不显示数据链路层

-xx 以16进制方式显示报文内容,显示数据链路层

-X 同时以16进制及ASCII方式显示报文内容,不显示数据链路层

-XX 同时以16进制及ASCII方式显示报文内容,显示数据链路层

练习

sudo tcpdump -r a -e

sudo tcpdump -r a -q

sudo tcpdump -r a -v

sudo tcpdump -r a -n

sudo tcpdump -r a -S

sudo tcpdump -r a -A

sudo tcpdump -r a -x

sudo tcpdump -r a -xx

sudo tcpdump -r a -X

sudo tcpdump -r a -XX

其他练习:

显示来源IP或者目的IP为192.168.1.102的网络通信:

sudo tcpdump -i eth0 host 192.168.1.102

显示去往102.168.1.102的所有会话信息:

tcpdump -i eth1 'dst 192.168.1.102 and (port 21 or 20)'

显示去往102.168.1.102的所有会话信息:

tcpdump -i eth0 'dst 192.168.1.102 and tcp and port 8080'

nmap

扫描某一主机打开的端口及端口提供的服务信息,通常用于查看本机有哪些端口对外提供服务,或者服务器有哪些端口对外开放。

使用方式:nmap -v -A localhost

比如我云服务器检测的结果:

nmap localhost #查看主机当前开放的端口

nmap -p 1024-65535 localhost #查看主机端口(1024-65535)中开放的端口

nmap -PS 192.168.56.101 #探测目标主机开放的端口

nmap -PS 22,80,3306 192.168.56.101 #探测所列出的目标主机端口

nmap -O 192.168.56.101 #探测目标主机操作系统类型

nmap -A 192.168.56.101 #探测目标主机操作系统类型

lsof

lsof是系统管理/安全的尤伯工具。将这个工具称之为lsof真实名副其实,因为它是指“列出打开文件(lists openfiles)”。而有一点要切记,在Unix中一切(包括网络套接口)都是文件。

查看帮助文档: lsof -h

你可以使用它来获得你系统上设备的信息,你能通过它了解到指定的用户在指定的地点正在碰什么东西,或者甚至是一个进程正在使用什么文件或网络连接。具体可以使用man lsof查看帮助文档。

关键选项

默认 : 没有选项,lsof列出活跃进程的所有打开文件

组合 : 可以将选项组合到一起,如-abc,但要当心哪些选项需要参数

-a : 结果进行“与”运算(而不是“或”)

-l : 在输出显示用户ID而不是用户名

-h : 获得帮助

-t : 仅获取进程ID

-U : 获取UNIX套接口地址

-F : 格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令

名、文件描述符、文件名,并以空终止)

lsof -i:9999

ethtool

虚拟机不要设置成静态的ip

ethtool用于查看网卡的配置情况。

sudo apt install ethtool

命令使用格式:ethtool [option] interface

查看网卡:ethtool ens33 # PS在云主机检测不到网卡信息

linux监控watch网卡 linux监控网络io_网络_11

范例

(1)查看网卡的接口信息

ethtool eth1 #查看网络接口eth1的信息

(2)关闭网卡eth1的自动协商

ethtool -s eth1 autoneg off

(3)修改网卡速率为 100Mb/s

ethtool -s eth4 speed 100

(4)查看网卡驱动信息

ethtool -i eth0

(5)查看网卡的一些工作统计信息

ethtool –S eth0

(6)停止和查看网卡的发送模块TX的状态

ethtool -A tx off eth0 #修改tx的状态

ethtool -a eth0 #查看tx的状态

(7)关闭网卡对收到的数据包的校验功能

ethtool -K rx off eth0 #关闭校验

ethtool –k eth0 #查看校验启动状态

获取网络信息

显示端口被某个程序占用

lsof -i:port

lsof -p 12 看进程号为12的进程打开了哪些文件

lsof -c abc 显示abc进程现在打开的文件,可以使用less进行分页,b 向后翻一页,d 向后翻半页