一文读懂如何查看网络的性能指标
Linux网络协议栈是根据TCP/IP模型来实现的,TCP/IP模型由应用层、传输层、网络层和网络接口层,共四层组成,每一层都有各自的职责。应用程序要发送数据包时,通常是通过socket接口,于是就会发生系统调用,把应用层的数据拷贝到内核里的socket层,接着由网络协议栈从上到下逐层处理后,最后才会送到网卡发送出去。
而对于接收网络包时,同样也要经过网络协议逐层处理,不过处理的方向与发送数据时是相反的,也就是从下到上的逐层处理,最后才送到应用程序。
网络的速度往往跟用户体验是挂钩的,那我们又该用什么指标来衡量Linux的网络性能呢?以及如何分析网络问题呢?
性能指标有哪些?
通常是以4个指标来衡量网络的性能,分别是带宽、延时、吞吐率、PPS(PacketPerSecond),它们表示的意义如下:
带宽,表示链路的最大传输速率,单位是b/s(比特/秒),带宽越大,其传输能力就越强。延时,表示请求数据包发送后,收到对端响应,所需要的时间延迟。不同的场景有着不同的含义,比如可以表示建立TCP连接所需的时间延迟,或一个数据包往返所需的时间延迟。吞吐率,表示单位时间内成功传输的数据量,单位是b/s(比特/秒)或者B/s(字节/秒),吞吐受带宽限制,带宽越大,吞吐率的上限才可能越高。PPS,全称是PacketPerSecond(包/秒),表示以网络包为单位的传输速率,一般用来评估系统对于网络的转发能力。
当然,除了以上这四种基本的指标,还有一些其他常用的性能指标,比如:
网络的可用性,表示网络能否正常通信;并发连接数,表示TCP连接数量;丢包率,表示所丢失数据包数量占所发送数据组的比率;重传率,表示重传网络包的比例;
你可能会问了,如何观测这些性能指标呢?不急,继续往下看。
网络配置如何看?
要想知道网络的配置和状态,我们可以使用ifconfig或者ip命令来查看。
这两个命令功能都差不多,不过它们属于不同的软件包,ifconfig属于net-tools软件包,ip属于iproute2软件包,我的印象中net-tools软件包没有人继续维护了,而iproute2软件包是有开发者依然在维护,所以更推荐你使用ip工具。
学以致用,那就来使用这两个命令,来查看网口eth0的配置等信息:
虽然这两个命令输出的格式不尽相同,但是输出的内容基本相同,比如都包含了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表示丢弃的数据包数,即数据包已经收到了RingBuffer(这个缓冲区是在内核内存中,更具体一点是在网卡驱动程序里),但因为系统内存不足等原因而发生的丢包;overruns表示超限数据包数,即网络接收/发送速度过快,导致RingBuffer中的数据包来不及处理,而导致的丢包,因为过多的数据包挤压在RingBuffer,这样RingBuffer很容易就溢出了;carrier表示发生carrirer错误的数据包数,比如双工模式不匹配、物理电缆出现问题等;collisions表示冲突、碰撞数据包数;
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时:
Recv-Q表示socket缓冲区中还没有被应用程序读取的字节数;Send-Q表示socket缓冲区中还没有被远端主机确认的字节数;
而当socket状态处于Listen时:
Recv-Q表示全连接队列的长度;Send-Q表示全连接队列的最大长度;
在TCP三次握手过程中,当服务器收到客户端的SYN包后,内核会把该连接存储到半连接队列,然后再向客户端发送SYNACK包,接着客户端会返回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-nDEV,显示网口的统计数据;sar-nEDEV,显示关于网络错误的统计数据;sar-nTCP,显示TCP的统计数据
比如,我通过sar命令获取了网口的统计信息:
它们的含义:
rxpck/s和txpck/s分别是接收和发送的PPS,单位为包/秒。rxkB/s和txkB/s分别是接收和发送的吞吐率,单位是KB/秒。rxcmp/s和txcmp/s分别是接收和发送的压缩数据包数,单位是包/秒。
对于带宽,我们可以使用ethtool命令来查询,它的单位通常是Gb/s或者Mb/s,不过注意这里小写字母b,表示比特而不是字节。我们通常提到的千兆网卡、万兆网卡等,单位也都是比特(bit)。如下你可以看到,eth0网卡就是一个千兆网卡:
$ethtooleth0|grepSpeedSpeed:1000Mb/s连通性和延时如何查看?要测试本机与远程主机的连通性和延时,通常是使用ping命令,它是基于ICMP协议的,工作在网络层。
比如,如果要测试本机到192.168.12.20IP地址的连通性和延时:
显示的内容主要包含icmp_seq(ICMP序列号)、TTL(生存时间,或者跳数)以及time(往返延时),而且最后会汇总本次测试的情况,如果网络没有丢包,packetloss的百分比就是0。
不过,需要注意的是,ping不通服务器并不代表HTTP请求也不通,因为有的服务器的防火墙是会禁用ICMP协议的。
工具总结
性能指标
工具
说明
吞吐量(BPS)
sarnethogsiftop
分别可以查看网络接口、进程以及IP地址的网络吞吐量
PPS
sar/proc/net/dev
查看网络接口的PPS
连接数
netstatss
查看网络连接数
延迟
pinghping3
通过ICMP、TCP等测试网络延迟
连接跟踪数
conntrack
查看和管理连接跟踪状况
路由
mtrroutetraceroute
查看路由并测试链路信息
DNS
dignslookup
排查DNS解析问题
防火墙和NAT
iptables
配置和管理防火墙及NAT规则
网卡功能
ethtool
查看和配置网络接口的功能
抓包
tcpdumpwireshark
ngrep
抓包分析网络流量
内核协议栈跟踪
bccsystemtap
动态跟踪内核协议栈的行为
绛旓細閫氬父鏄互4涓寚鏍囨潵琛¢噺缃戠粶鐨勬ц兘,鍒嗗埆鏄甫瀹姐佸欢鏃躲佸悶鍚愮巼銆丳PS(PacketPerSecond),瀹冧滑琛ㄧず鐨勬剰涔夊涓:甯﹀,琛ㄧず閾捐矾鐨勬渶澶т紶杈撻熺巼,鍗曚綅鏄痓/s(姣旂壒/绉),甯﹀瓒婂ぇ,鍏朵紶杈撹兘鍔涘氨瓒婂己銆傚欢鏃,琛ㄧず璇锋眰鏁版嵁鍖呭彂閫佸悗,鏀跺埌瀵圭鍝嶅簲,鎵闇瑕佺殑鏃堕棿寤惰繜銆備笉鍚岀殑鍦烘櫙鏈夌潃涓嶅悓鐨勫惈涔,姣斿鍙互琛ㄧず寤虹珛TCP杩炴帴鎵闇鐨勬椂闂...
绛旓細1銆CPU浣跨敤鐜囷細鍏抽敭鐩戞帶鎸囨爣CPU浣跨敤鐜囨槸琛¢噺绯荤粺璐熻浇鐨勫熀鐭筹紝瀹冭〃绀虹▼搴忓崰鐢ㄧ殑澶勭悊鍣ㄨ祫婧愩傝绠楀叕寮忎负锛欳PU浣跨敤鐜 = 1 - CPU绌洪棽鏃堕棿/鎬籆PU鏃堕棿銆傚湪鎬ц兘娴嬭瘯涓紝褰撶敤鎴锋侊紙绋嬪簭杩愯鏃堕棿鍗犳瘮锛夊拰绯荤粺鎬侊紙鍐呮牳澶勭悊鏃堕棿鍗犳瘮锛夋诲拰瓒呰繃50%锛屽氨闇璀︽儠娼滃湪鎬ц兘鐡堕銆傜敤鎴锋侊細楂樺兼彁绀虹▼搴忓鐞嗘椂闂磋繃闀匡紝闇浼...
绛旓細SNA鐞嗚鐨勭簿楂撳湪浜庣悊瑙缃戠粶涓釜浣撲笌涓綋涔嬮棿鐨勫叧绯伙紝閫氳繃鑺傜偣銆佽竟鍜岀浉鍏鎸囨爣锛屾彮绀哄鏉傜ぞ浼氱粨鏋勩傝妭鐐圭殑閲嶈鎬у苟闈炰粎鐢卞害鍐冲畾锛孖GEvector Centrality鑰冭檻浜嗚妭鐐瑰害鍜岀浉閭昏妭鐐圭殑褰卞搷鍔涳紝鑰孒ITS绠楁硶鍒欏皢鑺傜偣鍒嗕负Hub锛堝叧閿妭鐐癸級鍜孉uthority锛堟潈濞佽妭鐐癸級锛孭ageRank鍒欏熀浜庣綉椤甸棿鐨勮烦杞矾寰勬彮绀鸿妭鐐圭殑鏍稿績鍦颁綅銆傚崐灞閮...
绛旓細纾佺洏I/O鐨勬ц兘鎸囨爣骞堕潪瀛ょ珛瀛樺湪锛屽瑙嗛缂栬緫鍜孷OD搴旂敤鏇鐪閲嶆暟鎹悶鍚愰噺鍜孖OPS锛岃屾満姊扮‖鐩樼殑鎬ц兘鍒欏彈闄愪簬瀵婚亾鏃堕棿銆佹棆杞欢杩熷拰鏁版嵁浼犺緭鏃堕棿銆傜悊璁轰笂鐨勬渶澶OPS鍊间笌纭洏杞熺揣瀵嗙浉鍏筹紝渚嬪锛15000 rpm鐨勭‖鐩樿兘杈惧埌鎯婁汉鐨166 IOPS銆傚悓鏃讹紝I/O璐熻浇銆佺郴缁熼厤缃佹搷浣滅郴缁熷拰纾佺洏椹卞姩鐨勯夋嫨閮戒細瀵规ц兘浜х敓寰鐨勫奖...
绛旓細5. 鍙傛暟閲忎笌璁$畻閲 (Parameters and FLOPs): 鍙傛暟閲忓喅瀹氭ā鍨嬬殑瀛樺偍闇姹傦紝璁$畻閲忓垯褰卞搷瀹炴椂鎬ц兘銆備紭鍖栬繖涓や釜鎸囨爣鏄繁搴﹀涔犳ā鍨嬭璁$殑閲嶈鑰冮噺銆**鍗风Н缁撴瀯绫诲瀷锛**- 鏍囧噯鍗风Н(Convolution): 鍩虹鏋舵瀯锛屾瘡灞傜殑璁$畻閲忔槑纭- 娣卞害鍙垎绂诲嵎绉 (Depthwise Convolution): 閫氳繃鍗曢氶亾鍗风Н鍑忓皯璁$畻锛屽父瑙佷簬...
绛旓細瑙傛祴鎬х殑瀹炵幇涓昏渚濊禆浜庝笁涓敮鏌憋細鏃ュ織锛堣褰曚簨浠讹級銆鎸囨爣锛堣 閲忔暟鍊硷級鍜岃窡韪紙绔埌绔梾绋嬶級銆傛棩蹇楄褰曚簨浠讹紝鎸囨爣鎻愪緵缁撴瀯鍖栨暟鎹紝鑰岃窡韪垯杩借釜璇锋眰鐨勫叏绋嬨傞氳繃杩欎簺宸ュ叿锛屽彲浠ュ缓绔嬩粠鍙戠幇闂鍒拌В鍐抽棶棰樼殑闂幆锛岀‘淇濈郴缁熺殑绋冲畾杩愯銆傚井鏈嶅姟鍜屼簯鍘熺敓鏋舵瀯鐨勫彂灞曞偓鐢熶簡鍙娴嬫ц璇佸煿璁殑闇姹傦紝濡傞泤鑿插ゥ鏈楃殑璇剧▼锛...
绛旓細閫夋嫨妯″瀷鏃讹紝閽堝鍥惧儚鏁版嵁锛屾垜浠惧悜浜庝娇鐢–NN锛屽畠鑳借嚜鍔ㄦ彁鍙栫壒寰侊紝鏃犻渶绻佺悙鐨勯澶勭悊锛屽厖鍒嗗睍绀轰簡鏈哄櫒瀛︿範鐨勯珮鏁堟с傛ā鍨嬭缁冧笌璇勪及鏄竴鍦虹簿搴︿笌鏁堢巼鐨勮緝閲忋傛垜浠氳繃Loss鍜孉ccuracy杩欎袱涓叧閿鎸囨爣鏉ヨ 閲忔ā鍨鎬ц兘锛孡oss琛¢噺妯″瀷鐨勬嫙鍚堝害锛孉ccuracy鍒欐彮绀洪娴嬬殑鍑嗙‘鎬э紝涓よ呭叡鍚岄┍鍔ㄦā鍨嬬殑涓嶆柇浼樺寲銆傛繁搴﹀涔狅紝...
绛旓細绾㈠鐑垚鍍廚ETD鏄瘎浼扮孩澶栨帰娴嬪櫒鎬ц兘鐨勫叧閿鎸囨爣锛屽畠琛ㄧず鎺㈡祴鍣ㄥ湪淇″櫔姣斾负1鏃讹紝鑳藉垎杈ㄧ洰鏍囦笌鑳屾櫙娓╁樊鐨勮兘鍔涖侼ETD瓒婂皬锛岃〃鏄庢帰娴嬪櫒鐨勭儹鐏垫晱搴﹁秺楂橈紝鍥惧儚璐ㄩ噺鏇翠紭銆傚湪閫夋嫨璁惧鏃讹紝娓╁樊瑕佹眰瓒婂皬锛屽鎺㈡祴鍣ㄧ殑NETD瑕佹眰涔熻秺涓ユ牸銆傛祴娓╄鏍煎寘鎷祴娓╄寖鍥村拰绮惧害銆傚伐涓氱骇绾㈠鏈鸿姱閫氬父鎻愪緵-20鈩冭嚦150鈩冩垨-20鈩冭嚦550...
绛旓細1 娴嬭瘯鍙傛暟鐨勯夋嫨 2 涓氬姟閫昏緫鏈叧闂 鏈枃灏卞皢閫氳繃瀵圭鐩鎬ц兘娴嬭瘯鎸囨爣鍙婂弬鏁扮殑浠嬬粛锛屾潵鐞嗚В浠ヤ笂涓や釜鍘熷洜涓轰粈涔堜細瀵规祴璇曠粨鏋滄湁褰卞搷銆傞鍏堟潵浠嬬粛涓涓嬬鐩樻ц兘鐨勬祴璇曟寚鏍囥傛渶甯哥敤鐨勭鐩樻ц兘璇勪环鎸囨爣鏈変袱涓細IOPS鍜屽悶鍚愰噺锛坱hroughput锛夈侷OPS鏄疘nput/Output Per Second鐨勭缉鍐欙紝瀹冭〃绀哄崟浣嶆椂闂村唴绯荤粺鑳藉鐞嗙殑I/O...
绛旓細N : 鏌ョ湅 NFS 缁熻淇℃伅 j : 鏌ョ湅鏂囦欢绯荤粺缁熻淇℃伅 t : 鏌ョ湅 Top 杩涚▼缁熻淇℃伅 V : 鏌ョ湅铏氭嫙鍐呭瓨缁熻淇℃伅 v : 璇︾粏杈撳嚭妯″紡 4銆佹煡鐪 CPU 缁熻淇℃伅 濡傛灉浣犳兂鏌ョ湅 CPU 鎬ц兘淇℃伅锛屽彲浠ョ洿鎺ユ寜 c 閿細5銆佹煡鐪 Top 杩涚▼缁熻淇℃伅 濡傛灉浣犳兂鏌ョ湅 Top 杩涚▼缁熻淇℃伅锛屽彲浠ョ洿鎺ユ寜 t 閿細6銆鏌ョ湅缃戠粶缁熻...