系统优化-网络-基础概念以及指标

前面我们讲了CPU、内存、磁盘IO,下面我们来看网络这部分,网络处理的流程最复杂,跟我们前面讲到的进程调度、中断处理、内存管理以及 I/O 等都密不可分。

OSI的网络七层模型,以及TCP/IP的四层or五层模型,如下:

avator

TCP/IP网络栈

有了linux根据tcp/ip模型,我们的网络栈的收发数据实际上就是按照这4层模型对数据层层进行处理,对上层发送发送来的数据进行分析,然后将本层的数据进行封装发给下层

  • 应用层–>数据
  • 传输层–>TCP头+数据
  • 网络层–>IP头+TCP头+数据
  • 网络接口层–>根据MTU切分数据包 and 帧头+IP头+TCP头+数据+栈帧

    下图是整个网络栈
    avator

TCP/IP的手法

接收网络包

  1. 网卡通过DMA获取网络数据,放到待接收队列
  2. 系统的硬中断程序通知系统接收网络数据,并且申请sk_buff,并且将数据放入到sk_buff中
  3. 通过系统的软中断开始处理网络数据
  4. 网络接口层校验包完整性,去掉帧头和帧尾,数据传递给网络层
  5. 网络层根据IP信息确定吓一跳是本机还是转发,如果是本机,数据传递给传输层
  6. 传输层解析TCP头,找到4元祖通过套接字发送给程序

发送网络包

和接收相反

  1. 程序通过系统内核调用套接字的sendMsg发送网络包
  2. 传输层封装TCP头信息,发送给IP层
  3. IP层根据IP找到吓一跳的地址封装IP头,传递给网络接口层
  4. 网络接口层根据MTU对包进行切分,添加帧头、帧尾等信息
  5. 拆分好的包进行物理寻址找到对应的MAC地址,之后将自己添加到待发送队列
  6. 系统的软中断通知系统有网络包待发送
  7. 之后网卡驱动会通过DMA,将待发送队列的数据通过网卡发送出去

如图:
avator

查看网络情况的基础指标和工具

查看网卡信息

ifconfig or ip

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.240.0.30 netmask 255.240.0.0 broadcast 10.255.255.255
inet6 fe80::20d:3aff:fe07:cf2a prefixlen 64 scopeid 0x20<link>
ether 78:0d:3a:07:cf:3a txqueuelen 1000 (Ethernet)
RX packets 40809142 bytes 9542369803 (9.5 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 32637401 bytes 4815573306 (4.8 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

$ ip -s addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 78:0d:3a:07:cf:3a brd ff:ff:ff:ff:ff:ff
inet 10.240.0.30/12 brd 10.255.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20d:3aff:fe07:cf2a/64 scope link
valid_lft forever preferred_lft forever
RX: bytes packets errors dropped overrun mcast
9542432350 40809397 0 0 0 193
TX: bytes packets errors dropped carrier collsns
4815625265 32637658 0 0 0 0
  1. 网络接口的状态标志。ifconfig 输出中的 RUNNING ,或 ip 输出中的 LOWER_UP ,都表示物理网络是连通的,即网卡已经连接到了交换机或者路由器中。如果你看不到它们,通常表示网线被拔掉了。
  2. MTU 的大小。MTU 默认大小是 1500,根据网络架构的不同(比如是否使用了 VXLAN 等叠加网络),你可能需要调大或者调小 MTU 的数值。
  3. 网络接口的 IP 地址、子网以及 MAC 地址。这些都是保障网络功能正常工作所必需的,你需要确保配置正确。
  4. 网络收发的字节数、包数、错误数以及丢包情况,特别是 TX 和 RX 部分的 errors、dropped、overruns、carrier 以及 collisions 等指标不为 0 时,通常表示出现了网络 I/O 问题。其中:
    • errors 表示发生错误的数据包数,比如校验错误、帧同步错误等;
    • dropped 表示丢弃的数据包数,即数据包已经收到了 Ring Buffer,但因为内存不足等原因丢包;
    • overruns 表示超限数据包数,即网络 I/O 速度过快,导致 Ring Buffer 中的数据包来不及处理(队列满)而导致的丢包;
    • carrier 表示发生 carrirer 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等;
    • collisions 表示碰撞数据包数。

查看套接字信息

netstat or ss

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# head -n 3 表示只显示前面3行
# -l 表示只显示监听套接字
# -n 表示显示数字地址和端口(而不是名字)
# -p 表示显示进程信息
$ netstat -nlp | head -n 3
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 840/systemd-resolve

# -l 表示只显示监听套接字
# -t 表示只显示 TCP 套接字
# -n 表示显示数字地址和端口(而不是名字)
# -p 表示显示进程信息
$ ss -ltnp | head -n 3
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=840,fd=13))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1459,fd=3))
  • 当套接字处于连接状态(Established)时,
    • Recv-Q 表示套接字缓冲还没有被应用程序取走的字节数(即接收队列长度)。
    • Send-Q 表示还没有被远端主机确认的字节数(即发送队列长度)。
  • 当套接字处于监听状态(Listening)时,
    • Recv-Q 表示全连接队列的长度。
    • Send-Q 表示全连接队列的最大长度。

统计协议栈信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

$ netstat -s
...
Tcp:
3244906 active connection openings
23143 passive connection openings
115732 failed connection attempts
2964 connection resets received
1 connections established
13025010 segments received
17606946 segments sent out
44438 segments retransmitted
42 bad segments received
5315 resets sent
InCsumErrors: 42
...

$ ss -s
Total: 186 (kernel 1446)
TCP: 4 (estab 1, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0

Transport Total IP IPv6
* 1446 - -
RAW 2 1 1
UDP 2 2 0
TCP 4 3 1
...

查看网络的吞吐等指标

sar

1
2
3
4
5
6
7
8
# 数字1表示每隔1秒输出一组数据
$ sar -n DEV 1
Linux 4.15.0-1035-azure (ubuntu) 01/06/19 _x86_64_ (2 CPU)

13:21:40 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
13:21:41 eth0 18.00 20.00 5.79 4.25 0.00 0.00 0.00 0.00
13:21:41 docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
13:21:41 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

连通性和RTT

ping

1
2
3
4
5
6
7
8
9
10
11

# -c3表示发送三次ICMP包后停止
$ ping -c3 114.114.114.114
PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data.
64 bytes from 114.114.114.114: icmp_seq=1 ttl=54 time=244 ms
64 bytes from 114.114.114.114: icmp_seq=2 ttl=47 time=244 ms
64 bytes from 114.114.114.114: icmp_seq=3 ttl=67 time=244 ms

--- 114.114.114.114 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 244.023/244.070/244.105/0.034 ms