文章目录
1.简介
Linux 网络协议栈是根据 TCP/IP 模型来实现的,TCP/IP 模型由应用层
、传输层
、网络层
和网络接口层
,共四层组成,每一层都有各自的职责。
2.用什么指标来衡量 Linux 的网络性能和分析网络问题?
主要以下四点: 带宽
、延时
、吞吐率
、PPS(Packet Per Second)
2.1 带宽
表示链路的最大传输速率,单位是 b/s (比特 / 秒),带宽越大,其传输能力就越强。
2.2 延时
表示请求数据包发送后,收到对端响应,所需要的时间延迟。不同的场景有着不同的含义,比如可以表示建立 TCP 连接所需的时间延迟,或一个数据包往返所需的时间延迟。
2.3 吞吐率
表示单位时间内成功传输的数据量,单位是 b/s(比特 / 秒)或者 B/s(字节 / 秒),吞吐受带宽限制,带宽越大,吞吐率的上限才可能越高。
2.4 PPS
全称是 Packet Per Second(包 / 秒),表示以网络包为单位的传输速率,一般用来评估系统对于网络的转发能力。
3.网络配置如何看?
可以使用 ifconfig
或者 ip
命令来查看
这两个命令功能都差不多,不过它们属于不同的软件包
ifconfig 属于 net-tools
软件包,ip 属于 iproute2
软件包
3.1 ifconfig
[root@Centos-root473791 ~]# ifconfig
docker0 Link encap:Ethernet HWaddr 56:84:7A:FE:97:99
inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
eth0 Link encap:Ethernet HWaddr 00:0C:29:A0:43:C8
inet addr:192.168.2.133 Bcast:192.168.2.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fea0:43c8/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:74 errors:0 dropped:0 overruns:0 frame:0
TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7926 (7.7 KiB) TX bytes:1632 (1.5 KiB)
eth1 Link encap:Ethernet HWaddr 00:0C:29:A0:43:D2
inet addr:192.168.72.132 Bcast:192.168.72.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fea0:43d2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1778 errors:0 dropped:0 overruns:0 frame:0
TX packets:2564 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:139914 (136.6 KiB) TX bytes:321221 (313.6 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:1 errors:0 dropped:0 overruns:0 frame:0
TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:103 (103.0 b) TX bytes:103 (103.0 b)
3.2 ip命令
[root@Centos-root473791 ~]# ip -s addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:a0:43:c8 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.133/24 brd 192.168.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fea0:43c8/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:a0:43:d2 brd ff:ff:ff:ff:ff:ff
inet 192.168.72.132/24 brd 192.168.72.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fea0:43d2/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
虽然这两个命令输出的格式不尽相同,但是输出的内容基本相同,比如都包含了 IP 地址、子网掩码、MAC 地址、网关地址、MTU 大小、网口的状态以及网路包收发的统计信息;
第一,网口的连接状态标志。其实也就是表示对应的网口是否连接到交换机或路由器等设备,如果 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 很容易就溢出了;
carrier 表示发生 carrirer 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等;
collisions 表示冲突、碰撞数据包数;
ifconfig 和 ip 命令只显示的是网口的配置以及收发数据包的统计信息,而看不到协议栈里的信息
4.查看协议栈信息—查看Socket信息?
可以使用 netstat
或者 ss
查看
这两个命令查看 socket、网络协议栈、网口以及路由表的信息。
netstat 与 ss 命令查看的信息都差不多,但是如果在生产环境中要查看这类信息的时候,尽量不要使用 netstat 命令,因为它的性能不好,在系统比较繁忙的情况下,如果频繁使用 netstat 命令则会对性能的开销雪上加霜,所以更推荐你使用性能更好的 ss 命令。
4.1 netstat命令
# -n 代表不显示名字,而是以数字方式显示 ip 和端口
# -l 代表只显示LISTEN 状态的socket
# -p 代表显示进程信息
[root@Centos-root473791 ~]# netstat -nlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1775/sshd
4.2 ss命令
# -t 代表只显示tcp连接
# -n 代表不显示名字,而是以数字方式显示 ip 和端口
# -l 代表只显示LISTEN 状态的socket
# -p 代表显示进程信息
[root@Centos-root473791 ~]# ss -nlpt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 :::22 :::* users:(("sshd",1775,4))
LISTEN 0 128 *:22 *:*
- State: socket 的状态
- Recv-Q:接收队列
- Send-Q:发送队列
- Local Address:本地地址
- Foreign Address/Peer Address:远端/对方地址
- PID/Program name:进程 PID 和进程名称
5.查看协议栈信息—统计信息?
对于协议栈的统计信息,还是使用netstat 和 ss查看
5.1 netstat命令
[root@Centos-root473791 ~]# netstat -s
Tcp:
0 active connections openings
1 passive connection openings
0 failed connection attempts
0 connection resets received
1 connections established
33813 segments received
52819 segments send out
3 segments retransmited
0 bad segments received.
0 resets sent
- active connections openings :主动连接
- passive connection openings:被动连接
- failed connection attempts: 失败重试
- segments send out: 发送
- segments received:接收
5.2 ss命令
[root@Centos-root473791 ~]# ss -s
Total: 481 (kernel 511)
TCP: 10 (estab 1, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0
Transport Total IP IPv6
* 511 - -
RAW 0 0 0
UDP 10 7 3
TCP 10 5 5
INET 20 12 8
FRAG 0 0 0
- estab:已经连接
- closed:关闭连接
- orphaned:孤儿连接
6.网络吞吐率和 PPS 如何查看?
可以使用 sar 命令当前网络的吞吐率和 PPS,用法是给 sar
增加 -n 参数就可以查看网络的统计信息,比如
sar -n DEV,显示网口的统计数据;
sar -n EDEV,显示关于网络错误的统计数据;
sar -n TCP,显示 TCP 的统计数据
通过 sar 命令获取了网口的统计信息 sar -n DEV
# 1 代表每隔一秒输出一组数据
[root@Centos-root473791 ~]# sar -n DEV 1
Linux 4.4.241-1.el6.elrepo.x86_64 (Centos-root473791) 03/06/2021 _x86_64_ (4 CPU)
10:58:21 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
10:58:22 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
10:58:22 AM eth1 15.00 22.00 1.08 2.14 0.00 0.00 0.00
-
rxpck/s 和 txpck/s 分别是接收和发送的 PPS,单位为包 / 秒。
-
rxkB/s 和 txkB/s 分别是接收和发送的吞吐率,单位是 KB/ 秒。
-
rxcmp/s 和 txcmp/s 分别是接收和发送的压缩数据包数,单位是包 / 秒。
7.带宽如何查看? ethtool eth0 | grep Speed
[root@Centos-root473791 ~]# ethtool eth0 | grep Speed
Speed: 1000Mb/s
可以使用 ethtool 命令来查询,它的单位通常是 Gb/s 或者 Mb/s,不过注意这里小写字母 b ,表示比特而不是字节。我们通常提到的千兆网卡、万兆网卡等,单位也都是比特(bit)。如下你可以看到, eth0 网卡就是一个千兆网卡
8. 连通性和延时如何查看?
要测试本机与远程主机的连通性和延时,通常是使用 ping 命令,它是基于 ICMP
协议的,工作在网络层。
# -c 代表次数
[root@Centos-root473791 ~]# ping www.baidu.com -c 5
PING www.a.shifen.com (180.101.49.12) 56(84) bytes of data.
64 bytes from 180.101.49.12: icmp_seq=1 ttl=128 time=17.9 ms
64 bytes from 180.101.49.12: icmp_seq=2 ttl=128 time=11.8 ms
64 bytes from 180.101.49.12: icmp_seq=3 ttl=128 time=12.9 ms
64 bytes from 180.101.49.12: icmp_seq=4 ttl=128 time=21.1 ms
64 bytes from 180.101.49.12: icmp_seq=5 ttl=128 time=21.0 ms
--- www.a.shifen.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4028ms
rtt min/avg/max/mdev = 11.806/16.987/21.146/3.955 ms
[root@Centos-root473791 ~]#
显示的内容主要包含 icmp_seq(ICMP 序列号)、TTL(生存时间,或者跳数)以及 time (往返延时),而且最后会汇总本次测试的情况,如果网络没有丢包,packet loss 的百分比就是 0
。
不过,需要注意的是,ping 不通服务器并不代表 HTTP 请求也不通,因为有的服务器的防火墙是会禁用 ICMP 协议的。