Linux对机器进行性能分析之网络篇

前言

比较宽泛地讲,网络方向的性能分析既包括主机测的网络配置查看、监控,又包括网络链路上的包转发时延、吞吐量、带宽等指标分析。

ping

ping 发送 ICMP echo 数据包来探测网络的连通性,除了能直观地看出网络的连通状况外,还能获得本次连接的往返时间(RTT 时间),丢包情况,以及访问的域名所对应的 IP 地址(使用 DNS 域名解析),比如:
在这里插入图片描述我们 ping baidu.com,-c参数指定发包数。可以看到,解析到了 baidu 的一台服务器 IP 地址为 39.156.69.79。RTT (本次连接的往返时间)时间的最小、平均、最大和算术平均差分别是37.001ms、38.029ms、39.089ms 和 0.764。

ifconfig

ifconfig 命令被用于配置和显示 Linux 内核中网络接口的统计信息。通过这些统计信息,我们也能够进行一定的网络性能调优。

  1. ifconfig显示网络接口配置信息
    在这里插入图片描述其中,RX/TX packets 是对接收/发送数据包的情况统计,包括错误的包,丢掉多少包等。RX/TX bytes 是接收/发送数据字节数统计。其余还有很多参数,就不一一述说了,性能调优时可以重点关注 MTU(最大传输单元) 和txqueuelen(发送队列长度),比如可以用下面的命令来对这两个参数进行微调:

在这里插入图片描述
2. 网络接口地址配置
ifconfig 还常用来配置网口的地址,比如: 为网卡配置和删除 IPv6 地址:
在这里插入图片描述修改MAC地址:
在这里插入图片描述配置IP地址:
在这里插入图片描述

IP

ip 命令用来显示或设置 Linux 主机的网络接口、路由、网络设备、策略路由和隧道等信息,是 Linux 下功能强大的网络配置工具,旨在替代 ifconfig 命令,如下显示 IP 命令的强大之处,功能涵盖到 ifconfig、netstat、route 三个命令。
在这里插入图片描述

netstat

netstat 可以查看整个 Linux 系统关于网络的情况,是一个集多种网络工具于一身的组合工具。

常用选项包括以下几个:

  • 默认:列出连接的套接字
  • -a:列出所有套接字的信息
  • -s:各种网络协议栈统计信息
  • -i:网络接口信息
  • -r:列出路由表
  • -l:仅列出有在 Listen 的服务状态
  • -p:显示 PID 和进程名称

各参数组合使用实例如下:

  • netstat -at 列出所有 TCP 端口
  • netstat -au 列出所有 UDP 端口
  • netstat -lt 列出所有监听 TCP 端口的 socket
  • netstat -lu 列出所有监听 UDP 端口的 socket
  • netstat -lx 列出所有监听 UNIX 端口的 socket
  • netstat -ap | grep ssh 找出程序运行的端口
  • netstat -an | grep ‘:80’ 找出运行在指定端口的进程
  1. netstat 默认显示连接的套接字数据
    在这里插入图片描述整体上来看,输出结果包括两个部分:
  • Active Internet connections :有源 TCP 连接,其中 Recv-Q 和 SendQ 指的是接收队列和发送队列,这些数字一般都是 0,如果不是,说明请求包和回包正在队列中堆积。
  • Active UNIX domain sockets:有源 UNIX 域套接口,其中 proto 显示连接使用的协议,RefCnt 表示连接到本套接口上的进程号,Types 是套接口的类型,State 是套接口当前的状态,Path 是连接到套接口的进程使用的路径名。
  1. netstat -i 显示网络接口信息
    在这里插入图片描述接口信息包括网络接口名称(Iface)、MTU,以及一系列接收(RX-)和传输(TX-)的指标。其中 OK 表示传输成功的包,ERR 是错误包,DRP 是丢包,OVR 是超限包。
    这些参数有助于我们对网络收包情况进行分析,从而判断瓶颈所在。

    扫描二维码关注公众号,回复: 12649056 查看本文章
  2. netstat -s 显示所有网络协议栈的信息
    在这里插入图片描述可以看到,这条命令能够显示每个协议详细的信息,这有助于我们针对协议栈进行更细粒度的分析。

在这里插入图片描述这条命令能够看到主机路由表的一个情况。当然查路由我们也可以用 ip route 和route 命令,这个命令显示的信息会更详细一些。

ifstat

ifstat 主要用来监测主机网口的网络流量,常用的选项包括:

  • -a:监测主机所有网口
  • -i:指定要监测的网口
  • -t:在每行输出信息前加上时间戳
  • -b:以 Kbit/s 显示流量数据,而不是默认的 KB/s
  • delay:采样间隔(单位是 s),即每隔 delay 的时间输出一次统计信息
  • count:采样次数,即共输出 count 次统计信息
    比如,通过以下命令统计主机所有网口某一段时间内的流量数据:
    在这里插入图片描述可以看出,分别统计了三个网口的流量数据,前面输出的时间戳,有助于我们统计一段时间内各网口总的输入、输出流量。

