目录
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
C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂
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命令。
# -l 表示只显示监听套接字
# -t 表示只显示 TCP 套接字
# -n 表示显示数字地址和端口(而不是名字)
# -p 表示显示进程信息
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 查看协议栈的信息
这些协议栈的统计信息都很直观。
ss 只显示已经连接、关闭、孤儿套接字等简要统计,而 netstat 则提供的是更详细的网络协议栈信息。
上面 netstat 的输出示例,就展示了 TCP 协议的主动连接、被
动连接、失败重试、发送和接收的分段数量等各种信息
5.2.3 网络吞吐-sar命令
给 sar 增加 -n 参数就可以查看网络的统计信息,比如网络接口(DEV)、网络接口错误(EDEV)、TCP、UDP、ICMP 等等。执行下面的命令,你就可以得到网络接口统计信息:
输出指标含义
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。
从输出中可以看到网卡的读写速度和流量,在应急过程中可以用来判断服务器是否上量。
此命令除了可以用于查看网卡的信息,还可以用来收集如下服务的状态信息。
-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指定次数
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
补充:,如果以最大值去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
其中的第2列为丢包率,可以用来判断网络中两台机器的连通质量。
模拟丢包:sudo tc qdisc add dev eth0 root netem loss 10%
云服务器选点:声网做音视频通话 节点选取测试
nslookup
这是一款检测网络中DNS服务器能否正确解析域名的工具命令,并且可以输出。
使用方式: nslookup sina.com
从输出中可以看到,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在云主机检测不到网卡信息
范例
(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 向后翻半页