我发现啊,skynet里面的pipe用法有问题,因为是阻塞的,一次只能处理(发送一个数据包),如果同时有1000个链接由一个epoll管理,又假如每个链接进来1个 『More』
我没看明白.
skynet 对 IO 是单线程串行分发的, 如果出现拥塞跟 pipe 无关. pipe 就是用来把 IO 处理串行化.
而 skynet 的设计目的是处理 CPU 高负载的业务, 而不是 IO 高负载的业务. - 回复 | (2711) | 云风 | 2013-12-16 03:13:02
语文不好.首先我的理解是,你用pipe的目的就像zeromq一样,用来做线程间通信,减少锁,这个我也觉得很好.而我所说的跟IO高负载没关,指的是并发能力,即每秒收发包的数量,包很小的就几十字节.我尝试解释下:epoll内有100个client_fd,加上用来串行化的recvctrl_fd,就是101个fd.假如一个epoll_wait内这101个fd同时收到读事件,那么100个client_fd会产生100个甚至更多的包,而recvctrl_fd只读了一个包来用来发送,得出的结果是100:1,如果有更多的client_fd,情况更加严重.
我明白你的意思. 但实际上 cpu 和 IO 都没有浪费, 只是延迟变长了而已. 因为 epoll 循环是满负荷运转的.你最初的例子中说 "发送端会积累大量的包来 『More』 - 回复 | (2716) | 云风 | 2013-12-18 11:01:02
谢谢大大解释。我并没有"把 1 万个请求包全部一次发送完",recvctrl_fd读到发送包并不是马上发送出去,而是把包挂到各个client_fd的发送队列上,然后设置client_fd的EPOLLOUT事件,统一由epoll来管理调度。对于游戏来说,我觉得反应速度也很重要啊,我搞页游的。 - 回复 | (2717) | 3q | 2013-12-18 02:34:55