网络性能指标

通常是以 4 个指标来衡量网络的性能,分别是带宽、延时、吞吐率、PPS,它们表示的含义如下:

  • 带宽,表示链路的最大传输速率,单位是b/s,带宽越大,其传输能力越强

  • 延时,表示请求数据包发送后,收到对端响应,所需的时间延时,不同的场景有不同的含义,比如可以表示建立 TCP 连接所需的时间延迟,或一个数据包往返所需的时间延迟。

  • 吞吐率,表示单位时间内成功传输的数据量,单位是 b/s(比特 / 秒)或者 B/s(字节 / 秒),吞吐受带宽限制,带宽越大,吞吐率的上限才可能越高。

  • PPS,全称是 Packet Per Second(包 / 秒),表示以网络包为单位的传输速率,一般用来评估系统对于网络的转发能力。 除了以上这四种基本的指标,还有一些其他常用的性能指标,比如:

  • 网络的可用性,表示网络能否正常通信;

  • 并发连接数,表示 TCP 连接数量;

  • 丢包率,表示所丢失数据包数量占所发送数据组的比率;

  • 重传率,表示重传网络包的比例;

查看网络配置

ip 命令是 ifconfig 的现代替代品,功能更强大。它属于 iproute2 工具包。

# 查看网络接口信息
ip addr show
# 查看eth0网卡信息
ip addr show eth0
# 查看路由和默认网关信息
ip route show
# 查看arp 条目
ip -s neigh
# 查看网络统计
ip -s link

第一,网口的连接状态标志。其实也就是表示对应的网口是否连接到交换机或路由器等设备,如果 ifconfig 输出中看到有 RUNNING,或者 ip 输出中有 LOWER_UP,则说明物理网络是连通的,如果看不到,则表示网口没有接网线。 第二,MTU 大小。默认值是 1500 字节,其作用主要是限制网络包的大小,如果 IP 层有一个数据报要传,而且网络包的长度比链路层的 MTU 还大,那么 IP 层就需要进行分片,即把数据报分成若干片,这样每一片就都小于 MTU。事实上,每个网络的链路层 MTU 可能会不一样,所以你可能需要调大或者调小 MTU 的数值。 第三,网口的 IP 地址、子网掩码、MAC 地址、网关地址。这些信息必须要配置正确,网络功能才能正常工作。 第四,网络包收发的统计信息。通常有网络收发的字节数、包数、错误数以及丢包情况的信息,如果 TX(发送) 和 RX(接收)部分中errors、dropped、overruns、carrier 以及 collisions 等指标不为 0 时则说明网络发送或者接收出问题了,这些出错统计信息的指标意义如下:

  • errors 表示发生错误的数据包数,比如校验错误、帧同步错误等;

  • dropped 表示丢弃的数据包数,即数据包已经收到了 Ring Buffer(这个缓冲区是在内核内存中,更具体一点是在网卡驱动程序里),但因为系统内存不足等原因而发生的丢包;

  • overruns 表示超限数据包数,即网络接收/发送速度过快,导致 Ring Buffer 中的数据包来不及处理,而导致的丢包,因为过多的数据包挤压在 Ring Buffer,这样 Ring Buffer 很容易就溢出了;

  • carrirer 表示发生 carrirer 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等

  • collisions 表示冲突、碰撞数据包数 ip 命令只显示的是网口的配置以及收发数据包的统计信息,而看不到协议栈里的信息

查看协议栈信息

ip 命令只显示的是网口的配置以及收发数据包的统计信息,而看不到协议栈里的信息

ss -atnlp
  • -a 表示显示所有连接;

  • -n 表示显示 IP 地址和端口号,而不显示域名和服务名;

  • -l 表示只显示监听的套接字;

  • -p 表示显示进程的 PID 和名字。

  • -t 表示显示 TCP 套接字;

  • -u 表示显示 UDP 套接字。 输出的内容都差不多, 比如都包含了 socket 的状态(State)、接收队列(Recv-Q)、发送队列(Send-Q)、本地地址(Local Address)、远端地址(Foreign Address)、进程 PID 和进程名称(PID/Program name)等。 接收队列(Recv-Q)和发送队列(Send-Q)比较特殊,在不同的 socket 状态。它们表示的含义是不同的。 当 socket 状态处于 Established时:

  • Recv-Q 表示 socket 缓冲区中还没有被应用程序读取的字节数;

  • Send-Q 表示 socket 缓冲区中还没有被远端主机确认的字节数; 当 socket 状态处于 Listen 时:

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

  • Send-Q 表示全连接队列的最大长度; 在 TCP 三次握手过程中,当服务器收到客户端的 SYN 包后,内核会把该连接存储到半连接队列,然后再向客户端发送 SYN+ACK 包,接着客户端会返回 ACK,服务端收到第三次握手的 ACK 后,内核会把连接从半连接队列移除,然后创建新的完全的连接,并将其增加到全连接队列 ,等待进程调用 accept() 函数时把连接取出来。 TCP连接队列 也就说,全连接队列指的是服务器与客户端完了 TCP 三次握手后,还没有被 accept() 系统调用取走连接的队列。 使用ss -s来统计协议栈的信息 ss 命令输出的统计信息相比 netsat 比较少,ss 只显示已经连接(estab)、关闭(closed)、孤儿(orphaned) socket 等简要统计。而 netstat 则有更详细的网络协议栈信息,比如上面显示了 TCP 协议的主动连接(active connectionsopenings)、被动连接(passive connection openings)、失败重试(failed connection attempts)、发送(segments send out)和接收(segments received)的分段数量等各种信息。

网络吞吐率&PPS

吞吐率指的是单位时间内收发的数据量,而pps是单位时间内收发的数据包 可以使用 sar(System Activity Reporter ) 命令当前网络的吞吐率和 PPS,用法是给 sar 增加 -n 参数就可以查看网络的统计信息,比如:

  • sar -n DEV,显示网口的统计数据;

  • sar -n EDEV,显示关于网络错误的统计数据;

  • sar -n TCP,显示 TCP 的统计数据 在输出的结果中:

  • rxpck/s 和 txpck/s 分别是接收和发送的 PPS,单位为包 / 秒(Packets received per second|Packets transmitted per second)

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

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

带宽

ethtool eth0 | grep Speed

连通性和延时

要测试本机与远程主机的连通性和延时,通常是使用 ping 命令,它是基于 ICMP 协议的,工作在网络层。

ping -c 4 www.baidu.com

显示的内容主要包含 icmp_seq(ICMP 序列号)、TTL(生存时间,或者跳数)以及 time (往返延时),而且最后会汇总本次测试的情况,如果网络没有丢包,packet loss 的百分比就是 0。 ping不通服务器并不代表 HTTP 请求也不通,因为有的服务器的防火墙是会禁用ICMP 协议的。