问题标签 [epoll]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3125 浏览

linux - poll/epoll 兼容定时器

问候,

我想知道是否有办法将计时器与 linux poll/epoll API 结合使用。我已经使用了 epoll,如果我可以使计时器成为队列中的另一个 epoll 事件,它将与现有代码很好地集成。

一种可能的方法可能是基于文件的计时器,例如

就像一个假想的例子。有这样的事情吗?还是有其他方法可以将它与 epoll API 集成?

——马伦茨

0 投票
1 回答
993 浏览

python - Python epoll.register 线程安全?

有谁知道我是否可以安全地从另一个线程调用 epoll.register ?

这是我的想象:

  • 线程 1:epoll.poll()
  • 线程 2:使用 epoll.register 向同一个 epoll 对象添加一些 fd

http://docs.python.org/library/select.html

0 投票
3 回答
1084 浏览

c - epoll_data_t 问题(特别是关于 C 数据类型)

工会epoll_data_t看起来像:

这更像是一个一般的 C 问题,但为什么使用前导双下划线 __uint{32,64} 类型而不是仅使用不带下划线的 uint{32,64} 类型?我真的不明白为什么/何时使用下划线版本,但我认为没有下划线的 uint32 将是在可公开修改的联合中使用的正确方法。

0 投票
3 回答
7910 浏览

linux - epoll 性能

谁能帮我回答有关 epoll_wait 的问题。

  1. 在同一个 fds 集上使用许多调用 epoll_wait 的线程来为大约 100K 活动套接字提供服务是不是有点矫枉过正?还是只创建1个线程来执行epoll_wait就足够了?

  2. 例如,当只有一个套接字准备好读取数据时,有多少线程将从 epoll_wait 中唤醒?我的意思是,是否存在 2 个或更多线程将从 epoll_wait 唤醒但在结果事件中具有相同 fds 的情况?

  3. 在与许多活动客户端(例如 50K+)一起工作的服务器中组织线程的最佳方式是什么?我认为最好的方法是:1 个 I/O 工作线程,它执行 epoll_wait 和 i/o 操作。+许多数据处理线程将处理从 I/O 工作线程接收到的数据(可能需要很长时间,例如任何游戏逻辑),并为 I/O 工作线程组合新数据发送到客户端。我采用这种方法是否正确,或者任何人都可以帮助我找出组织这种方法的最佳方法?

提前致谢, 瓦伦丁

0 投票
1 回答
642 浏览

events - TCL类C10K的基于事件的服务器开发现状如何?

TCL 是一种不错的简单编程语言,但似乎没有得到应有的赞誉和/或尊重。我在 1995 年在大学里学到了它,很快就忘记了它,只是最近又偶然发现了它。我对 TCL 最感兴趣的是开发基于 TCP 的网络服务以及 Web 开发。

有人提到,TCL 使网络编程变得简单。然而,TCL 似乎在幕后使用了 select(),这在考虑到“网络规模”的情况下不能很好地扩展(参见C10K 问题)。我已经搜索了对 libevent、libev、raw epoll/kqueue 的支持,但我没有看到太多。

你知道用 TCL 编写的任何“现代”(因为没有更好的术语)基于事件的网络服务吗?您对基于 TCL 的服务器开发有什么建议、技巧或最佳实践吗?

谢谢!

0 投票
1 回答
2734 浏览

posix - 重温“如何同时使用 aio 和 epoll”

关注如何在单个事件循环中同时使用 AIO 和 epoll?.

linux 中实际上有 2 个“aio”API。有 POSIX aio(aio_* 系列函数),包含在我相信由 RedHat(?)开发的 glibc 和 libaio 中,即 io_* 系列。

