最近在网络上看到一个关于Linux下socket数量限制相关的讨论,主要讨论在linux下,是否能支持10甚至百万个tcp并发连接。
讨论 1:在32为系统下,最大连接数的极限值是多少?
从系统内存的角度考虑,32位系统最大支持4G内存,内核空间为1G。如果每个socket占用的内存为C,那么最大连接数为:
maxconn = 1GB/C
如何分析每个socket占用的内核空间内存呢?分析socket占用内存的组成部分:文件系统inode + socket结构 + tcp windows。
tcp windows的内存实际上就是挂在sk结构下的skb队列,skb是真正存储数据的地方,也就是消耗内存的地方。如果CPU的响应速度足够快,网络响应也很快,
那么skb队列只需要保留1个就可以,假定为1.5K。
文件系统inode + socket结构 是固定大小的,大约为1K。
理想情况下:每个socket占用的内存为2~3K。以2K计算,内核空间实际可用内存约在800M,那么800M/2K = 400K.
粗略估计,Linux下,32位系统,能支持40万tcp并发连接差不多就到极限了。
分析过程是否有问题,还望高手指教。
HAProxy是通过socket的方式实现的,一直没有找到关于最大并发连接的测试结果,在32位Linux上,最大值估计在20万并发连接左右。