近期在进行一个项目的性能调优, 目标是支撑 1000 的并发数;
web容器:apache2+tomcat6
jvm:jdk6 linux x64
程序:status2+spring+ibatis
缓存:memcache
服务器:4颗双核cup 8G内存
由于本项目是网站项目只做展示用, 对时时性没要求, 做了几乎所有对象的缓存, memcache也在本机
测试一:
设置tomcat内存 CATALINA_OPTS="-Xms1024m -Xmx1024m -Xmn256m",然后使用apache ab 测试;
ab -c 500 -n 5000 url
使用 Jprofiler6 查看运行状况;主要看了内存, jvm线程, cpu 和 CG这几项
注:对 Jprofiler 使用不熟悉,初次使用, 有些数据记不太清了
内存:增长非常快, 主要是char[ ]非常高, 300-500M
jvm线程:运行线程(runnable) 在 460-500之间, 锁定线程(blocking)在 10 和 500左右跳动 , Net I/O 在 200左右, waiting 在几十左右
cpu:占用率最高的是 ognl 的getValue
cg:年轻代非常的频繁, 老年代几乎占满, cg非常频繁, cpu消耗80%左右
在使用ab压力的时候, 同时使用ie打开页面,不能访问,出现 502 错误, tomcat控制台频繁报(org.apache.jk.common.ChannelSocket processConnection
WARNING: processCallbacks status 2
)
测试二:
设置tomcat内存 CATALINA_OPTS="-Xms3000m -Xmx3000m -Xmn768m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSInitiatingOccupancyFraction=70",然后使用apache ab 测试;
ab -c 1000 -n 10000 url
同样使用 Jprofiler6 查看运行状况;主要看了 jvm线程, cup 和 CG
jvm线程:运行线程(runnable) 在 10以下, 锁定线程(blocking)在 1000左右 , Net I/O 在 300-500左右, waiting 在几十左右
cpu:占用率最高的是 ognl 的getValue
cg:年轻代同样非常的频繁, 由于增加了内存, 调整了gc参数,老年代在70%的时候gc, 没有出现占满的情况对老年的gc减少很多,gc的 cpu消耗20%-30%左右
在使用ab压力的时候, 同时使用ie打开页面,速度稍慢一点,但在5-10秒内可以正常访问页面, tomcat控制台只出现过一次
(org.apache.jk.common.ChannelSocket processConnection
WARNING: processCallbacks status 2
)
总结:
经过上诉两次测试, 发现加大内存后老年代gc次数减少,占有cpu资源明显减少, tomcat 的效率提升非常的明显, 轻松应对了1000的并发测试, tomcat和web程序都是使用jvm, 看来不仅是web程序对内存有需求, 还得考虑 tomcat 自身对内存的需求。有不对的地方欢迎大家指出
疑惑:
对于tomcat线程有点疑惑, 加大内存后,运行线程怎么会一下这么少了呢, 锁定线程猛增; 在Jprofiler thread views 中找了个线程来查看状态, 发现首先是运行状态, 然后进入锁定状态, 会在锁定状态保持很久, 然后又可能变为运行状态, 或等待状态, 直到消亡,对tomcat的线程处理没研究过不熟悉, 对两次测试的 Jprofiler 的vm线程数据差别这么大, 没能理解, 在完成对高并发的支持 运行线程反而会减少。。。
的确测试不够专业, 系统问题出来了, 运行段时间后, 1天 2天不等, tomcat的线程会满, 我设置的最大线程是2000, 停掉apache后tomcat线程就会下来, 然后再启动apache, 用ie访问速度还行, 不一会tomcat线程又堆积上去了, 最终重启tomcat就恢复正常了。 apache日志分析, 大概每秒访问量在30-40之间, 至今还未找到原因, 唯一的线索 Jprofiler 查看 cup 发现 ognl 消耗很高。
请直接从程序找原因,都是内存里的操作,还每秒 30-40,性能很一般嘛!Memcache的使用方式对否,是不是可以直接使用Java的Map呢?
web容器:apache2+tomcat6
jvm:jdk6 linux x64
程序:status2+spring+ibatis
缓存:memcache
服务器:4颗双核cup 8G内存
由于本项目是网站项目只做展示用, 对时时性没要求, 做了几乎所有对象的缓存, memcache也在本机
测试一:
设置tomcat内存 CATALINA_OPTS="-Xms1024m -Xmx1024m -Xmn256m",然后使用apache ab 测试;
ab -c 500 -n 5000 url
使用 Jprofiler6 查看运行状况;主要看了内存, jvm线程, cpu 和 CG这几项
注:对 Jprofiler 使用不熟悉,初次使用, 有些数据记不太清了
内存:增长非常快, 主要是char[ ]非常高, 300-500M
jvm线程:运行线程(runnable) 在 460-500之间, 锁定线程(blocking)在 10 和 500左右跳动 , Net I/O 在 200左右, waiting 在几十左右
cpu:占用率最高的是 ognl 的getValue
cg:年轻代非常的频繁, 老年代几乎占满, cg非常频繁, cpu消耗80%左右
在使用ab压力的时候, 同时使用ie打开页面,不能访问,出现 502 错误, tomcat控制台频繁报(org.apache.jk.common.ChannelSocket processConnection
WARNING: processCallbacks status 2
)
测试二:
设置tomcat内存 CATALINA_OPTS="-Xms3000m -Xmx3000m -Xmn768m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSInitiatingOccupancyFraction=70",然后使用apache ab 测试;
ab -c 1000 -n 10000 url
同样使用 Jprofiler6 查看运行状况;主要看了 jvm线程, cup 和 CG
jvm线程:运行线程(runnable) 在 10以下, 锁定线程(blocking)在 1000左右 , Net I/O 在 300-500左右, waiting 在几十左右
cpu:占用率最高的是 ognl 的getValue
cg:年轻代同样非常的频繁, 由于增加了内存, 调整了gc参数,老年代在70%的时候gc, 没有出现占满的情况对老年的gc减少很多,gc的 cpu消耗20%-30%左右
在使用ab压力的时候, 同时使用ie打开页面,速度稍慢一点,但在5-10秒内可以正常访问页面, tomcat控制台只出现过一次
(org.apache.jk.common.ChannelSocket processConnection
WARNING: processCallbacks status 2
)
总结:
经过上诉两次测试, 发现加大内存后老年代gc次数减少,占有cpu资源明显减少, tomcat 的效率提升非常的明显, 轻松应对了1000的并发测试, tomcat和web程序都是使用jvm, 看来不仅是web程序对内存有需求, 还得考虑 tomcat 自身对内存的需求。有不对的地方欢迎大家指出
疑惑:
对于tomcat线程有点疑惑, 加大内存后,运行线程怎么会一下这么少了呢, 锁定线程猛增; 在Jprofiler thread views 中找了个线程来查看状态, 发现首先是运行状态, 然后进入锁定状态, 会在锁定状态保持很久, 然后又可能变为运行状态, 或等待状态, 直到消亡,对tomcat的线程处理没研究过不熟悉, 对两次测试的 Jprofiler 的vm线程数据差别这么大, 没能理解, 在完成对高并发的支持 运行线程反而会减少。。。
的确测试不够专业, 系统问题出来了, 运行段时间后, 1天 2天不等, tomcat的线程会满, 我设置的最大线程是2000, 停掉apache后tomcat线程就会下来, 然后再启动apache, 用ie访问速度还行, 不一会tomcat线程又堆积上去了, 最终重启tomcat就恢复正常了。 apache日志分析, 大概每秒访问量在30-40之间, 至今还未找到原因, 唯一的线索 Jprofiler 查看 cup 发现 ognl 消耗很高。
请直接从程序找原因,都是内存里的操作,还每秒 30-40,性能很一般嘛!Memcache的使用方式对否,是不是可以直接使用Java的Map呢?
转载于:https://blog.51cto.com/lya041/666248