netcat

netcat,简称 nc,命令简单,但功能强大,在排查网络故障时非常有用,因此它也在众多网络工具中有着“瑞士军刀”的美誉。
它主要被用来构建网络连接。可以以客户端和服务端的方式运行,当以服务端方式运行时,它负责监听某个端口并接受客户端的连接,因此可以用它来调试客户端程序;当以客户端方式运行时,它负责向服务端发起连接并收发数据,因此也可以用它来调试服务端程序,此时它有点像 Telnet 程序。

常用的选项包括以下几种:

  • -l:以服务端的方式运行,监听指定的端口。默认是以客户端方式运行。
  • -k:重复接受并处理某个端口上的所有连接,必须与 -l 一起使用。
  • -n:使用 IP 地址表示主机,而不是主机名,使用数字表示端口号,而不是服务名称。
  • -p:当以客户端运行时,指定端口号。
  • -s:设置本地主机发出的数据包的 IP 地址。
  • -C:将 CR 和 LF 两个字符作为结束符。
  • -U:使用 UNIX 本地域套接字通信。
  • -u:使用 UDP 协议通信,默认使用的是 TCP 协议。
  • -w:如果 nc 客户端在指定的时间内未检测到任何输入,则退出。
  • -X:当 nc 客户端与代理服务器通信时,该选项指定它们之间的通信协议,目前支持的代理协议包括 “4”(SOCKS v.4),“5”(SOCKSv.5)和 “connect” (HTTPs Proxy),默认使用 SOCKS v.5。
  • -x:指定目标代理服务器的 IP 地址和端口号。

下面举一个简单的例子,使用 nc 命令发送消息: 首先,启动服务端,用 nc -l 0.0.0.0 12345 监听端口 12345 上的所有连接。
在这里插入图片描述然后,启动客户端,用 nc -p 1234 127.0.0.1 12345 使用 1234 端口连接服务器127.0.0.1::12345。
在这里插入图片描述接着就可以在两端发送命令了。

tcpdump

最后是 tcpdump,强大的网络抓包工具。虽然有 wireshark 这样更易使用的图形化抓包工具,但 tcpdump 仍然是网络排错的必备利器。
tcpdump 选项很多,我就不一一列举了,大家可以看文章末尾的引用来进一步
了解。这里列举几种 tcpdump 常用的用法。

  1. 捕获某主机的数据包
    比如想要捕获主机192.168.1.111上所有收到和发出的所有数据包,使用:
    在这里插入图片描述

  2. 捕获多个主机的数据包
    比如要捕获主机 200.200.200.1 和主机 200.200.200.2 或 200.200.200.3 的通信,使用:

     tcpdump host 200.200.200.1 and \(200.200.200.2 or \)
    

    同样要捕获主机 200.200.200.1 除了和主机 200.200.200.2 之外所有主机通信的IP 包。使用:

     tcpdump ip host 200.200.200.1 and ! 200.200.200.2
    
  3. 捕获某主机接收或发出的某种协议类型的包 比如要捕获主机200.200.200.1 接收或发出的 Telnet 包:

     tcpdump tcp port 23 host 200.200.200.1
    
  4. 捕获某端口相关的数据包
    比如捕获在端口 6666 上通过的包,使用:

     tcpdump port 6666
    
  5. 捕获某网口的数据包 比如捕获在网口 eth0 上通过的包,使用:

     tcpdump -i eth0
    

下面还是举个例子,抓取 TCP 三次握手的包: 首先,用 nc 启动一个服务端,监听端口 12345 上客户端的连接:

nc -v -l 0.0.0.0 12345

接着,启动 tcpdump 监听端口 12345 上通过的包:

tcpdump -i any 'port 12345' -XX -nn -vv -S

然后,再用 nc 启动客户端,连接服务端:

nc -v 127.0.0.1 12345

最后,我们看到 tcpdump 抓到包如下:
在这里插入图片描述在这里插入图片描述怎么分析是 TCP 的三次握手,就当做小作业留给大家吧,其实看图就已经很明显了。

sar

