java性能分析--基于操作系统的分析之网络IO

315 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

本篇文章继续分析在操作系统提供的工具命令上,我们能够得到哪些性能相关的问题。通常我们的应用都是需要网络的,网络的快慢基于服务器的带宽,而这个带宽是有限度的。所以我们需要针对网络流量进行监控。如果写入的数据总量超过带宽的极限,那么将导致整个应用的卡顿,甚至未响应。

网络使用率

nicstat安装

我们熟知的netstat不能很好地监控到网络流量,所以这里提供一个指标较为全面的监控工具。

下载方式如下:

 wget http://nchc.dl.sourceforge.net/project/nicstat/nicstat-1.95.tar.gz

解压:

tar -zxvf nicstat-1.95.tar.gz 

进入文件夹,拷贝文件:

[root@hecs-402944 opt]# cd nicstat-1.95
[root@hecs-402944 nicstat-1.95]# cp Makefile.Linux  Makefile

编辑文件Makefile,将:
CFLAGS =       $(COPT) $(CMODEL)
修改为:  
CFLAGS =       $(COPT)

编译并安装:

[root@hecs-402944 nicstat-1.95]# make && make install
gcc -O3    nicstat.c   -o nicstat
mv nicstat `./nicstat.sh --bin-name`
gcc -O3    nicstat.c   -o nicstat
sudo install -o root -g root -m 4511 `./nicstat.sh --bin-name` /usr/local/bin/nicstat
sudo install -o bin -g bin -m 555 enicstat /usr/local/bin
sudo install -o bin -g bin -m 444 nicstat.1 /usr/local/share/man/man1/nicstat.1

验证:

[root@hecs-402944 nicstat-1.95]# nicstat
    Time      Int   rKB/s   wKB/s   rPk/s   wPk/s    rAvs    wAvs %Util    Sat
09:37:34     eth0    0.57    0.69    2.42    4.51   241.3   155.6  0.00   0.00
09:37:34       lo    0.02    0.02    0.08    0.08   198.6   198.6  0.00   0.00

nicstat使用

关于详细的命令可以使用nicstat -help查看。

每五秒打印一次,共打印3次:

[root@hecs-402944 nicstat-1.95]# nicstat 5 3
    Time      Int   rKB/s   wKB/s   rPk/s   wPk/s    rAvs    wAvs %Util    Sat
09:46:22     eth0    0.57    0.69    2.42    4.51   241.2   155.6  0.00   0.00
09:46:22       lo    0.02    0.02    0.08    0.08   198.6   198.6  0.00   0.00
    Time      Int   rKB/s   wKB/s   rPk/s   wPk/s    rAvs    wAvs %Util    Sat
09:46:27     eth0    0.97    4.16   11.99   20.98   82.73   202.9  0.00   0.00
09:46:27       lo    0.00    0.00    0.00    0.00    0.00    0.00  0.00   0.00
    Time      Int   rKB/s   wKB/s   rPk/s   wPk/s    rAvs    wAvs %Util    Sat
09:46:32     eth0    1.14    5.29   13.80   20.20   84.67   268.4  0.00   0.00
09:46:32       lo    0.00    0.00    0.00    0.00    0.00    0.00  0.00   0.00

如上所示的每个列的含义如下所示:

  • Time:表示当前时间
  • Int : 网卡名称
  • rKB/s : 每秒接收到的KB
  • wKB/s : 每秒写的KB
  • rPk/s : 每秒接收到的数据包数
  • wPk/s : 每秒写的数据包数
  • rAvs : 接收到的数据包平均大小
  • wAvs : 传输的数据包平均大小
  • %Util : 网络接口使用率
  • Sat : 网络接口每秒的错误数(网络接口饱和度)。可以使用-x参数去查询明细

使用率如何计算呢?

我们的网络带宽的单位是位/秒(bps),而上述得每秒写入和读取单位是KB,我的服务器带宽只有1M,所以只有128KB的最大上传下载速度,所以最终得到网络接口使用率如下:

util=(rKB/s+wKBs)/(带宽/8)=0.57+0.69/(1024/8)=0.00984375util = (rKB/s + wKBs) / (带宽 / 8) = (0.57 + 0.69) / (1024 / 8) = 0.00984375

写到这笔者做了一个测试,发现在华为云服务器是无法通过nicstat直接显示网络接口使用率的,不知道什么原因。

但是使用正常的虚拟机没有问题,如下图:

image.png

总结

网络无法支持100%的使用率。对于本地的局域网,基本超过40%就饱和了,但是也是基于不同的传输介质。

  • 网络在应用当中是很走红要的一环,需要对其监控,防止其称为瓶颈。
  • 如果写数据成为了瓶颈,那么可能是写数据的效率太低了,考虑代码是否存在问题。当然也可能是写入太多了。