D3 Reactor 百万并发
reactor由对不同IO的管理转变为对事件的管理不同的IO事件对应不同的回调函数。listenfd的EPOLLIN事件调用aceept_cbclientfd的EPOLLIN事件调用recv_cbclientfd的EPOLLOUT事件调用send_cb。封装用户空间的连接#define BUFFER_LENGTH 1024 typedef int (*RCALLBACK)(int fd); struct conn { int fd; char rbuffer[BUFFER_LENGTH]; int rlength; char wbuffer[BUFFER_LENGTH]; int wlength; RCALLBACK send_callback; union { RCALLBACK recv_callback; RCALLBACK accept_callback; } r_action; int status; // { header, body} };大致流程初始化服务器将sockfd相关的IO事件用accept_cb对应注册上。当有新连接申请连接时accept_cb被调用在其中将新的IO用recv_cb对应注册上当clientfd接收完数据后修改其事件为EPOLLOUT根据reactor特性下次将会调用send_cb,实现回声服务器总之搞清楚不同IO事件对应不同回调函数处理相同IO事件调用相同回调函数处理百万并发消除fd的限制ulimit -n 1048576五元组问题五个元素源IP目的IP源端口目的端口协议标识一个连接。又由于灵活可用端口为1024~65535差不多6万多个。因此在3客户端1服务端的情况下要跑通百万并发服务器要多开几个端口。连接数停在65535修改/etc/sysctl.conf中net.nf_conntrack_max数量限制防止客户端因errno导致进程停止添加errno条件判断进程因性能问题被kill增加内存QPS时延使用wrk测试服务器QPS使用计时器测试延迟文章参考与零声教育的C/Clinux服务期高级架构系统教程学习:链接