Linux单机TCP并发连接
来源:互联网 发布:商城优化方案 编辑:程序博客网 时间:2024/05/17 07:21
1.服务端与16位的端口号(最大65535)没什么关系
服务端ip+port(监听端口) + 客户端ip+port 决定了一条连接,客户端连接服务器后,服务端并没有又分配一个物理端口与客户端连接。其实所有的数据还是通过监听端口接收与发送的(不论全双工与半双工,反正都是双工的),只不过多了一个逻辑上的socket。这些都应该是网卡上的事情,当接收到一个字节流的时候,网卡就会回调给操作系统,回调的时候会告诉操作系统客户端ip+port,假如是epoll模型,那么这次可能只接收了几个字节,回调那个新的socket的特定方法。然后下一次从监听端口回调上来的数据可能是另外的一个逻辑上的socket,各自互不影响。
2.内存限制
系统为每个TCP 连接分配一个TCP 控制块(TCP control block or TCB)。一个tcb控制块大概要占用1k多的内存,假如百万连接,1个tcb占用1k内存,那么就需要1G的内存了,这还是理想情况,一般情况下tcb要大于1k内存。当每个连接上在有数据传输的时候,同时需要的内存就更大了。
另外需要设置的tcp参数有tcp的读写缓冲区,默认为86k,都可以改成4k。此外需要修改tcp_mem的值。
- tcp_mem(3个INTEGER变量):low, pressure, high
- low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。
- pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。
- high:允许所有tcp sockets用于排队缓冲数据报的页面量,当内存占用超过此值,系统拒绝分配socket,后台日志输出“TCP:
- too many of orphaned sockets”。
tcp_mem(3个INTEGER变量):low, pressure, highlow:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。high:允许所有tcp sockets用于排队缓冲数据报的页面量,当内存占用超过此值,系统拒绝分配socket,后台日志输出“TCP:too many of orphaned sockets”。
3.文件句柄限制
每个socket都是一个文件句柄,Linux下文件句柄限制,包括linux允许的最大文件句柄,linux允许的最大同时活动的文件句柄。
4.网卡限制
千兆网卡,上限满负荷工作,大概有600兆左右,单位为b,除以8为75k/单个连接。这个一般可以满足。
参考http://www.blogjava.net/yongboy/archive/2013/04/11/397677.html linux下需要修改的地方有:
- echo “* - nofile 1048576” >> /etc/security/limits.conf #open file resource limit 是linux中process可以打开的文件句柄数量。
- echo ”fs.file-max = 1048576” >> /etc/sysctl.conf #系统最大允许的文件描述符
- echo ”net.ipv4.ip_local_port_range = 1024 65535” >> /etc/sysctl.conf #可以使用的端口范围,主要为了测试时候使用
- echo ”net.ipv4.tcp_mem = 786432 2097152 3145728” >> /etc/sysctl.conf #见上
- echo ”net.ipv4.tcp_rmem = 4096 4096 16777216” >> /etc/sysctl.conf
- echo ”net.ipv4.tcp_wmem = 4096 4096 16777216” >> /etc/sysctl.conf
echo "* - nofile 1048576" >> /etc/security/limits.conf #open file resource limit 是linux中process可以打开的文件句柄数量。echo "fs.file-max = 1048576" >> /etc/sysctl.conf #系统最大允许的文件描述符 echo "net.ipv4.ip_local_port_range = 1024 65535" >> /etc/sysctl.conf #可以使用的端口范围,主要为了测试时候使用 echo "net.ipv4.tcp_mem = 786432 2097152 3145728" >> /etc/sysctl.conf #见上echo "net.ipv4.tcp_rmem = 4096 4096 16777216" >> /etc/sysctl.conf echo "net.ipv4.tcp_wmem = 4096 4096 16777216" >> /etc/sysctl.conf
在参考文章中,建立100w的连接,大概使用了7500M的内存,每个连接大概7.5k的内存(主要是读写缓冲区,tcb的大小)。
另外,通过修改系统配置达到100w连接并不难,但是要是真正实现并发100w业务的处理还是很困难的。
- Linux单机TCP并发连接
- Linux单机TCP并发连接
- 单机tcp并发连接
- 单机 并发TCP连接上限(不是65536)
- Linux下高并发socket,单机提供五十万连接
- Linux单机最大tcp连接数(★firecat推荐★)
- linux服务器TCP并发连接数
- linux服务器TCP并发连接数优化
- 单机千万并发连接实战
- 单机千万并发连接实战
- 关于单机最大tcp连接数 及 linux 下 TCP 连接数修改
- 单机TCP最大连接数简析
- 单机TCP最大连接数
- 单机最大tcp连接数
- 单机最大tcp连接数
- 单机最大tcp连接数
- 单机最大tcp连接数
- 单机最大tcp连接数
- jquery 插件方法 将form表单转换成json串对象
- thinkPHP中的method_exits()方法
- 2017年寒假集训分组测试赛2 Ranklist
- CREELINKS平台_处理器CeCcp资源使用说明(CeCcp的配置与使用)
- flex 弹性布局
- Linux单机TCP并发连接
- 正确理解ThreadLocal
- 110. Balanced Binary Tree
- git 更新分支的信息
- Jmeter中正则表达式提取器使用详解
- 协程 及 Libco 介绍
- BZOJ 1015 并查集,逆向思考
- linux-centos7 常用命令
- 出现arm-none-linux-gnueabi-gcc: No such file or directory的解决方法