正当我们庆幸开发过程如此顺利的时候,压力测试的结果给我们敲响了警钟。
用户登录+下单的每秒事物数仅能达到100个左右,这样的速度与项目的要求相去甚远。
一、调优准备
于是,我们首先进行了各种监控设置,为调优提供必要前提:
1、远程连接JVM监测
vi startWeblogic.sh
JAVA_OPTIONS="${SAVE_JAVA_OPTIONS} -Djava.rmi.server.hostname=10.88.115.182-Dcom.sun.management.jmxremote.port=18999-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false"
增加上述参数,可以使用JDK自带的jvisualvm工具进行远程监控虚拟机的健康情况。
2、启动WebLogic控制台,重点关注,
1)环境——服务器——监视——性能
主要查看堆空间百分比、堆空闲空间、CPU负载状态、物理内存使用情况,来决定虚拟机和物理机的内存分配。
2)服务器——监控——线程数
主要查看服务器当前连接线程数,挂起线程数和最大线程数。可以根据此处监控的情况,来决定服务器最大线程数的取值。
3)服务——数据源——监控
主要查看数据库连接池的活动连接数,最大活动连接数。这里需要配置JNDI数据源,虽然我们最终可能会使用c3p0,但我建议此处配置一个JNDI用于监控。等我们找到了系统瓶颈,并找到最适当的连接池大小后再切回c3p0不同。
3、可使用操作系统的top和sar -u 2 10命令,来实时观测服务器的CPU,内存,IO等的使用情况。
二、调优步骤与结果
经过我们的反复尝试,做了以下设置:
1、操作系统
Linux version 2.6.32-431.23.3.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org)(gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Thu Jul 3117:20:51 UTC 2014
1)可以使用ulimit -u 1200来将最大线程数提升到1200或者其它值。
但由于操作系统的限制,单用户最大线程数无法突破1200
2) vi /etc/security/limits.conf添加weblogic soft nproc 22000即可将最大线程数调为22000
vi/etc/security/limits.d/90-nproc.conf内容编辑修改为 * soft nproc unlimited,意思是任意用户的线程不限制
修改上面两个文件,才能突破单用户最大线程数不能超过1200的限制。
2、应用服务器与虚拟机
Weblogic12 + 64位JDK7.0
1)设置最大最小堆内存:
vi setDomainEnv.sh
WLS_MEM_ARGS_64BIT="-Xms3g -Xmx3g"
2)设置生产模式:
vi startWeblogic.sh
JAVA_VM="-server”
vi setDomain.sh
PRODUCTION_MODE="true"
3)设置Weblogic线程数:
vi startWeblogic.sh
JAVA_OPTIONS后新增: -Dweblogic.threadpool.MinPoolSize=2400 -Dweblogic.threadpool.MaxPoolSize=2400 |
线程数的增加需同时调整linux用户的最大线程数,如果不调整可能会在启动时报内存溢出。
经过上述调整,我们的系统每秒事物数能够接近1000,可接受1000个用户的并发登录+下单。然而,此时我们发现,系统的能力还远远没有发挥出来——CPU负载仅达到百分之二十,3GB的虚拟机堆内存剩余1GB,2400的最大线程数剩余1400,300的数据库连接池只使用3~5。我们猜测,瓶颈应该在程序中;接下来,我们从系统调优进入到了程序调优中,来进一步提升系统吞吐率。