简介
最近遇到了一个问题,使用Tcp通信时,数据接收端有较大的时延。使用的是一个发送端,多个接收端的广播模式。
加入了时间戳调试,发现send发送后,当数据量较大时,过了好几秒rcv端才接收到。
一开始怀疑是客户端处理数据较慢导致的,加入了多线程处理,依然无效。
而且观察了rcv端的数据处理线程,cpu并不高。而且send端内存在一直增大,才怀疑是网络堵塞造成的。
为了验证这个猜想,需要监控各个网卡的流量,于是这用了这个工具iftop
。
最后发现,果然是由于网络带宽不足引起的阻塞。
这里做一记录。
iftop
命令用于查看网络上的流量情况,包括实时速率、总流量、平均流量等,是一款实时流量监控工具。
在调试网络通信的程序中可能会用得上。
注意,iftop
命令不记录历史数据,无报表,且只能显示从程序启动到现在的总流量。它的运行需要root权限。
安装
以CentOS7下安装为例。
命令行安装:
yum install -y epel-release && yum install -y iftop
如果安装源没有找到这个包,那就只能源码安装了。
源码安装也很简单,步骤如下:
- 安装依赖包:
yum -y install flex byacc libpcap ncurses ncurses-devel libpcap-devel
- 下载iftop代码:
wget http://www.ex-parrot.com/pdw/iftop/download/iftop-1.0pre4.tar.gz
- 解压:
tar zxf iftop-1.0pre4.tar.gz
- 常规安装:
cd iftop-1.0pre4
./configure
make -j4
make install # 必须是root
中间如果报错,如:
configure: error: can't find pcap.h
You're not going to get very far without libpcap.
应该是依赖包安装失败了,重新安装再试一下就好了。
使用
直接运行iftop
即可启动流量监控。如下图所示:
其中:
- 第一行,是带宽,下面带有标尺,用来标示每个连接上的实时流量占用的带宽
- 中间部分,是所有的连接,默认显示的是主机名,可以通过参数显示ip,箭头表示数据方向
- 中间右侧三列,分别是该连接2s、10s、40s的平均流量
- 底部三行,分别表示发送、接收、汇总的流量
- 底部三行第2列,为iftop启动到现在的流量汇总
- 底部三行第3列,为峰值速率
- 第4列,为平均值
- 注意,流量单位为bit,非Byte
可以看到,通过iftop可以很容易看到各个连接的流量使用情况。
参数介绍
在启动iftop时,可以指定监控的网卡,默认为第一块网卡:
iftop -i eth1
其他常用命令:
iftop -n # 直接显示IP, 不进行DNS反解析
iftop -N # 直接显示连接埠编号, 不显示服务名称
iftop -F 192.168.1.0/24 or 192.168.1.0/255.255.255.0 # 显示某个网段进出包流量
一般情况下,使用 iftop -nN
启动即可。
在进入iftop界面后,直接输入以下参数进行调节控制:
- h:显示帮助开关
- n: 显示主机名/主机ip开关
- s:显示本机host开关
- d:显示远端主机host开关
- t:切换显示格式为2行/1行/只显示发送流量/只显示接收流量
- N:显示端口号或端口服务名称开关
- S:显示本机的端口信息开关
- D:显示远端目标主机的端口信息开关
- p:显示端口信息开关
- P:切换暂停/继续显示
- b:显示平均流量图形条开关,以界面第一行带宽为标尺,上图中的白条状图即是
- B:切换计算2秒或10秒或40秒内的平均流量
- T:显示每个连接的总流量开关
- l:打开屏幕过滤功能,输入要过滤的字符,比如ip, 按回车后,屏幕就只显示这个IP相关的流量信息
- L:切换显示画面上边的刻度; 刻度不同,流量图形条会有变化
- j或k:可以向上或向下滚动屏幕显示的连接记录
- 1或2或3:可以根据右侧显示的三列流量数据进行排序
- <:根据左边的本机名或IP排序
- >:根据远端目标主机的主机名或IP排序
- o:切换是否固定只显示当前的连接
- f:可以编辑过滤代码
- !: 可以使用shell命令
- q: 退出
我一般都是使用iftop -nN -i eth0
启动,然后再辅助各种参数来调整。
扩展
iftop使用比较简单,通过各种参数也能很快找到自己想要的数据。
也有一些其他流量监控工具,如:
- ip:查看网卡上的总流量
- 来自
iproute2util
包,在大多数系统上都已经默认安装,也可通过 yum install -y iproute 安装
- nload:查看各个网络设备的当前网络速率
- 来自EPEL软件库,安装:
yum install -y epel-release && yum install -y nload
- iptraf-ng:可以输出网卡的tcp、udp等各种数据,和各个网卡的实时网速
- 默认未安装,可使用
yum install -y iptraf-ng
安装
- stat:用来替换vmstat、iostat、netstat、nfsstat和ifstat的全能系统信息统计工具,支持数据实时刷新,输出直观易懂
- 默认没有安装,安装命令为:
yum install -y dstat
- sar:
System Activity Report
的缩写,是一款全面的Linux系统运行状态统计和性能分析工具,可从磁盘IO、CPU负载、内存使用等多个维度对系统活动进行报告
- 来自 sysstat 包,安装:
yum install -y sysstat
- ss 和 netstat:查看活动链接/监听端口的常用命令。ss 是 netstat 的替代,性能更好,建议使用
- ss 是 iproute2util 包的一部分,netstat 来自 net-tools 包,新版系统上需要自行安装:
yum install -y net-tools
- nethogs:查看单个进程流量而设计的工具,按照进程进行带宽分组
- 来自EPEL软件库,安装命令是:
yum install -y epel-release && yum install -y nethogs
- tcpdump:用来抓包,保存的数据可以用
wireshark
打开和查看