某直播平台用的后台是人人SpringBoot框架。
其中获取视频流地址的接口是get请求:
https://admin.xxxxxxx.com/renren-admin/liveroom/1272354267629535233,调用后返回JSON数据:
{"code":0,"msg":"success","data":{"id":"1272354267629535233","roomId":"room_1592187871261_3f76","roomInfo":"xxxxxx"}}
目前无论是jmeter还是loadrunner,单独对该接口压测,1000并发就开始大量超时报错。而同样是查询接口,renren-api上的post请求https://api.xxxxxxx.com/renren-api/api/meetingenroll/isRegistration获取报名状态,3000并发轻轻松松没有任何问题。
观察后台进程情况发现,admin上哪怕只压测50个并发,cpu都会飙升。如图,
一些文字和图片的手机截图 描述已自动生成 image具体来分析,
# top -Hp 18711
前面十几个线程都很平均的占用cpu。
image找个排第1的来看,
# printf "%x\n" 18714
491a
# jstack 18711 | grep 491a -A 50
image
全是GC,其他几个线程也全是GC占了CPU。检查三次gccause。
# jstat -gccause 18711 2000 10
image
再看下gc日志,
手机屏幕的截图 描述已自动生成也没什么问题,虽然有Allocation Failure,但是应该不影响。
代码很简单,就一句自动生成的代码。
image试着调整启动参数,原启动参数:
java -server -Xms4096m -Xmx4096m -Xmn1024m -Xss256K -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=15 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/gc.log -Djava.awt.headless=true -jar renren-admin.jar
调下:
java -server -Xss256k -Xms2g -Xmx8g -XX:MetaspaceSize=200m -XX:MaxMetaspaceSize=4096m -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/gc_api.log -jar renren-admin.jar
然而只从1000并发提升到1200并发。。
换个思路,用jprofiler分析下到底性能损耗在哪。
JProfiler11 序列号: L-J11-Everyone#speedzodiac-327a9wrs5dxvz#463a59
100并发,api:
1、这是正常的情况
100并发,admin:
2、这是异常的情况,各种Blocked Threads
快照发现:
image这个问题参考:
https://www.iteye.com/blog/dikar-767612
http://blog.sina.com.cn/s/blog_5374d6e30100tk6q.html
应该是这个接口是get请求的问题,时间有限,来不及深究了。
先把接口改成post请求解决该性能问题,3000并发妥妥的。
网友评论