Linux 嗯,IO::异步可以';你连10公里的线路都处理不了吗?
嗨,我构建了一个非常简单的HTTP服务器,只对POE模块进行了压力测试 下面是我如何测试它的:Linux 嗯,IO::异步可以';你连10公里的线路都处理不了吗?,linux,perl,networking,io-async,Linux,Perl,Networking,Io Async,嗨,我构建了一个非常简单的HTTP服务器,只对POE模块进行了压力测试 下面是我如何测试它的: for x in {1..10000}; do curl xxxxx:12342 --retry-delay 5 --retry 3 -d randombytes$x done 当我这样做时,我看到对等消息多次“连接重置”,所以对于这个10k连接,我总共丢失了大约1200个请求 是否有改进其性能的方法?在同一台服务器上测试nginx,在此期间没有更改内核参数,根本没有连接重置消息 编辑 我已经
for x in {1..10000}; do
curl xxxxx:12342 --retry-delay 5 --retry 3 -d randombytes$x
done
当我这样做时,我看到对等消息多次“连接重置”,所以对于这个10k连接,我总共丢失了大约1200个请求
是否有改进其性能的方法?在同一台服务器上测试nginx,在此期间没有更改内核参数,根本没有连接重置消息
编辑
我已经增加了max fileno/每个用户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;
您可能会发现,您即将达到“每个进程的文件描述符”限制。默认值为1024
$ ulimit -n
1024
如果您想处理10000个并发连接,那么很明显,每个连接至少需要一个文件描述符。考虑到这个过程会有一些额外的空间,而对于陈旧的过程会有一些额外的净空,您可能希望将其设置为大约11k
只有root用户可以增加FD限制:
$ sudo -s
Password:
# ulimit -n 11000
# ulimit -n
11000
现在,您可以运行服务器了。(不要忘记切换回所需的UID,以免以root身份运行它)
当通过IO::Async
运行如此大量的连接时,您可能希望使用比默认的内置poll
或select
循环更好的方法。例如,在Linux上,您可能希望安装epoll
循环,以及Linux
循环,以便自动加载
$ cpan IO::Async::Loop::Epoll
$ cpan IO::Async::Loop::linux
标记表示POE,描述和代码表示IO::Async。我将retag@LeoNerd嗯,我只是没有找到io::async标记,thanksulimit显示10240(在本次压力测试之前进行了调整),我将其增加到65535。另外,我如何知道这两个模块是否被“选中”?我已经安装了它们,my$loop=IO::Async::loop->new;say ref($loop)#将打印您实际拥有的循环类型。至于还剩下多少备用FD,我不能马上确定。我想这是一个新的SO问题的主题。IO::Async中是否有“backlog”选项?