对于服务器来说,QPS上不去,无非3个原因,CPU、内存、网络问题。
一、CPU性能调优分析
1、查看CPU利用率
1)查看服务的CPU利用率(top命令)
应用CPU占20%,空闲80%
2)查看jmeter的CPU
正常
2、如何调优
用arthas查看线程
用jvisualvm查看CPU使用率,线程组都是绿的
二、网络性能调优分析
1、查看网卡
先使用ifconfig命令,查看当前所需ip对应的网卡名,比如eth0
2、查看网卡类型(是千兆还是百兆)
命令:ethtool 网卡名
比如ethtool eth0
3、查看网卡流量
命令:nload 网卡名
比如nload eth0
nload命令查看网卡当前流量。
nload命令可以查看各个网络设备的当前网络速率,也会展示流经设备的总流量。
CentOS安装命令:
yum install -y epel-release && yum install -y nload
4、说明
Incoming:进入网卡的流量
Outgoing:出网卡的流量
Curr:当前流量
Avg:平均流量
Min:最小流量
Max:最大流量
Ttl:总和流量
三、内存jvm性能调优
1、jvisualvm连接远程服务器jvm
1)在远程机器上添加权限策略文件
在服务器{JAVA_HOME}/bin目录建立文件:jstatd.all.policy
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
2)启动远程机器的jstatd
jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=10.1.117.2 -J-Djava.rmi.server.logCalls=true
说明:
-J-Djava.rmi.server.hostname:设置主机IP
-J-Djava.rmi.server.logCalls:启动RMI日志功能
3)本地jvisualvm加入远程主机
2、jvisualvm安装插件
工具 - 插件(全部安装)
如果无法下载可以手动下载Visual GC插件再导入:
https://visualvm.github.io/uc/8u131/updates.html
工具 - 插件 - 已下载 - 添加插件
3、分析java服务
花费多少次gc,stw总共耗费多长时间?
1)tomcat设置200个线程,demo服务堆设置512M:
18次gc,old区2次gc,吞吐量80
2)提升java服务的jvm大小
堆设置为1g
java -jar -Xms1g -Xmx1g -Dspring.config.location=/appserver/application.properties demo-0.0.1-SNAPSHOT.jar &
12次gc,old区2次gc,吞吐量85
3)提升java服务的jvm为G1
java -jar -Xms1g -Xmx1g -XX:+UseG1GC -Dspring.config.location=/appserver/application.properties demo-0.0.1-SNAPSHOT.jar &
14次gc,old区0次gc,吞吐量90
四、tomcat性能调优
1、参数
#最大线程数是300,初始化线程是100
server.tomcat.threads.min-spare=100
server.tomcat.threads.max=300
server.tomcat.accept-count=1000
server.tomcat.max-connections=2000
server.tomcat.connection-timeout=2000
2、说明
1)server.tomcat.threads.min-spare:最小线程数
2)server.tomcat.threads.max:最大线程数
3)server.tomcat.accept-count:
accpet-count当调用web服务的http请求数达到tomcat的最大线程数时,还有新的http请求到来,这是tomcat会将该请求放在等待队列中,这个accept-count就是指能够接受的最大等待数,默认100。如果等待队列也放满了,这个时候再来新的请求就会被tomcat拒绝(connection refused)
4)server.tomcat.max-connections:最大链接数,默认不设置,默认是10000。这个参数是指在同一时间,tomcat能够接受的最大连接数。一般这个值要大于(max-threads)+(accept-count)
5)server.tomcat.connection-timeout:链接建立超时时间,最长等待时间,如果没有数据进来,等待一段时间后断开连接,释放线程
3、测试
还是1g堆内存,G1垃圾收集器,添加tomcat参数,吞吐量100
五、小结
针对springboot项目
1、cpu:一般不用怎么改,默认200条线程就行。
2、网络:每秒传输100k,对网卡而言小意思了
3、内存:建议今后的项目都采用G1就行了,G1的性能相对而言是较好的
4、tomcat:优化线程和连接数
5、linux参数:减少TIME_WAIT,加大ulimit最大进程数和最大文件打开数
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
6、监控系统资源,比如CPU使用率、磁盘响应时间
图上cpu快跑满,磁盘响应快1s。。。