问题标签 [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 回答
1122 浏览

c - 使用 epoll 主循环延迟执行

如何使用创建延迟执行代码或超时事件epoll?libevent 和 libev 都有这个功能,但我不知道如何使用 epoll 来做到这一点。

目前主循环如下所示:

我很清楚,这个功能可以通过简单地添加已经过去的时间来实现,但使用 epoll 似乎是一个更清洁的解决方案。

0 投票
1 回答
6803 浏览

asynchronous - poll/epoll 会阻塞吗?它与异步 IO 有何不同?

我一直认为 poll/epoll 不会阻塞。这就是 Nginx 等非阻塞服务器使用它们的原因。

但是在这个Stackoverflow 问题中,多次提到 poll 块。

那么 poll/epoll 会阻塞吗?

poll/epoll 与异步 IO 有何不同?

0 投票
2 回答
2467 浏览

python - 我应该使用 epoll 还是只在线程中阻塞 recv?

我正在尝试编写一个可扩展的自定义 Web 服务器。这是我到目前为止所拥有的:

主循环和请求解释器在 Cython 中。主循环接受连接并将套接字分配给池中的一个进程(必须是进程,由于 GIL,线程不会从多核硬件中获得任何好处)。

每个进程都有一个线程池。该进程将套接字分配给一个线程。线程调用recv(阻塞)套接字并等待数据。当一些出现时,它通过管道进入请求解释器,然后通过 WSGI 发送到在该线程中运行的应用程序。

现在我听说了 epoll 并且有点困惑。使用 epoll 获取套接字数据然后将其直接传递给进程有什么好处吗?还是我应该走通常的路线让每个线程等待recv

PS:epoll实际上是用来做什么的?似乎多线程和阻塞fd调用会完成同样的事情。

0 投票
3 回答
13256 浏览

python - 我无法理解 python 中的轮询/选择

我正在使用 UDP 在 python 中进行一些线程异步网络实验。

我想了解 polling 和 select python 模块,我从未在 C/C++ 中使用过它们。

那些是为了什么?我有点理解选择,但是在观看资源时它会阻塞吗?投票的目的是什么?

0 投票
2 回答
417 浏览

c++ - libevent 的附加价值

如果我们主要想要一个epoll基于文件描述符的循环,那么libevent提供的其他功能(不感兴趣http或不感兴趣dns)?

我知道这是一个相当大的项目,但对我来说编写epoll包装 API 看起来很简单。

0 投票
2 回答
9527 浏览

c++ - 对常规文件进行 Epoll

(在 Linux 上)可以epoll对常规文件有用吗?我知道它主要与套接字一起使用,但只是想知道。

0 投票
1 回答
370 浏览

tcp - 在单线程中从多个连接中读取数据的跨平台方式

我的应用程序需要同时下载多个网页,由于在 linux 中使用 epoll 编程的经验,我知道这在单个线程中是可能的。目前我使用 CURL 与 HTTP 交互,但是......

更新:发现 curl 的多接口:http ://curl.haxx.se/libcurl/c/libcurl-multi.html我认为问题已解决(-;

0 投票
2 回答
901 浏览

c - 使用 NBIO 的高效预分叉服务器设计,例如使用 libevent 的 epoll、kqueue

我正计划编写一个“彗星”服务器,用于向客户“流式传输”数据。过去我增强了一个以利用多核 CPU,但现在我从头开始。我打算使用 epoll/kqueue 或 libevent 为服务器供电。

我一直在权衡的问题之一是使用什么服务器设计?我有几个可用的选项,因为我计划使用多进程模型来利用所有 CPU 内核。

  1. 预分叉的多进程 - 每个进程都有自己的接受
  2. 带有主进程的预分叉多进程 - 主进程接受然后使用描述符传递将接受的套接字传递给进程
  3. 具有不同端口的预分叉多进程 - 每个进程侦听同一系统上的不同端口。负载均衡器根据来自各个守护进程的一些负载反馈来决定哪个进程获得下一个连接

设计#2 是最复杂的。设计#3 很简单,但无论设计如何,我都需要额外的硬件,因为我将在多台机器上运行它,并且无论如何都需要负载均衡器。设计#1 有雷群问题,但我想雷群对于 8 个进程来说并不是什么大问题,但是当客户端不断连接和断开连接时它就变得很重要(这应该很少见,因为这是一个彗星服务器)。

正如我所看到的,#2 很复杂,并且需要 2 个额外的系统调用,因为描述符在每个接受的主从进程之间传递。将这种开销与雷鸣般的羊群问题相对会更好吗?如果我有 8 个进程唤醒并执行接受,我是否可能会看到 8 个接受调用,以防我使用设计#1?

我的设计选择的优缺点是什么?你会推荐什么?

0 投票
1 回答
2486 浏览

c++ - epoll vs select 用于非常少量的连接

我一直在使用 select 来处理连接,最近我们的套接字库发生了变化,select 被 Linux 平台的 epoll 取代。

我的应用程序架构是这样的,我只建立一个或最多 2 个套接字连接,并在单个线程中对它们进行 epoll/select。

现在随着最近切换到 epoll,我注意到应用程序的性能有所下降,我真的很惊讶,并期待性能上升或保持不变。我尝试查看其他各个部分,这是唯一改变的代码部分。

如果用于非常少量的套接字(如 1 或 2),epoll 在速度方面是否会降低性能。

还有一点需要注意的是,我在同一个盒子(8 个 cpu 核心)上运行了大约 125 个这样的进程。这可能是在同一台机器上执行 epoll_wait 的进程太多的情况,当我使用 select 时,这个设置是相似的。

我注意到在盒子上平均负载要高得多,但 cpu 使用率却完全相同,这让我认为更多的时间花在 I/O 上,并且可能来自与 epoll 相关的更改。

关于我应该多看什么来确定问题的任何想法/指针。

虽然增加的绝对延迟非常小,比如平均 1 毫秒,但这是一个实时系统,这种延迟通常是不可接受的。

谢谢

你好,

在最新的发现上更新这个问题,除了从 select 切换到 epoll 我发现另一个相关的变化,select 的早​​期超时是 10 毫秒,但使用 epoll 的方式超时比以前小得多(比如 1 micro..),可以设置太低select 或 epoll 超时导致性能下降?

谢谢

0 投票
3 回答
7805 浏览

c - 带有 epoll 和线程的套接字服务器

我正在尝试在 C 中为协作实时编辑器http://en.wikipedia.org/wiki/Collaborative_real-time_editor创建一个套接字服务器,但我不知道什么是最好的服务器架构。

起初,我尝试将 select 用于套接字服务器,但在那之后,我正在阅读有关 epoll 的内容,现在我认为 epoll 是最佳选择,因为客户端将发送每个用户将在 textarea 上写入的字母,以服务器,因此服务器将分配要处理的数据。

另外,我想在 epoll 中使用线程,但我不知道如何使用它们。我想使用线程,因为我认为在目标机器上使用 2 个或所有 CPU 会更好。

我的计划是

  • 服务器启动时创建2个线程

  • 第一个线程将分析新客户端并为读取或发送做好准备

  • 第二个线程将负责从/向客户端读取和发送数据

问题是这 2 个线程将使用带有 epoll_wait 的 while(1)。

我的问题是,这是使用 epoll 和线程的良好服务器架构吗?如果没有,我有什么选择?

编辑:我不能使用libeventlibev或其他库,因为这是一个大学项目,我不允许使用外部库。