今天压力测试某服务时发现一个特别诡异的问题,redis-cli连接后端redis-server,客户端所在的服务器只能建立28232个连接,然后就返回errorno = 1,然后更奇葩的是系统负载直线上升到idle=0
因为用的是虚拟机,一直怀疑虚拟机是共用宿主机的本地端口,但咨询了系统的同学说,这个没有问题,再加上每次都是整好这个数,觉得必有蹊跷,决定做如下两个测试:
1.用多台服务器的客户端压测redis-server,redis连接数只能到5W——redis中设置了maxclients,修改之后,能突破6W
2.用同一台服务器上客户端上压测多redis-server,连接1个server能到28232个连接后,仍然还能连接20000个连接到其他redis
这两个结果推翻了宿主机本地端口限制的怀疑。
到底是为什么呢?继续咨询牛人,提示我们看看ip_local_port_range的参数
cat /proc/sys/net/ipv4/ip_local_port_range
发现是:32768 61000
正好相差28232个!!!
咨询我们的OP,为什么设置这么一个参数?得到的答复是,为了避免一些server程序的listen端口被占用而无法启动。
那为什么没有空闲本地端口idle=0呢?通过查看故障时的监控发现,硬中断变得很多,每秒钟5000+
解决问题中查的几个资料记录下来:
http://www.oschina.net/question/17_31076
https://www.cyberciti.biz/tips/linux-increase-outgoing-network-sockets-range.html
http://blog.chinaunix.net/uid-116213-id-3376727.html
http://www.lenky.info/archives/2013/03/2245
http://blog.csdn.net/bd_zengxinxin/article/details/51781630
同时有一个小小的感悟:如果怀疑他,就亲手去验证他!