[转帖]网络基本功(十六):细说网络性能监测与实例(下)

网络,基本功,十六,细说,性能,监测,实例 · 浏览次数 : 0

小编点评

**Linux平台输出:** ``` lnx1# netstat -iKernel Interface tableIface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flgeth0 1500 0 7366003 0 0 0 93092 0 0 0 BMRUeth1 1500 0 289211 0 0 0 18581 0 0 0 BRUlo 3924 0 123 0 0 0 123 0 0 0 LRU ``` **重点:** * 每个目录包含了系统监控的信息,包括接收和发送的数据量、错误类型和时间戳。 * `errors`目录包含了由于网络拥塞导致的报文丢失。 * `drops`目录包含了由于网络拥塞导致的数据包丢失。 * `overruns`目录包含了由于网络拥塞导致的数据包超过了窗口大小的报文。 **其他信息:** * `netstat`命令可以用于查看网络连接状态。 * `-i`选项用于显示网络接口的名称。 * `-s`选项用于显示所有数据包的信息。 * `-p`选项用于显示协议统计信息。

正文

https://zhuanlan.zhihu.com/p/37898572

 

转载请在文首保留原文出处:EMC中文支持论坛

 

介绍

网络问题中,性能问题是最复杂的问题之一,解决这样的问题能够透彻的了解整个网络的结构。但通过合适的吞吐量和数据流测试工具,能够帮你快速找到问题所在。本文承接上文,阐述netperf和netstat的用法。

更多信息

吞吐量测量:

(承接上文)

netperf

该程序是由HP创造,该程序免费可用,运行于一些Unix平台,有支持文档,也被移植到Windows平台。虽然不像ttcp那样无处不在,但它的测试范围更加广泛。

与ttcp不同,客户端和服务器端是分开的程序。服务器端是netserver,能够单独启动,或通过inetd启动。客户端是netperf。下例中,服务器和客户端启动于同一台机器:

bsd1# netserver
Starting netserver at port 12865
bsd1# netperf
TCP STREAM TEST to localhost : histogram
Recv   Send    Send
Socket Socket  Message  Elapsed
Size   Size    Size     Time     Throughput
bytes  bytes   bytes    secs.    10^6bits/sec
16384  16384  16384    10.00     326.10

测试的是loop-back接口,报告显示吞吐量为326Mbps。

下例中,netserver启动于主机:

bsd1# netserver
Starting netserver at port 12865
netperf加上-H选项指定服务器地址:
bsd2# netperf -H 205.153.60.247
TCP STREAM TEST to 205.153.60.247 : histogram
Recv   Send    Send
Socket Socket  Message  Elapsed
Size   Size    Size     Time     Throughput
bytes  bytes   bytes    secs.    10^6bits/sec
16384  16384  16384    10.01       6.86

大致与ttcp所得出的吞吐量相同。netperf还进行了一些额外的测试。以下测试中,还计算了连接的transaction rate:

bsd2# netperf -H 205.153.60.247 -tTCP_RR
TCP REQUEST/RESPONSE TEST to 205.153.60.247 : histogram
Local /Remote
Socket Size   Request  Resp.   Elapsed  Trans.
Send   Recv   Size     Size    Time     Rate
bytes  Bytes  bytes    bytes   secs.    per sec
16384  16384  1        1       10.00     655.84
16384  16384

该程序包含一些测试脚本。也可以使用netperf做各种流测试。

iperf

如果ttcp和netperf都不符合你的要求,那么可以考虑iperf。iperf也可以用于测试UDP带宽,丢失率,和抖动。Java前端让该工具便于使用。该工具同样移植入windows。

下例是运行iperf服务器端:

bsd2# iperf -s -p3000
------------------------------------------------------------
Server listening on TCP port 3000
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
[  4] local 172.16.2.236 port 3000 connected with 205.153.63.30 port 1133
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-10.0 sec   5.6 MBytes   4.5 Mbits/sec
^C

下例是在windows运行客户端:

