分类: LINUX
2012-05-29 13:31:50
一.原先问题: 压用户数据初始化接口时,100~200并发时报如下异常:
info: Can not connect to MySQL server
Time: 2011-8-8 10:37am
Script:
Error: Can't connect to MySQL server on '10.168.22.85' (99)
Errno.: 2003
开发经过调整数据库参数问题依然存在。
2.tps波动比较大。
发现web服务器出现很多的,且两波峰之间时间为:45秒,
实际应用中常用的是30秒,1分钟和2分钟等因此上述波动也是因为TIME_WAIT很多,最少没有TCPL连接可用造成的,直到2MSL服务器才释放连接造成的。
自我析:主要高并发时报很web服务器报很多TIME_WAIT,此种错误是有可能来自web,本身,也有可能是数据库,可以有两种修改方法:由修改web参数,由keep-alive 保持为on,同时修改keep timeout时间,要不就同时修改web,和数据库系统参数,使TCP共享连接。
如下:
二.今天上午开发做了系统参数调整后,发现问题解决,tps也达到预期值:
WEB服务器、跟数据库服务器的操作系统我都作了调化
sysctl -w net.ipv4.tcp_tw_reuse=1
新的连接可以重新使用TIME-WAIT套接字(rhel4.8默认为0)
sysctl -w net.ipv4.tcp_tw_recycle=1
启动TIME-WAIT套接字状态的快速循环功能(rhel4.8默认为0)
sysctl -w net.ipv4.tcp_fin_timeout=30
套接字关闭时,保持FIN-WAIT-2状态的时间(rhel4.8默认为60)
sysctl -w net.core.wmem_max=8388608
sysctl -w net.core.rmem_max=8388608
对于所有协议的队列,设置最大系统发送缓存(wmen)和接收缓存(rmem)到8M(rhel4.8默认为131071)
注:开发只是用命令进行了临时调整,如果要长期保存上述配置,需要修改系统配置文件:/etc/sysctl.conf ,且需要重启服务器。
测试结果:通过以上修改参数后,两问题解决!
-------------------以下是我与开发方的谈话------------------
为什么调上面的参数:
Me: 上次那个为什么报与数据库连接失败,按道理是应该调web,或数据库参数,为什么你上次调系统参数就可以了
且只优化了TIME-WAIT套接字 而已
~~~ 10:51:54
我的理解是当压力测试的时候,WEB服务器会产生大量的TCP/IP连接,我用netstat -anp | wc -l查看了一下将近有3万的网络套接字,此时CPU也耗尽,导致这么多的TCP/IP连接CPU处理不过来,而使部分TCP/IP连接超时或处理失败
后来调整参数之后,再进行压力测试时只有一千左右的网络套接字,当跑到1000多TPS时,有3千左右的网络套接字
总结:如果报超时,数据库连接失败等可考虑tcp连接数的问题,如果超过“万条”连接数,则要优化,tpc连接数.