JVM 调优
资源消耗主要存在于CPU、文件IO、网络IO、以及内存方面。
-
IO
-
文件IO
Lunix在操作文件时,将数据放入文件缓存区。当物理空闲内存够用时,通常只有在Lunix写文件和第一次读取文件的时候才会产生文件IO。
在Lunix中,可以通过
pidstat
来追踪线程的文件IO的消耗;而iostat
命令可以查看各个设备的IO历史情况。在查看消耗的时候,首先要关注CPU中的
iowait
所占的百分比,当iowait
占据了主要的百分比时,说明文件IO消耗过高。通常来讲我们要找到对应的代码,通过pidstat
来找到文件操作线程过多的线程,再结合jstack
来找到对应的Java代码。造成Java文件IO严重的主要原因是多个线程需要大量内容写入(频繁的日志写入)的动作;或者磁盘设备本身的处理速度慢;或文件系统慢;或操作的文件本身已经很大。
解决办法:
从程序角度来说,造成文件IO消耗严重的原因是多个线程在写大量的数据到同一文件中,导致文件很快变得很大,从而写入变慢,并造成各线程间争抢文件锁。调优方式如下:
- 异步写文件,将写文件的同步动作改为异步动作,避免应用由于写文件慢而性能下降太多
- 批量读写,频繁的读写会对IO消耗严重
- 限流,将文件IO消耗控制到一个能够接受的范围
- 限制文件大小,在超出最大值后生成一个新的文件
-
网络IO
Lunix中可以采用
sar
来分析网络IO的消耗情况。对于Java应用而言,主要使用的是tcpsck 和 updsck
这两个信息。由于没法分析具体的每个线程所消耗的网络IO,因此当网络IO消耗高时,只能对线程进行dump,查找产生了大量
-