C:\>iperf -c205.153.60.236
-p3000
------------------------------------------------------------
Client connecting to 205.153.60.236, TCP port 3000
TCP window size:  8.0 KByte (default)
------------------------------------------------------------
[ 28] local 205.153.63.30 port 1133 connected with 205.153.60.236 port 3000
[ ID] Interval       Transfer     Bandwidth
[ 28]  0.0-10.0 sec   5.6 MBytes   4.5 Mbits/sec

注意使用Ctrl-C来终止服务器端。在TCP模式下,iperf相当于ttcp,所以它可盈用户客户端或服务器。

在研究TCP窗口是否足够大时,使用iperf特别方便。-w选项设置socket buffer大小。对于TCP来说,这就是窗口大小。通过-w选项,用户可以单步调试各种窗口大小来看它们是怎样影响吞吐量的。

其他工具

你也许想要考虑一些相关或类似的工具。treno使用的方法类似于traceroute来计算块容量,路径MTU,以及最小RTP。如下例所示:

bsd2# treno 205.153.63.30
MTU=8166  MTU=4352  MTU=2002  MTU=1492 ..........
Replies were from sloan.lander.edu [205.153.63.30]
    Average rate: 3868.14 kbp/s (3380 pkts in + 42 lost = 1.2%) in 10.07 s
Equilibrium rate:      0 kbp/s (0 pkts in + 0 lost =   0%) in    0 s
Path properties: min RTT was  13.58 ms, path MTU was 1440 bytes
XXX Calibration checks are still under construction, use –v

通常来说,netperf,iperf和treno提供更加丰富的feature,但ttcp更加容易找到。

通过netstat进行流量测量:

在理想的网络环境下,如果把overhead算在内,吞吐量是很接近于带宽的。但是吞吐量往往低于期望值,这种情况下,你会想要知道差异在哪。如之前所提到的,可能与硬件或软件相关。但通常是由于网络上其他数据流的影响。如果你无法确定原因,下一步就是查看你网络上的数据流。

有三种基本方法可供采用。第一,最快的方法是使用如netstat这样的工具来查看链路行为。或通过抓包来查看数据流。最后,可使用基于SNMP的工具如ntop。

要得到网络上数据流的快照,使用-i选项。举例来说:

bsd2# netstat -i
Name  Mtu   Network       Address            Ipkts Ierrs    Opkts Oerrs  Coll
lp0*  1500  <Link>                               0     0        0     0     0
ep0   1500  <Link>      00.60.97.06.22.22 13971293     0  1223799     1     0
ep0   1500  205.153.63    bsd2            13971293     0  1223799     1     0
tun0* 1500  <Link>                               0     0        0     0     0
sl0*  552   <Link>                               0     0        0     0     0
ppp0* 1500  <Link>                               0     0        0     0     0
lo0   16384 <Link>                             234     0      234     0     0
lo0   16384 127           localhost            234     0      234     0     0

输出显示了自上一次重启以来,各接口所处理的报文数量。在本例中,接口ep0收到13,971,293个没有差错(Ierrs)的报文(Ipkts),发送了1,223,799 个报文(Opkts),有1个差错,没有冲突(Coll)。少量错误通常并不是造成告警的原因,但各错误所占比例应当是维持在较低水平,应该明显低于报文总量的0.1%。冲突可以稍微高一些,但应当少于数据流总量的10%。冲突数量仅包括那些影响接口的。较高数量的冲突喻示着网络负载较高,用户应当考虑分段。冲突只出现在特定媒介上。

如果你只想要单一接口的输出,可以通过-I选项指定,如:

bsd2# netstat -Iep0
Name  Mtu   Network       Address            Ipkts Ierrs    Opkts Oerrs  Coll
ep0   1500  <Link>      00.60.97.06.22.22 13971838     0  1223818     1     0
ep0   1500  205.153.63    bsd2            13971838     0  1223818     1     0

随着实现的不同,输出可能看起来有些差异,但基本信息是一样的。例如,Linux平台的输出:

lnx1# netstat -i
Kernel Interface table
Iface   MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0   1500   0  7366003      0      0      0    93092      0      0      0 BMRU
eth1   1500   0   289211      0      0      0    18581      0      0      0 BRU
lo     3924   0      123      0      0      0      123      0      0      0 LRU

