问题标签 [io-async]

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 投票
1 回答
287 浏览

linux - 嗯,IO::Async 甚至无法处理 10k 连接?

嗨,我建立了一个非常简单的 HTTP 服务器,只是为了对 POE 模块进行压力测试。

这是我测试它的方法:

当我这样做时,我通过对等消息看到多个“连接重置”,因此对于这个 10k 连接,我总共丢失了大约 1200 个请求。

有没有办法提高它的性能?在同一台服务器上测试 nginx,在此期间没有更改内核参数,根本没有连接重置消息。

编辑

我已经增加了 max fileno / per user max fileno,前者是fs.file-max = 3246455,后者是10240

附上源代码:

0 投票
1 回答
974 浏览

perl - 如何使用 AnyEvent 和 Perl 并行运行外部命令

我是 Perl 5 异步进程的新手,发现CPAN提供了类似的支持,我们可以在Node.js中使用 AnyEvent、IO::Async 等提供类似的支持,这令人兴奋。但是,本教程提供了一些复杂内容的示例。我只需要使用 AnyEvent 并行运行外部系统命令。

我在下面的示例中是否正确地异步压缩了多个文件?请不要担心运行系统命令zip而不是使用 CPAN 模块;该示例纯粹是为了演示运行异步进程的想法......

0 投票
1 回答
146 浏览

perl - Perl、IO:Async::Loop 和管道到 sendmail 的死锁

当我们尝试从 Perl FCGI 进程发送电子邮件时,我们看到了糟糕的 sendmail 进程。这些过程花费的时间太长,从几小时到一天,因为它应该只是对在 sendmail 中配置为智能主机的服务器进行中继。来自 FCGI 进程的大部分邮件需要不到 5 秒的时间。使用 $ ps -ef | 在我们的服务器上很容易找到缓慢的 sendmail 进程。grep 发送邮件

几乎所有的电子邮件都可以从这些 Web 节点正常工作。我猜成千上万的邮件可以毫无问题地通过。从命令行发送测试邮件很顺利。sendmail 命令很少被卡住,我们没有办法重现它。

似乎大多数卡住的电子邮件迟早会通过。这些似乎是在几小时后发送邮件,有时是一天后。

我们看到的所有卡住的 sendmail 都是由 Perl 进程运行的命令,Perl 进程是 FCGI 进程的子进程。

查看智能主机的日志,我们看到大部分邮件迟早都会通过,但我们发现有些邮件似乎从未发送过。

这是在 FCGI for Catalyst 中运行的,然后添加到执行一些处理的 IO::Async::Loop 中,并在 IO::Async::Loop 中使用 Email::Sender::Transport::Sendmail 执行open($fh, '|-', @args) 并通过管道传递邮件头+正文并执行 close($fh)。

我看过这个http://perldoc.perl.org/perlipc.html#Avoiding-Pipe-Deadlocks但不知道如何在这种情况下应用它。子 sendmail 只打开了 STDIN。

当我们有这些卡住的 sendmail 之一时,sendmail 正在 STDIN 上等待:

并且异步 perl 进程正在等待孩子死亡:

一个没有通过的例子:Job #1653576(这只是我们的内部工作编号)有一个从 8 月 19 日 13:04 开始的 sendmail 流程。

webnode2上的进程:

我确实在 8 月 21 日看到了 proffunnyhat@mit.edu 的成功电子邮件(来自 web2 /var/log/maillog):

然后在 mail.ourServer.org 上:

一个被卡住但似乎已发送的示例:mail.ourServer.org:/var/log/sendmail:

我们尝试过的事情

我已经修改了 Email::Sender::Transport::Sendmail 以将 '\x00' 发送到管道,但这不起作用。

我已经用 IO::Async::Loop::Select 替换了 IO::Async::Loop::Poll。那并没有改变什么。

我已经尝试向 sendmail 及其父级发送信号。这杀死了他们,但邮件被中止了。

将我们的 fcgi 用户添加到 sendmail 的受信任用户文件中。没有改变任何东西。

我编写了一个从 STDIN 读取并写入 sendmail 的包装脚本。如果 STDIN 上 5 秒内没有任何输入,则退出。这对我来说真的很hacky,但它似乎确实有效。由于邮件是我们系统的关键部分,我宁愿有一个真正的解决方案。

0 投票
1 回答
353 浏览

perl - 如何将 IO::Async 与数组一起用作输入?

我有这个循环:

由于数组按顺序处理并不重要,而且脚本运行时间很长,我想doSomething()异步运行。

我正在为此查看IO::Async,但我似乎找不到循环输入是上述简单数组的示例。该示例似乎侧重于开放式套接字、STDIN 等。

这是给出的示例,显示了通过 STDIN 向循环提供数据:

我怎样才能给它提供数组元素呢?