Linux网路合同栈是按照TCP/IP模型来实现的,TCP/IP模型由应用层、传输层、网络层和网路插口层redhat linux,共四层组成,每一层都有各自的职责。
应用程序要发送数据包时,一般是通过socket插口,于是才会发生调用,把应用层的数据拷贝到内核里的socket层,接着由网路合同栈从上到下逐层处理后,最后才能送到网卡发送出去。
而对于接收网路包时,同样也要经过网路合同逐层处理,不过处理的方向与发送数据时是相反的,也就是从下到上的逐层处理,最后才送到应用程序。
网路的速率常常跟用户体验是挂钩的,那我们又该用哪些指标来评判Linux的网路性能呢?以及怎样剖析网路问题呢?
性能指标有什么?
一般是以4个指标来评判网路的性能,分别是带宽、延时、吞吐率、PPS(PacketPerSecond),它们表示的意义如下:
其实,不仅以上这四种基本的指标linux查看网络带宽,还有一些其他常用的性能指标,例如:
你可能会问了,怎么观测这种性能指标呢?不急,继续往下看。
网路配置怎么看?
要想晓得网路的配置和状态,我们可以使用ifconfig或则ip来查看。
这两个功能都差不多,不过它们属于不同的软件包,ifconfig属于net-tools软件包,ip属于iproute2软件包,我的印象中net-tools软件包没有人继续维护了,而iproute2软件包是有开发者仍然在维护,所以更推荐你使用ip工具。
学因而用,那就来使用这两个,来查看网口eth0的配置等信息:
其实这两个命令输出的格式不尽相同,并且输出的内容基本相同,例如都包含了IP地址、子网网段、MAC地址、网关地址、MTU大小、网口的状态以及网路包收发的统计信息,下边就来谈谈这种信息,它们都与网路性能有一定的关系。
第一,网口的联接状态标志。虽然也就是表示对应的网口是否联接到交换机或路由器等设备,假如ifconfig输出中看见有RUNNING,或则ip输出中有LOWER_UP,则说明化学网路是连通的,假如看不到linux多线程,则表示网口没有接网线。
第二,MTU大小。默认值是1500字节,其作用主要是限制网路包的大小,假若IP层有一个数据报要传,但是网路包的宽度比链路层的MTU还大,这么IP层就须要进行分片,即把数据报分成若干片,这样每一片就都大于MTU。事实上,每位网路的链路层MTU可能会不一样,所以你可能须要调大或则调小MTU的数值。
第三,网口的IP地址、子网网段、MAC地址、网关地址。这种信息必需要配置正确,网路功能能够正常工作。
第四,网路包收发的统计信息。一般有网路收发的字节数、包数、错误数以及丢包情况的信息,假如TX(发送)和RX(接收)部份中errors、dropped、overruns、carrier以及collisions等指标不为0时,则说明网路发送或则接收出问题了,这种出错统计信息的指标意义如下:
ifconfig和ip命令只显示的是网口的配置以及收发数据包的统计信息,而看不到合同栈里的信息,那接出来就来瞧瞧怎样查看合同栈里的信息。
socket信息怎样查看?
我们可以使用netstat或则ss,这两个命令查看socket、网络合同栈、网口以及路由表的信息。
尽管netstat与ss命令查看的信息都差不多,而且假如在生产环境中要查看这类信息的时侯,尽量不要使用netstat命令,由于它的性能不好,在系统比较忙碌的情况下,假如频繁使用netstat命令则会对性能的开支雪上加霜,所以更推荐你使用性能更好的ss命令。
从下边这张图,你可以听到这两个命令的输出内容:
可以发觉,输出的内容都差不多,例如都包含了socket的状态(State)、接收队列(Recv-Q)、发送队列(Send-Q)、本地地址(LocalAddress)、远端地址(ForeignAddress)、进程PID和进程名称(PID/Programname)等。
接收队列(Recv-Q)和发送队列(Send-Q)比较特殊,在不同的socket状态。它们表示的含意是不同的。
当socket状态处于Established时:
而当socket状态处于Listen时:
在TCP三次握手过程中,当服务器收到顾客端的SYN包后,内核会把该联接储存到半联接队列,之后再向顾客端发送SYN+ACK包,接着顾客端会返回ACK,服务端收到第三次握手的ACK后,内核会把联接从半联接队列移除,之后创建新的完全的联接,并将其降低到全联接队列,等待进程调用accept()函数时把联接取下来。
也就说,全联接队列指的是服务器与顾客端完了TCP三次握手后,还没有被accept()系统调用拿走联接的队列。
那对于合同栈的统计信息,仍然还是使用netstat或ss,它们查看统计信息的命令如下:
ss命令输出的统计信息相比netsat比较少,ss只显示早已联接(estab)、关闭(closed)、孤儿(orphaned)socket等简略统计。
而netstat则有更详尽的网路合同栈信息,例如里面显示了TCP合同的主动联接(activeconnectionsopenings)、被动联接(passiveconnectionopenings)、失败重试(failedconnectionattempts)、发送(segmentssendout)和接收(segmentsreceived)的分段数目等各类信息。
网路吞吐率和PPS怎么查看?
可以使用sar命令当前网路的吞吐率和PPS,用法是给sar降低-n参数就可以查看网路的统计信息,例如
例如,我通过sar命令获取了网口的统计信息:
它们的涵义:
对于带宽,我们可以使用ethtool命令来查询,它的单位一般是Gb/s或则Mb/s,不过注意这儿大写字母b,表示比特而不是字节。我们一般提及的万兆网卡、万兆网卡等,单位也都是比特(bit)。如下你可以看见,eth0网卡就是一个百兆网卡:
$ ethtool eth0 | grep Speed
Speed: 1000Mb/s
连通性和延时怎么查看?
要测试本机与远程主机的连通性和延时,一般是使用ping命令,它是基于ICMP合同的,工作在网路层。
例如,假若要测试本机到192.168.12.20IP地址的连通性和延时:
显示的内容主要包含icmp_seq(ICMP序列号)、TTL(生存时间linux查看网络带宽,或则跳数)以及time(往返延时),但是最后会汇总本次测试的情况,若果网路没有丢包,packetloss的比率就是0。
不过,须要注意的是,ping不通服务器并不代表HTTP恳求也不通,由于有的服务器的防火墙是会禁用ICMP合同的。
工具总结
性能指标
工具
说明
吞吐量(BPS)
sar
nethogs
iftop
分别可以查看网路插口、进程以及IP地址的网路吞吐量
PPS
sar
/proc/net/dev
查看网路插口的PPS
联接数
netstat
ss
查看网路联接数
延后
ping
hping3
通过ICMP、TCP等测试网路延后
联接跟踪数
conntrack
查看和管理联接跟踪状况
路由
mtr
route
traceroute
查看路由并测试链路信息
DNS
dig
nslookup
排查DNS解析问题
防火墙和NAT
iptables
配置和管理防火墙及NAT规则
网卡功能
ethtool
查看和配置网路插口的功能
抓包
tcpdump
wireshark
ngrep
抓包剖析网路流量
内核合同栈跟踪
bcc
systemtap
动态跟踪内核合同栈的行为
本文原创地址://q13zd.cn/lwlxyzdxnzbf.html编辑:刘遄,审核员:暂无