如上例所示,Linux将丢失报文拆成三个目录:errors, drops,以及overruns。

不方便的是,netstat的返回值是系统自上一次重启之后的累计值。我们真正关心的是这些数值最近是怎样变化的,因为问题是在发展的,在它增长到足以显现问题之前会花费相当长的时间。

有时你会对系统做一些压力测试来看错误是否增加,可以使用ping加 –I选项或spray命令。

首先,运行netstat来得到当前值:

bsd2# netstat -Iep0
Name  Mtu   Network       Address            Ipkts Ierrs    Opkts Oerrs  Coll
ep0   1500  <Link>      00.60.97.06.22.22 13978296     0  1228137     1     0
ep0   1500  205.153.63    bsd2            13978296     0  1228137     1     0

接下来,发送大量报文到目的地址。本例中,发送了1000个UDP报文:

bsd1# spray -c1000 205.153.63.239
sending 1000 packets of lnth 86 to 205.153.63.239 ...
        in 0.09 seconds elapsed time
        464 packets (46.40%) dropped
Sent:   11267 packets/sec, 946.3K bytes/sec
Rcvd:   6039 packets/sec, 507.2K bytes/sec

注意到该测试超出了网络容量,因为464个报文被丢弃了。这可能意味着网络拥塞。更加可能的是,主机正在尝试与一个慢速设备通信。当spray在相反方向运行时,没有报文丢弃。

最后,回到netstat来看看是否存在问题:

bsd2# netstat -Iep0
Name  Mtu   Network       Address            Ipkts Ierrs    Opkts Oerrs  Coll
ep0   1500  <Link>      00.60.97.06.22.22 13978964     0  1228156     1     0
ep0   1500  205.153.63    bsd2            13978964     0  1228156     1     0

本例显示没有问题。

如果显示有问题,可以通过-s选项来得到。输出数据量可能有点吓人,但可以提供丰富的信息。信息按照协议和错误类型来分段,如bad checksum或报文头不完整。

在某些系统上,两次-s选项显示非零值的总和,如下所示:

bsd2# netstat -s -s
ip:
        255 total packets received
        255 packets for this host
        114 packets sent from this host
icmp:
        ICMP address mask responses are disabled
igmp:
tcp:
        107 packets sent
                81 data packets (8272 bytes)
                26 ack-only packets (25 delayed)
        140 packets received
                77 acks (for 8271 bytes)
                86 packets (153 bytes) received in-sequence
        1 connection accept
        1 connection established (including accepts)
        77 segments updated rtt (of 78 attempts)
        2 correct ACK header predictions
        62 correct data packet header predictions
udp:
        115 datagrams received
        108 broadcast/multicast datagrams dropped due to no socket
        7 delivered
        7 datagrams output

通过-p选项显示某一协议的汇总信息,下例显示TCP非零值的统计信息:

bsd2# netstat -p tcp -s -s
tcp:
        147 packets sent
                121 data packets (10513 bytes)
                26 ack-only packets (25 delayed)
        205 packets received
                116 acks (for 10512 bytes)
                122 packets (191 bytes) received in-sequence
        1 connection accept
        1 connection established (including accepts)
        116 segments updated rtt (of 117 attempts)
        2 correct ACK header predictions
        88 correct data packet header predictions

解释这一结果是需要一些经验的。一开始可以从大量错误信息开始看起。接下来,识别错误类型。通常,input error是由于硬件故障应期的。 Output error是由本地主机的问题造成。Data corruption,例如错误校验和,通常产生于服务器。冲突往往意味着网络拥塞。当然,这只是一般情况。

参考

Network Troubleshooting Tools

 

 

PS:在gitbook上看到一本好书,但是无奈gitbook不挂梯子访问太慢了。为了方便自己查阅,也方便知识共享,将文章转载到知乎专栏,由于没有联系到作者(据说是个女神)冒昧挂上来,如果有冒犯的地方,联系我我随时进行删除。谢谢。

作者:Zhang Jiawen

来源:网络基本功系列:细说网络那些事儿

