小编Mik*_*son的帖子

epoll:丢失一些 EPOLLOUT 事件?

这是我的服务器的样子:

-WorkerThread(s):

  • 调用 epoll_wait,接受连接,设置 fd 非阻塞(EPOLLIN | EPOLLOUT | EPOLLET | EPOLLRDHUP)
  • 在 EPOLLIN 事件上调用 recv 直到 EAGAIN 并将所有数据推送到全局 RecvBuffer(pthread_mutex synced)
  • 在 EPOLLOUT 事件上:访问全局 SendBuffer,如果当前准备好的 fd 有数据要发送,则执行(在 while 循环中,直到 EAGAIN 或直到所有数据发送;当整个数据包发送时,从 SendBuffer 中弹出)

-IOThread(s)

  • 从全局 RecvBuffer 获取数据,处理它们
  • 通过首先尝试立即调用 send 来发送响应。如果未发送所有数据,则将其余数据推送到全局 SendBuffer 以从 WorkerThread 发送)

问题是,该服务器不会发送所有排队的数据(它们留在 SendBuffer 中),并且“未发送”数据的数量随着客户端数量的增加而增长。为了测试我只使用 1 个工作线程和 1 个 iothread,但如果我使用更多似乎没有任何区别。访问全局缓冲区受 pthread_mutex 保护。此外,我的响应数据大小为 130k 字节(它至少需要 3 次发送调用才能发送此数据量)。另一方面是使用阻塞套接字的 Windows 客户端。

非常感谢!兆焦

编辑:

是的,默认情况下我正在等待 EPOLLOUT 事件,即使我没有什么可发送的。为了实现简单性和手册页指南,我是这样做的。另外,我对它的理解是这样的:

即使我当时“错过”了 EPOLLOUT 事件,我也不想发送任何内容,这也没有问题,因为当我想发送数据时,我会调用 send 直到 EAGAIN 和 EPOLLOUT 应该在将来触发(并且大部分时间)

现在我修改了代码以在 IN/OUT 事件之间切换:

在接受:

event.events = …
Run Code Online (Sandbox Code Playgroud)

c c++ epoll asyncsocket epollet

3
推荐指数
1
解决办法
5538
查看次数

标签 统计

asyncsocket ×1

c ×1

c++ ×1

epoll ×1

epollet ×1