服务器并发C10K/C100k/C10M问题(重制版)

接入量:服务器一段时间连接客户端的数量,一般情况下是1秒的连接数量QPS。也是服务器性能的重要指标
并发量:同时承载客户端的数量。承载:客户端一个请求能在200ms内返回正确的结果。

影响并发量的主要几个因素:
1 DB能否顶得住
2 网络带宽响应
3 内存操作
4 日志性能
服务器同时建立连接数量,是做百万并发的一个基础。

在linux简单的一个epoll编写就可以处理网络IO承载150万左右。

简单epoll服务器测试

测试Linux提供的epoll服务器(未添加任何业务代码),用程序模拟发送连接:
服务器并发C10K/C100k/C10M问题(重制版)
1 端口限制
客户端出现现象:
服务器并发C10K/C100k/C10M问题(重制版)
客户端最多只能建立3万左右的连接。
原因:由于客户端端口限制导致的,linux系统默认1024以下的端口为公共服务端口,而对于1024到32768为注册服务的端口,32768到65535的端口为自定义端口。此端口范围range_from可以修改配置。

方法一查看:
cat /proc/sys/net/ipv4/ip_local_port_range
方法二
vim /etc/sysctl.conf配置

sysctl.conf添加端口范围
服务器并发C10K/C100k/C10M问题(重制版)
执行sysctl -p /etc/sysctl.conf生效。
服务器并发C10K/C100k/C10M问题(重制版)
2 文件描述符限制
linux文件系统对文件的fd数量有限制
查看 umlimit -a
服务器并发C10K/C100k/C10M问题(重制版)
oepn_files:打开文件的数量(进程打开最大fd的数量,每个进程自带的)
修改方法:1 ulimit -n 值 (临时修改,重启后无效)
2 修改/etc/security/limit.conf文件 永久有效 服务器并发C10K/C100k/C10M问题(重制版)
文件注释:domain:域组那个用户组 type:硬软限制 item:nofile value:数量
硬限制:不能超过数量
软限制:可超出数量,会回收。

3 netfilter组件限制
客户端现象:客户端fd大概到64999左右会出现

connect timeout错误

产生原因:由于网络协议栈中的netfilter组件配置限制的原因。
服务器并发C10K/C100k/C10M问题(重制版)
网卡把data通过sk_buff组件搬到网络协议栈,会经过一个组件netfilter组件,os在使用会出现大量无效的数据防止被攻击,在进入网络协议栈之前会加一个层过滤器(netfitler)规则,对网络数据包过滤。
防火墙实现:基于netfilter规则,在linux上有一个iptables也是基于netfilter原则实现的。
iptables:包括两部分,1 部分内核实现 2 另一部分应用程序实现。由于应用程序实现可以用iptables命令操作。

netfilter:维护往外发送的最大连接数,也维护进来最大连接数。
设置netfilter连接数量两种方式:
1 全局设置,整个系统都设置
在/etc/sysctl.conf中添加net.nf_conntrack_max=1048576配置,然后sysctl -p /etc/sysctl.conf生效即可
2 可以针对单个程序调用setsockopt函数,在代码层面设置(只针对当前的程序有效)

针对网络配置的参数调优:
服务器并发C10K/C100k/C10M问题(重制版)

单reactor线程池百万服务器测试

针对于上面的epoll测试,发现抖动性也比较严重,抖动性也是服务器的一个重要的参数。针对于上面的,接收连接fd和业务处理全部再一个线程里面,可能处理不过来,只能等待。
常见的几种做法:
1 将网络连接丢给一个线程处理,而分配后fd后交给线程池处理业务。参考redis
2 开多个线程accept 可参考nginx
设计原则:把accept与recv和send分开,多个线程做接入可以有效解决抖动现象。
针对于服务器整个流程:
服务器并发C10K/C100k/C10M问题(重制版)

上一篇:Understanding LSTM Networks(理解LSTM网络-colah‘s blog)


下一篇:Kubernetes从懵圈到熟练:集群服务的三个要点和一种实现