性能调优

性能调优主要包含三个方面,包括硬件、操作系统、应用程序这三大块。

硬件(cpu、内存、磁盘、网卡)

操作系统(进程、文件系统、内核…)

应用程序(nginx、mysql…)

如何进行性能调优

通过性能分析工具,为性能调优提供有效的性能监控数据,常用的工具(命令)如下:

vmstat、 htop、iostat  #检测cpu的瓶颈
free、vmstat、smem #检测内存瓶颈
iostat、iotop #检测磁盘I/O瓶颈
netstat、mtr、traceroute #检测网络连通性以及带宽瓶颈

linux性能调优工具

cpu性能调优工具
vmstat工具:
vmstat是Virtual Memory Statistics(虚拟内存统计)的缩写,很多linux发行版本都默认安装了此命令工具,利用vmstat命令可以对操作系统cpu活动、内存信息、进程状态进行监视、不足之处是无法对某个进程进行深入分析
vmstat 3 5 #每隔3秒输出一次,一共输出5次,输出结果主要查看r的值

uptime工具

mpstat工具:
mpstat是通过/proc/stat里面的状态信息进行统计,使用mpstat最大的好处是,它可以查看多核cpu中每隔计算核的统计数据,而vmstat只能查看系统整体的cpu情况
mpstat -P cpu核编号(2) 3 5
内存性能评估工具
内存监控命令free

内存状态监测工具smem命令(yum install smem -y)
Smem是一款命令行下的内存使用情况报告工具,它能够给用户提供linux系统下的内存使用的多种报告。和其他传统的内从报告工具不同的是,他有个独特的功能,可以报告PSS
smem -k -s uss # -k显示单位,-s排序,uss是对uss列做排序

磁盘性能评估工具
磁盘IO监测工具iotop命令(yum install iotop -y):
iotop是一个用来监视磁盘i/O使用状况的top类工具,可监测到哪一个程序使用的磁盘IO的实时信息。这对于线上业务系统来说非常有用
iotop -P #以进程的形式显示
iotop -u appuser #以具体的用户查看

磁盘io监控工命令iostat(yum install sysstas 默认是安装的)
iostat是I/O statistics(输入输出统计)的缩写,主要功能是对系统磁盘I/O操作进行监视。它的输出指标主要显示磁盘读写操作的统计信息
iostat -d 3 3

网络性能评估工具
1、ping检查网络延时性能

2、mtr路由跟踪命令
一般在判断网络连通性用ping和traceroute工具,ping的话可以来查看丢包率和延迟,traceroute可以用来跟踪路由,但还有一个更好的网络连通性判断工具,它可以结合ping nslookup traceroute来判断网络的相关特性,这个命令就是mtr
mtr 域名

3、traceroute命令,显示比较慢,一般不建议使用
traceroute 域名

4、iftop网卡流量监控命令
iftop是一款免费的网卡实时流量监控工具,类似于linux下面的top命令。iftop可以监控指定网卡的实时流量、端口、连接信息、反向解析ip等,还可以精确显示本机网络流量情况以及网络内各主机与本机相互通信的流量集合、非常适合于监控代理服务器或路由器的网络流量。
iftop -P -n -i eth0

系统性能综合监控工具
1、top命令

2、htop命令()
htop是linux系统中一个互动的进程查看器,与linux传统的top相比,htop更加人性化,它可以让用户交互性操作,支持颜色主题,可横向或纵向滚动浏览进程列表,并支持鼠标操作
基于java的性能调优案例
关于OOM Killer
用户可通过操作每个进程的oom_adj内核参数,来降低哪些进程被OOM Killer选中kill掉的几率。
echo -30 > /proc/1321/oom_score_adj # 修改oom_adj得分,在原来的得分基础上减去30分

在这里插入图片描述

获取进程得分的脚本

