静态资源过大
tomcat
开启静态资源压缩
compression="on"
server.xml中 compression设置为on
<Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,text/javascript,
application/javascript,text/css,text/plain,text/json"/>
docker
添加如下配置
# Whether response compression is enabled.
server.compression.enabled=false
# Comma-separated list of user agents for which responses should not be compressed.
server.compression.excluded-user-agents=
# Comma-separated list of MIME types that should be compressed.
server.compression.mime-types=text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml
# Minimum "Content-Length" value that is required for compression to be performed.
server.compression.min-response-size=2KB
如果不生效,需要修改代码:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("/static/")
.setCacheControl(CacheControl.maxAge(10, TimeUnit.MINUTES).cachePrivate())
.resourceChain(true)
.addResolver(new GzipResourceResolver());
super.addResourceHandlers(registry);
}
数据库查询sql耗时较长
需要添加索引或者优化索引
如:select * from table where a=1 and b=2;
这时候如果有两个索引 idx1(a) idx2(b),只会走idx1
需要修改为联合索引:idx(a,b)
内存溢出
运行一段时间docker挂了
-
以支付平台为例
jstat查看,没有频繁的fullgc,但是一会docker挂了,很大可能是栈内存溢出,那么需要看下线程数配置是否合理。
结果异步处理线程数为4000,太高了,改为20,docker运行平稳 -
以呷哺扫码点餐为例
old区很快就满了,经历几次fullgc后,docker挂了 分析:有大量对象无法回收,拉取内存镜像分析。
代码里有个功能是:将redis的操作记录写入mysql中,由于redis速度比mysql快得多,所以内存中积压了大量的数据,注掉该部分代码,docker运行平稳
频繁fullgc
因为总内存分配足够大,所以docker不会挂
但是对象一直回收不了,所以一直频繁gc
需要分析,都是哪些对象,为什么无法回收
比如:
server.max-http-header-size = 1000000
这个参数配置,原来配置10MB,不到1分钟old区满了,频繁gullgc
改为1MB,运行10分钟,YGC只有50次左右,没有FGC
注意事项
开始测试之前,需要统计业务各个节点的性能情况
比如:
外卖下单,一个请求30KB;要求目标tps100
统计结果:ons的tps只有20,带宽只有100mbps
分析:ons会成为瓶颈,一次外卖下单收发ons次数达到4次,那么理想情况下外卖下单tps最多到5
再比如:
带宽为10Mbps,想要达到100tps,需要尽量压缩静态资源和请求响应数据的大小,实在无法压缩只能提高带宽