性能监控/优化系列——IO
程序员文章站
2022-07-14 12:20:03
...
Network I/O相关
1. 在分布式系统中会比较容易发现network bandwidth or network I/O方面的性能。
2. 如果系统的网络接口发送的数据大于网络硬件所能处理的值,那么数据就会被缓存到OS的buffer中,造成系统的延时。
3. netstat命令有局限性,不能统计到网络目前的吞吐量、利用率、饱和度等,nicstat这个小工具更好用,包含读写率(字节和包)、利用率和饱和度:
Time Int rKB/s wKB/s rPk/s wPk/s rAvs wAvs %Util Sat 19:24:16 yukonx0 0.75 4.68 2.72 3.80 281.3 1261.9 0.00 0.00 19:24:17 yukonx0 54.14 1924.9 724.1 1377.2 76.56 1431.2 1.58 0.00 19:24:18 yukonx0 44.64 1588.4 598.0 1138.0 76.45 1429.3 1.30 0.00 19:24:19 yukonx0 98.89 3501.8 1320.0 2502.0 76.72 1433.2 2.87 0.00 19:24:20 yukonx0 0.43 0.27 2.00 3.00 222.0 91.33 0.00 0.00 19:24:21 yukonx0 44.53 1587.2 598.0 1134.0 76.26 1433.2 1.30 0.00 19:24:22 yukonx0 101.9 3610.1 1362.0 2580.0 76.64 1432.8 2.96 0.00 19:24:23 yukonx0 139.9 4958.1 1866.7 3541.4 76.73 1433.6 4.06 0.00 19:24:24 yukonx0 77.23 2736.4 1035.1 1956.2 76.40 1432.4 2.24 0.00 19:24:25 yukonx0 48.12 1704.1 642.0 1220.0 76.75 1430.3 1.40 0.00 19:24:26 yukonx0 59.80 2110.8 800.0 1517.0 76.54 1424.8 1.73 0.00
4. IO和NIO,NIO并不比传统IO快,而是在高并发场景下能够有效减少thread数,从而提供CPU的利用率。原因为:传统的IO在accept到一个socket后,一个线程会负责这个socket的读写,如果这个过程中数据还没有准备完毕这个线程会一直等待直到数据处理完或超时。NIO采用的是selector方式,accept到一个socketChannel后,会将这个socketChannel注册到seletor名下,这个时候并不需要worker线程,当读写的数据准备好时seletor会有响应的事件产生,此刻再将这个socketChannel丢给一个worker线程,既然数据都准备好了,worker线程就不需要等待直需要做相应的业务逻辑。从上面的分析可知,在高并发环境下,传统IO需要更多的worker线程(数据准备等待的开销都在它上面),而NIO确是直接读写数据就好了,没有什么等待,所以worker线程数相对较小。
5. 优化:大量小数据网络读写会消耗很多的CPU,优化方法可以有:减少网络调用(合并数据,压缩),使用NIO减少线程数,线程越多维护的开销就越大。
磁盘 I/O相关
1. 对于磁盘IO密集型应用需要严格监控磁盘IO的利用率,eg数据库。
2. 常用的命令iostat -xm,它能够监控disk I/O utilization and system or kernel CPU utilization。另外还有:sar
$ iostat -xm 5 avg-cpu: %user %nice %system %iowait 0.20 0.40 16.37 83.03 Device: rrqm/s r/s rsec/s rMB/s avgqu-sz await svctm %util hda 9662.87 305.59 87798.80 42.87 1.64 5.39 3.17 97.01 hdb 7751.30 225.15 63861.08 31.18 1.18 5.24 3.11 69.94
3. 最好能够监控到哪些应用在使用磁盘IO,都读了哪些文件。
4. 如果发现磁盘的利用率很高,需要分析你的应用所用磁盘的性能,指标:disk service times, seek times, and the time spent servicing I/O events。
5. 从硬件和OS级别提高磁盘IO的能力:1)A faster storage device,如ssd,futionIO;2)多磁盘(或阵列)均衡压力;3)调优OS的cache;4)启用磁盘cache。
6. 对于应用来说,可以使用本地缓存/分布式缓存集群来减少磁盘IO的压力。另外在编成过程中启用读写缓存也能很好的减少与磁盘IO的交互次数,如java.io.BufferedOutputStream and java.io.BufferedInputStream。
下一篇: java 读取输入流