第一个允许通过 aio_sigevent aiocb 成员注册通知请求。这可以很容易地与 ppoll()/pselect() 事件循环集成。如果您想将 POSIX aio 与 epoll() 集成,那么您需要将信号转换为虚拟 fd(可能是管道)上的事件并使用 epoll 监听它,同时以经典方式或使用 ppoll/ 捕获信号选择。首选(普通 sighandlers)有多安全,取决于应用。也许在 epoll 上,但我并不完全了解它的内部结构。我可以安全地假设,如果我有一个基于 epoll 的应用程序并且我想添加 POSIX aio 支持,那么我就完蛋了?这是我的问题。

第二个 AIO 实现 libaio - 确实可以与 eventfd() 一起使用(结构 iocb 具有预期为零的 aio_resfd 成员或将 AIO 结果传递到的 eventfd)。但这不是书本上的。POSIX 指定的,即。

我梦想自己成为一个*BSD 用户,一切都很清楚。您拥有对 AIO 事件的 POSIX AIO 和 kqueue() 支持。晶莹剔透。像许多其他事情一样。

0 投票
3 回答
2137 浏览

c - 使用 epoll 处理多个 TCP 连接上的数据

我有一个应用程序,它将像一个 p2p 软件一样工作,所有对等点都将相互交谈。由于通信将是 TCP,我认为我可以使用epool(4)以便可以处理多个连接。由于每个对等点都会非常频繁地发送数据,我认为我将与每个对等点建立一个持久连接,该连接将在应用程序生命周期内使用。

现在,我不知道如何处理的一件事是,由于连接从未关闭,我怎么知道何时应该停止接收数据read()并再次调用epool_wait()以收听更多包?还是有更好的方法来处理持久的 TCP 连接?

0 投票
2 回答
4461 浏览

c - EPIPE 块服务器

我用 C 语言编写了一个在 Linux 上运行的单线程异步服务器:套接字是非阻塞的,至于轮询,我使用的是 epoll。基准测试表明服务器运行良好,并且根据 Valgrind 的说法,没有内存泄漏或其他问题。

唯一的问题是,当 write() 命令被中断时(因为客户端关闭了连接),服务器会遇到 EPIPE。我通过使用参数-b运行基准测试实用程序“围攻”来人为地中断。它连续执行许多请求,所有请求都完美运行。现在我按下 CTRL-C 并重新开始“围攻”。有时我很幸运,服务器无法发送完整的响应,因为客户端的 fd 无效。正如预期的那样,errno 设置为 EPIPE。我处理这种情况,在 fd 上执行 close() 然后释放与连接相关的内存。现在的问题是服务器阻塞并且不再正确回答。这是 strace 输出:

(如果您想知道,我从日志中删除了 printf())

如您所见,客户端建立了一个新连接,因此被接受。然后,它被添加到 EPOLL 队列中。epoll_wait() 表示客户端发送了数据(EPOLLIN)。解析请求并组成响应。发送标头可以正常工作,但是当涉及到正文时, write() 会导致 EPIPE。这不是“围攻”中的错误,因为它会阻止任何传入连接,无论来自哪个客户端。

0 投票
4 回答
7832 浏览

select - 使用 select、epoll 或 kqueue 提供大文件

Nginx 使用 epoll 或其他多路复用技术(选择)来处理多个客户端,即它不像 apache 那样为每个请求生成一个新线程。

我尝试使用 select 在我自己的测试程序中复制相同的内容。我可以通过创建非阻塞套接字并使用 select 来决定要服务的客户端来接受来自多个客户端的连接。我的程序只会将他们的数据回显给他们。它适用于小数据传输(每个客户端一些字节)

当我需要通过与客户端的连接发送大文件时,就会出现问题。由于我只有一个线程为所有客户端提供服务,直到我完成读取文件并将其写入套接字时,我无法继续为其他客户端提供服务。

这个问题是否有已知的解决方案,或者最好为每个这样的请求创建一个线程?

0 投票
2 回答
2122 浏览

c - 什么是“紧急数据”?

epoll_ctl()的手册页说EPOLLPRI

有可用于 read(2) 操作的紧急数据。

“紧急数据”究竟是如何定义的,谁来决定哪些数据具有优先权?