【问题标题】:Hmm, IO::Async can't even handle 10k connections?嗯,IO::Async 甚至无法处理 10k 连接?
【发布时间】:2014-04-20 22:19:18
【问题描述】:

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

这是我的测试方法:

for x in {1..10000}; do
  curl xxxxx:12342 --retry-delay 5 --retry 3 -d randombytes$x 
done

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

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

编辑

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

附上源码:

use strict;
use warnings;
use feature 'say';

use Net::Async::HTTP::Server;
use IO::Async::Loop;

use HTTP::Request;
use HTTP::Response;
use Data::Dumper;

my $loop = IO::Async::Loop->new();

my $httpserver = Net::Async::HTTP::Server->new(
    on_request => sub {
        my ($self, $req) = @_;
        my ($code, $result) = (200, "It works\n");

        my $response = HTTP::Response->new ($code);
        $response->add_content ($result);
        $response->content_type ("application/json");
        $response->content_length (length $response->content);

        $req->respond($response);
    },
);

$loop->add( $httpserver );

$httpserver->listen(
    addr => { family => "inet", socktype => "stream", port => 8080 },
    on_listen_error => sub { die "Cannot listen - $_[-1]\n" },
);

say 'Listening normally on ', 8080;

$loop->run;

【问题讨论】:

  • 标签说 POE,描述和代码说 IO::Async。我会重新标记
  • @LeoNerd 嗯,我只是没有找到 io::async 标签,谢谢

标签: linux perl networking io-async


【解决方案1】:

您可能会发现您遇到了“每个进程的文件描述符”限制。默认为 1024。

$ ulimit -n
1024

如果您想处理 10,000 个并发连接,那么显然每个连接至少需要一个文件描述符。考虑到一些额外的流程和一些额外的空间用于陈旧的流程,您可能希望将其设置为大约 11k。

只有root才能增加FD限制:

$ sudo -s
Password:
# ulimit -n 11000
# ulimit -n
11000

此时您可以运行您的服务器了。 (不要忘记切换回所需的 UID,以免以 root 身份运行)。

当通过IO::Async 运行如此大量的连接时,您可能希望使用比默认内置的基于pollselect 的循环更好的东西。例如,在 Linux 上,您可能希望安装 epoll 循环以及 linux 循环,以便自动加载。

$ cpan IO::Async::Loop::Epoll
$ cpan IO::Async::Loop::linux

【讨论】:

  • ulimit 显示 10240(在本次压力测试之前调整过),我还是把它增加到了 65535
  • 另外,我怎么知道这两个模块是否被“选中”?我已经安装了
  • 我的 $loop = IO::Async::Loop->new; say ref($loop) # 将打印你实际拥有的那种循环
  • 至于知道剩下多少备用FD,我不确定。我怀疑这是一个新的 SO 问题的主题。
  • IO::Async 中是否有“积压”选项?
猜你喜欢
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多