与[转帖]网络基本功(十六):细说网络性能监测与实例(下)相似的内容:

[转帖]网络基本功(十六):细说网络性能监测与实例(下)

https://zhuanlan.zhihu.com/p/37898572 转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese 介绍 网络问题中,性能问题是最复杂的问题之一,解决这样的问题能够透彻的了解整个网络的结构。但通过合适的吞吐

[转帖]网络基本功(十五):细说网络性能监测与实例(上)

网络基本功(十五):细说网络性能监测与实例(上) 介绍 网络路径性能检测主要包括三方面的内容:带宽测量能够获知网络的硬件特性,如网络的最大容量,吞吐量测量能够获得网络实际可提供的最大容量,数据流测量能够了解真实占用的网络容量。 本文介绍在评估网络性能是否合理时,需要收集的数据及收集方式。涉及工具包括

[转帖]《Linux性能优化实战》笔记(十七)—— Linux网络基础与性能指标

一、 网络模型 1. OSI 网络模型(七层) 为了解决网络互联中异构设备的兼容性问题,并解耦复杂的网络包处理流程,OSI 模型把网络互联的框架分为七层,每个层负责不同的功能。其中, 应用层,负责为应用程序提供统一的接口。表示层,负责把数据转换成兼容接收系统的格式。会话层,负责维护计算机之间的通信连

[转帖]40张图入门Linux——(前端够用,运维入门)

本文主要是Linux的入门内容,利用40张思维导图从基础、操作、实用指令、组管理和权限管理、crond任务调度、Linux磁盘分区和挂载、Linux网络环境配置、进程管理、服务管理、RPM和YUM、软件安装关键点、Shell编程共十二部分着手,从而系统的了解一下Linux(基于Centos),本文的

[转帖]RoCE、IB和TCP等网络的基本知识及差异对比

https://support.huawei.com/enterprise/zh/doc/EDOC1100203347/ 在分布式存储网络中,我们使用的协议有RoCE、Infiniband(IB)和TCP/IP。其中RoCE和IB属于RDMA(RemoteDirect Memory Access)技

[转帖]Docker网络解决方案-Calico部署记录

Docker网络解决方案-Calico部署记录 时间:2022-04-23 本文章向大家介绍Docker网络解决方案-Calico部署记录,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。 Calico简单简介 Calico是一个纯三层的协

[转帖]高并发架构的TCP知识整理

https://zhuanlan.zhihu.com/p/344083588 做为一个有追求的程序员,不能只满足增删改查,我们要对系统全方面无死角掌控。掌握了这些基本的网络知识后,相信一方面日常排错中会事半功倍,另一方面日常架构中不得不考虑的高并发问题,理解了这些底层协议也是会如虎添翼。 本文不会单

[转帖]什么情况下适合用UDP协议,什么情况下适合用TCP协议?

TCP与UDP基本区别 基于连接与无连接TCP要求系统资源较多,UDP较少;UDP程序结构较简单流模式(TCP)与数据报模式(UDP);TCP保证数据正确性,UDP可能丢包TCP保证数据顺序,UDP不保证 UDP应用场景: 面向数据报方式网络数据大多为短消息拥有大量Client对数据安全性无特殊要求

[转帖]什么情况下适合用UDP协议,什么情况下适合用TCP协议?

TCP与UDP基本区别 基于连接与无连接TCP要求系统资源较多,UDP较少;UDP程序结构较简单流模式(TCP)与数据报模式(UDP);TCP保证数据正确性,UDP可能丢包TCP保证数据顺序,UDP不保证 UDP应用场景: 面向数据报方式网络数据大多为短消息拥有大量Client对数据安全性无特殊要求

[转帖]天融信专用运维管理系统(专用计算平台版)V1.0 服务器客户端

是否国产 是 基本功能 用于专用信息设备运行状态数据的采集、分析和异常状态告警。产品包含管理端软件和客户端程序。主要功能包括:1、资产管理与状态采集:支持将用户网络中所有专用信息设备纳入资产管理,基于专用数据采集协议持续收集分析资产对象的操作系统、处理器、内存、文件系统分区、、磁盘I/O、网络接口的