Linux系统调优
调优步骤
衡量系统现状:包括系统的请求次数,响应时间,资源消耗等
设定调优目标:
寻找性能瓶颈:
资源消耗主要集中在CPU,文件IO,网络IO,内存
CPU消耗分析:
CPU主要用于中断,内核,用户进程的处理
上下文切换,运行队列,利用率的概念
对于java应用,CPU消耗严重通常体现在us用户进程和sy内核上
us:
us高表示应用消耗了大量CPU,Java应用造成us高的原因一是线程一直处于可运行的状态,没有任何挂起动作,二是频繁的GC
sy:
sy高表示线程一直在切换,Java应用造成sy高的原因一是线程太多,切一直处于阻塞和执行的状态,二是锁竞争激烈,三是有较多网络IO操作
文件IO消耗分析:
原因主要是多个线程同时写入大量数据到同一文件中,造成文件很快变大,写入速度变慢,同时各个线程争抢文件锁
网络IO消耗分析:
原因主要是同时需要发送或接收的packet太多
内存消耗分析:使用pidstat和top命令共同分析堆外内存的消耗情况,使用jvm分析工具堆内存消耗情况。
对jvm堆内存外的物理内存的消耗:分析DerectByteBuffer类的使用情况
对jvm堆内存的消耗:使用可视化工具分析具体对象的内存占用。
资源消耗不多,但程序执行慢
1、锁竞争激烈
2、没有发挥硬件性能
3、数据量增长
调优
JVM调优
1、代大小调优
调节参数-Xms -Xmx -Xmn -XX:SurvivorRatio -XX:MaxTenuringThreshold
①-Xms -Xmx通常设置相同值
②避免新生代过大过小
新生代过大导致老年代过小,fullGC发生概率增加,还会导致minorGC耗时大幅提高;
新生代过小导致minorGC更加频繁,还会导致对象更容易进入老年代,导致fullGC
③避免survivor区过大过小:默认811
survivor区过大导致eden区过小,fullGC更加频繁
survivor区过小导致minorGC之后对象更容易进入老年代。
④合理设置存活周期:默认15次
2、GC策略调优
参考垃圾收集器的选择
程序调优(代码调优)
1、CPU消耗严重
us高:第一种原因的常见方法是对线程添加Thread.sleep(),释放CPU执行权;第二种原因是jvm调优
sy高:第一种原因是减少线程数量;第二种原因是降低锁的竞争;第三种原因是采用协程来支持高并发
2、文件IO消耗严重
①异步写文件
②批量读写
③限流
④限制文件大小
3、网络IO消耗严重
限流,限制packet发送频率
4、内存消耗严重
①释放不必要的引用
②使用对象缓存池
③采用合理的缓存失效算法,控制缓存池中对象的数目
④合理使用软引用和弱引用
锁竞争激烈
1、使用并发包中的类或接口
2、使用Treiber算法
3、使用Machael-Scott非阻塞队列算法
4、尽可能少用锁
5、使用拆分锁。读锁和写锁