记一次应用调优过程
压力测试使用jmeter工具,本文就不再介绍!
下载地址:apache softs
1.linux系统调优
1)用户资源限制(文件句柄数、进程数等)
vim /etc/security/limits.conf
tomcat soft nproc 2047
tomcat hard nproc 16384
tomcat soft nofile 10240
tomcat hard nofile 65535
vim /etc/pam.d/login
session required pam_limits.so
service sshd restart
2)socket回收
socket-详细分析No buffer space available
2.线程池
server:
port: 8080
tomcat:
max-threads: 800
accept-count: 1200
min-spare-threads: 75
3.数据库连接池
并发性能测试时,若不考虑数据库性能,可以将连接池设置为不受限,从而测试应用瓶颈。
单从数据库角度,**连接数 = ((核心数 * 2) + 有效磁盘数)**肯定是性能最好的,但是还是要根据实际情况,例如长、短事务进行分析。
核心数不应包含超线程(hyper thread),即使打开了hyperthreading也是。如果活跃数据全部被缓存了,那么有效磁盘数是0,随着缓存命中率的下降,有效磁盘数逐渐趋近于实际的磁盘数。这一公式作用于SSD时的效果如何尚未有分析。
4核i7数据库服务器的连接池大小应该为((4 * 2) + 1) = 9
下面是自测结果:应用并发峰值100的情况下,确实数据库连接池为10好一点点!
aggregate-ehcache-pool10
aggregate-ehcache-pool100
比如一个混合了长事务和短事务的系统,通常是任何连接池都难以进行调优的。最好的办法是创建两个连接池,一个服务于长事务,一个服务于短事务。
再例如一个系统执行一个任务队列,只允许一定数量的任务同时执行,此时并发任务数应该去适应连接池连接数,而不是反过来。
4.jvm调优
/bin/catalina.bat
set CLASSPATH=
set JAVA_OPTS=%JAVA_OPTS% -server -Xms4096M -Xmx4096M -Xmn1536M -XX:PermSize=512M -XX:MaxPermSize=1024M -XX:SurvivorRatio=8 -XX:+UseFastAccessorMethods -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=4 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80 -XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -verbose:gc -Xloggc:../logs/gc.log -Djava.awt.headless=true
5. IO阻塞
主要体现在文件写入(ftp或本地磁盘IO)、控制台日志输出、logback日志写入(同步写、异步写、多线程写)
可通过线程dump分析,jvisualvm.exe或jstack.exe生成线程dump
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
configuration:
**#此处为mybatis-plus通过system.out输出日志到控制台,影响性能(禁用可提升2~3倍)**
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
druid:
filters: stat,config
min-idle: 10
max-active: 100
max-pool-prepared-statement-per-connection-size: 20
min-evictable-idle-time-millis: 300000
initial-size: 10
max-wait: 60000
time-between-eviction-runs-millis: 120000
pool-prepared-statements: true
# 高并发性能低
**test-on-borrow: false**
test-on-return: false
test-while-idle: true
# 持活,检测间隔默认1分钟(不宜超过3分钟,华为防火墙跨网段切断空闲连接时限3分钟)
**keep-alive: false**
validation-query: SELECT 'x' FROM DUAL
# 校验超时1秒
validation-query-timeout: 1
6.资源泄露不限于线程泄露、内存泄露
通过jdk自带工具jvisualvm.exe,若活动线程数,持续增加则可能存在线程泄露。
7.缓存击穿
1)now()当前时间等动态参数导致mybatis二级缓存失效
2)redis null值击穿
8.虚拟化共享CPU抢占
若最后一列,占用过高,极有可能是其它应用容器或虚拟机在抢占CPU
9.多线程同步锁
mybatis本地二级缓存同步锁
@CacheNamespace(flushInterval = 600000, size = 4096, implementation = org.mybatis.caches.ehcache.EhcacheCache.class)