Memcached集群性能测试有感:请使用尽可能高配置的性能测试服务器
2010年04月06日
"应使用尽可能好配置的性能测试服务器",这句话初看就是句费话!谁不想用好配置的机器当服务器呢?
在最近一次Memcached集群性能测试中,由于资源紧张,使用了配置相对差的几台服务器作了集群,而且这几台服务器配置还不全一样。
遇到一个非常诡异的现象,在进行稳定性测试过程中缓存命中率一步下降。单台服务器每秒事务数可超过2万,五台集群在一起,反而3万都达不到,而且出现大量连接超时的现象。百思不得其解。 每每遇到性能问题,分析常是最头疼的事情。上述现象,表现上看起来是应用程序稳定性不好,但为什么单台性能那么好,而集群5台反而差呢?其中一定有蹊跷。
首先我开始怀疑我的测试过程是否有错误或遗漏,但是翻查了过往的测试结果,过去的测试数据中确实没有未命中的情况。
加大压力后,开始出现大量"连接超时"、"连接被重置"的错误。然后观察了一下服务端的Tcp连接状态,发现当连接数超过3000时后Syn_recv状态逐步变多。过程中状态变多,说明服务器开始出现性能瓶颈。此时点击率还不到3000,这绝不是服务器的最大处理能力! 开始做减法,逐步排查。首先排除连接数的干扰,使用尽量少的虚拟用户来测试服务器的最大处理能力。果然,服务器点击率达近1万。那么就是连接数导致性能下降的!Cpu使用率不高、内存大量剩余、磁盘IO也没有瓶颈。这下就不能不怀疑Java了,它在做什么呢?
然后用Jconsole监控了一下JbossWeb这一看我就明白了,连接就占用了内存,内存耗尽Java频繁的GC,所以就导致连接超时、连接被重置。
随之给Java分配足够的内存,可是加大压力,还是会出现一些连接超时和连接重置的问题,但量要明显减少。为彻底查清问题,再做减法。不测程序,直接测静态页面。发现静态页面也存在连接超时、连接被重置的现象。CPU使用率接近80%,软中断占用CPU不断升高,连接数不断添加,后续出现大量Time_wait。明显这表示已经达到硬件的最高性能了。