背景
相同配置和相同业务的4台cvm,今天准备下线,检查还有没有业务流量的时候,发现有两台流量不符合预期,就很奇怪,想知道流量是从哪里来的。记录下当时定位思路
先来了解下基本的概念
一、Mbps、kbps、bps、bit、b
速度单位,bit 即比特,通常用 b(小写)表示,指一位二进制位;
- Mbps 即 Milionbit pro second(百万位每秒);
- Kbps 即 Kilobit pro second(千位每秒);
- bps 即 bit pro second(位每秒);
单位换算:
1Milionbit=1000Kilobit=1000000bit
1Mbps=1000 000bps
这是通常用来衡量带宽的单位,指每秒钟传输的二进制位数;
二、MB、KB、B
通常软件上显示的速度不是上述一中的带宽,而是指每秒种传输的字节数(Byte)通常用B(大写)表示;
- MB 即百万字节也称兆字节;
- KB 即千字节;
- B 即字节;
单位换算:
1MB=1024KB=10241024B=10241024*8b
1B=8b;
与带宽的换算:
1M带宽即指 1Mbps=1000Kbps=1000/8KBps=125KBps;
因此1M的带宽下载的速度一般不会超过125KB每秒。
2M、3M带宽分别是250KBps、375KBps;
2M、3M带宽的下载速度分别不会超过250KB、375KB每秒。
PS:
1Mbps与 1m/s 是有区别的,1Mbps指的是1000/8KB/S也就是125KB/S,而 1m/s 指的是是1024KB/S。
记住 K 和 k 是没区别的 ,区别在于 bps 属于位每秒的单位,而m/s,KB/S 这两个属于字节每秒的单位,一字节等于8位,即1B=8b
好了,进入正题
1、首先我们先使用neatest 查看监听了哪些进程,由于是生产环境,这里就不截图展示了
netstat -anltp
执行后发现连接数很少,基本上可以确认应该没啥业务流量了,但是为了保险起见,我们应该对业务监听的端口进行抓包看看(这里以nginx为例)
tcpdump -iany dst port '80 or 443' and dst host '输入自己的ip' -nnv
这里没有输出,证明我们猜想是正确的,确实没有业务流量了
2、使用dstat命令实时查看网卡流量
dstat -tnf 10
PS:dstat命令默认显示的是速度单位,而不是存储单位。例如,dstat -tnf命令的输出中,k和b单位分别表示千字节和字节的速度,而不是存储容量。从下面这张图仔细的小伙伴肯定有疑问,为什么这里的send平均在1500k怎么和上面第二张图的10M不相等呢?
原因:这就是Mb/s和MB/s的区别啦。dstat表示的单位是字节每秒,但是Mb/s表示的是位每秒,通过上面的换算,其实是一样的,只是单位不同而已。
从这里看到确实流量有这么高,进一步查看
3、使用iftop命令
iftop是一个实时流量监控工具,可以用来监控网络接口的流量。要监控某个进程的流量,你可以使用以下命令:
sudo iftop -i eth0 -f "src port <port> or dst port <port>"
但是这里我们并不知道端口,所以执行
iftop -i eth1
从这里就可以确认到是哪一个目的ip了,如果再结合到neatest 命令就可以确认到是哪一个进程。
4、使用nethogs命令
nethogs -a -d 10
从这里可以查看到某个进程对应的所有流量了。
扩展
使用nload命令也可以实时监控入流量和出流量
使用lsof -i:port 根据端口查询进程
nload eth1