sar 是一个系统历史数据统计工具。统计的信息非常全,包括 CPU、内存、磁盘I/O、网络、进程、系统调用等等信息,是一个集大成的工具,非常强大。在Linux 系统上 sar --help 一下,可以看到它的完整用法。

  • -A:所有报告的总和
  • -u:输出 CPU 使用情况的统计信息
  • -v:输出 inode、文件和其他内核表的统计信息
  • -d:输出每一个块设备的活动信息
  • -r:输出内存和交换空间的统计信息
  • -b:显示 I/O和传送速率的统计信息
  • -a:文件读写情况
  • -c:输出进程统计信息,每秒创建的进程数
  • -R:输出内存页面的统计信息
  • -y:终端设备活动情况
  • -w:输出系统交换活动信息
  • -n:输出网络设备统计信息

在平时使用中,我们常常用来分析网络状况,其他几项的通常有更好的工具来分析。所以,本文会重点介绍 sar 在网络方面的分析手法。

Linux 系统用以下几个选项提供网络统计信息:

  • -n DEV:网络接口统计信息。
  • -n EDEV:网络接口错误。
  • -n IP:IP 数据报统计信息。
  • -n EIP:IP 错误统计信息。
  • -n TCP:TCP 统计信息。
  • -n ETCP:TCP 错误统计信息。
  • -n SOCK:套接字使用。

我们来看几个示例:

  1. 每秒打印 TCP 的统计信息:

     sar -n TCP 1
    

在这里插入图片描述参数含义:

  • active/s:新的 TCP 主动连接(也就是 socket 中的 connect() 事件),单位是:连接数/s。
  • passive/s:新的 TCP 被动连接(也就是 socket 中的 listen() 事件)。
  • iseg/s:接收的段(传输层以段为传输单位),单位是:段/s
  • oseg/s:发送的段。 通过这几个参数,我们基本可以知道当前系统TCP 连接的负载情况。
  1. 每秒打印感兴趣的网卡的统计信息:

    sar -n DEV 1 | awk 'NR == 3 || $3 == "eth0"'
    

在这里插入图片描述几个参数了解一下:

  • rxpck/s / txpck/s:网卡接收/发送的数据包,单位是:数据包/s。
  • rxkB/s / txkB/s:网卡接收/发送的千字节,单位是:千字节/s。
  • rxcmp/s / txcmp/s:网卡每秒接受/发送的压缩数据包,单位是:数据
    包/s。
  • rxmcst/s:每秒接收的多播数据包,单位是:数据包/s。
  • %ifutil:网络接口的利用率。 这几个参数对于分析网卡接收和发送的网络吞吐量很有帮助。
  1. 错误包和丢包情况分析:

     sar -n EDEV 1
    

在这里插入图片描述参数含义:

  • rxerr/s / txerr/s:每秒钟接收/发送的坏数据包
  • coll/s:每秒冲突数
  • rxdrop/s:因为缓冲充满,每秒钟丢弃的已接收数据包数
  • txdrop/s:因为缓冲充满,每秒钟丢弃的已发送数据包数
  • txcarr/s:发送数据包时,每秒载波错误数
  • rxfram/s:每秒接收数据包的帧对齐错误数
  • rxfifo/s / txfifo/s:接收/发送的数据包每秒 FIFO 过速的错误数

当发现接口传输数据包有问题时,查看以上参数能够让我们快速判断具体是出的什么问题。

OK,这个工具就介绍到这里,以上只是抛砖引玉,更多技巧还需要大家动手去探索,只有动手,才能融会贯通。

traceroute

traceroute 也是一个排查网络问题的好工具,它能显示数据包到达目标主机所经过的路径(路由器或网关的 IP 地址)。如果发现网络不通,我们可以通过这个命令来进一步判断是主机的问题还是网关的问题。

它通过向源主机和目标主机之间的设备发送一系列的探测数据包(UDP 或者ICMP)来发现设备的存在,实现上利用了递增每一个包的 TTL 时间,来探测最终的目标主机。比如开始 TTL = 1,当到达第一个网关设备的时候,TTL - 1,当
TTL = 0 导致网关响应一个 ICMP 超时报文,这样,如果没有防火墙拦截的话,源主机就知道网关设备的地址。以此类推,逐步增加 TTL 时间,就可以探测到目标主机之间所经过的路径。

为了防止发送和响应过程出现问题导致丢包,traceroute 默认会发送 3 个探测包,我们可以用 -q x 来改变探测的数量。如果中间设备设置了防火墙限制,会导致源主机收不到响应包,就会显示 * 号。如下是 traceroute baidu 的结果:

在这里插入图片描述每一行默认会显示设备名称(IP 地址)和对应的响应时间。发送多少个探测包,就显示多少个。如果只想显示 IP 地址可以用 -n 参数,这个参数可以避免DNS 域名解析,加快响应时间。

后记

本文总结了几种初级的网络工具,一般的网络性能分析,通过组合以上几种工具,基本都能应付。

猜你喜欢

转载自blog.csdn.net/Thorne_lu/article/details/107763323