vim oom.sh
for proc in  `find /proc -maxdepth 1 -regex '/proc/[0-9]+'`;do  printf "%2d %5d %s\n"   "$(cat $proc/oom_score)" "$(basename $proc)" "$(cat $proc/cmdline)";done 2>/dev/null |sort -nr -k1|head -n 10
常见内存调优机制
手动释放缓存cache
echo 1 > /proc/sys/vm/drop_caches #释放page cache
echo 2 > /proc/sys/vm/drop_caches #释放文件节点(inodes)缓存和目录项缓存(dentries)
echo 3 > /proc/sys/vm/drop_caches #释放page cache 、inodes、dentries缓存
注意:在手动释放内存前,需要使用sync指令,将所有未写的系统缓存区写到磁盘中
swap的优化
基于java的业务系统,可修改/proc/sys/vm/swappiness内核参数,建议修改此值为10,也就是说在物理内存使用达到90%的时候,才使用交换区
在/etc/sysctl.conf文件中添加:
vm.swappiness=10
在一些基于内存的应用系统中,此值可设置为0,例如在redis/kafka/es等内存性应用中,通过优化swappiness,可以让系统最大限度使用物理内存而不是swap,提供系统性能
页缓存优化
页缓存优化(page cache)
要优化page cache,需要关注两个操作系统内核参数:
1、/proc/sys/vm/dirty_background_ratio:指定了当文件系统缓存脏页,数量达到系统内存百分之多少时(默认10%)就会触发pdflush/flush/kdmflush等后台回写进程运行,建议将vm.dirty_background_ratio设置为5%。
2、/proc/sys/vm/dirty_ratio:这个参数指定了当文件系统缓存脏页数量达到系统内存百分之多少时(默认20%),系统不得不开始处理缓存脏页(因为此脏页数量已经比较多,为了避免数据丢失需要将一定脏页刷入磁盘),建议vm.dirty_ratio设置为10%。

在这里插入图片描述

排查java进程占用cpu过高的思路
定位有问题的进程pid
top
定位有问题的线程的pid
常用的命令有两个:
ps -T -p <pid>
top -H -p <pid>
将线程的pid转换为16进制数
printf '%x\n' tid
注意,此处的tid为上一步找到的占cpu高的线程号
jstack 进程id | grep 线程id(16进制)
OutOfMemory故障处理
JVM内存回收过程与优化建议:
JVM采用分代回收的策略,用较高的频率对年轻的对象进行YCC,YCC是小幅度、快速的GC回收,如果这种小幅度的调整收集仍不能腾出足够的内存空间,就会触发Full GC,此时JVM GC会停止所有的堆中运行的线程并执行清楚操作。FULL GC收集的时间较长、频繁的FULL GC严重影响系统的性能,因此,我们要尽量减少FULL GC的次数

JVM参数设置的一些原则:
	合理减少对象进入老年代
	新生代非常重要
	
	
JVM内存设置参数
要设置JVM内存参数、可以通过JAVA_OPTS来实现,看下面这个例子:
JAVA_OPTS='-server -Xms2048m -Xmx2048m -XXSurvivorRatio=3 -XX:PermSize=128M -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=256m'

1、-server:指定JVM的运行模式为服务器模式,一定要作为第一个参数,此参数在多个CPU时可大幅度提升性能
2、-Xms:表示JVM初始分配的堆内存大小,堆内存的最小值
3、-Xmx:表示JVM最大允许分配的堆内存大小
4、-XXSurvivorRatio:设置年轻代Eden区与两个Survivor区的比值。注意有两个Survivor区,这里的3表示Eden/Survivor=3:2
5、-XX:PermSize:表示JVM初始分配的永久代内存,此参数在jdk7以及以下版本有效;jdk1.8及以后版本使用 -XX:MetaspaceSize 元空间初始大小
6、-XX:MaxPermSize:表示JVM最大允许分配的永久代内存;jdk1.8及以后版本使用 -XX:MaxMetaspaceSize 元空间最大大小
7、-XX:NewSize:表示JVM启动时YOUNG的初始内存大小
8、-XX:MaxNewSize:表示最大的YOUNG内存大小
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