Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 嗯,IO::异步可以';你连10公里的线路都处理不了吗?_Linux_Perl_Networking_Io Async - Fatal编程技术网

Linux 嗯,IO::异步可以';你连10公里的线路都处理不了吗?

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,在此期间没有更改内核参数,根本没有连接重置消息 编辑 我已经

嗨,我构建了一个非常简单的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/每个用户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”选项?