Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Sockets Erlang接受SSL连接的速度非常慢(与C+;+;)_Sockets_Ssl_Erlang - Fatal编程技术网

Sockets Erlang接受SSL连接的速度非常慢(与C+;+;)

Sockets Erlang接受SSL连接的速度非常慢(与C+;+;),sockets,ssl,erlang,Sockets,Ssl,Erlang,我目前正在用Erlang编写的一段代码测试极端条件 我已实施的技术,监督有多重接受能力 在这里,代码稍微修改以处理监控程序的SSL连接: -module(mymodule). -behaviour(supervisor). -export([start/0, start_socket/0]). -define(SSL_OPTIONS, [{active, true}, {mode, list}, {reuseaddr, true},

我目前正在用Erlang编写的一段代码测试极端条件

我已实施的技术,监督有多重接受能力

在这里,代码稍微修改以处理监控程序的SSL连接:

-module(mymodule).

-behaviour(supervisor).

-export([start/0, start_socket/0]).
-define(SSL_OPTIONS, [{active, true},
              {mode, list},
              {reuseaddr, true},
              {cacertfile, "./ssl_key/server/gd_bundle.crt"},
              {certfile, "./ssl_key/server/cert.pem"},
              {keyfile, "./ssl_key/server/key.pem"},
              {password, "********"}
             ]).

-export([init/1]).

start_link() ->
    application:start(crypto),
    crypto:start(),
    application:start(public_key),
    application:start(ssl),
    supervisor:start_link({local, ?MODULE}, ?MODULE, []).

init([]) ->
    {ok, LSocket} = ssl:listen(4242, ?SSL_OPTIONS),
    spawn_link(fun empty_listeners/0),
    {ok, {{simple_one_for_one, 60, 3600},
      [{socket,
        {mymodule_serv, start_link, [LSocket]}, % pass the socket!
        temporary, 1000, worker, [mymodule_serv]}
      ]}}.

empty_listeners() ->
    [start_socket() || _ <- lists:seq(1,100)],
    ok.

start_socket() ->
    supervisor:start_child(?MODULE, []).
我能够从多个服务器一次启动近10000个连接。 虽然接受SSL的10秒钟,但接受C++代码的所有代码(甚至没有多个接受等待),在Erlang,这是完全不同的。每秒最多接收20个连接(根据NETSTAT信息,而C++接受更像1K连接/秒)

当10K连接等待验收时,我也在手动尝试连接

openssl s_client -ssl3 -ign_eof -connect myserver.com:4242
当我这样做时,会发生3种情况:

  • 连接只是超时
  • 连接将在等待30秒后连接。至少
  • 连接将几乎直接发生
当我尝试手动连接2台控制台时,第一次完成的握手并不总是第一次尝试连接。。。我觉得这很特别

服务器配置为:

  • 2个英特尔至强E5620
  • 8x 2.4GHz
  • 24号冲头
我以以下内容开始Erlang shell:

$erl +S 8:8
编辑1:

我甚至尝试接受与gen_tcp的连接,然后将连接升级到SSL连接。还是同样的问题,它每秒接受的连接数不会超过10个。。。ssl:ssl\u接受是这样做的吗?它是否锁定了任何会阻止Erlang扩展此功能的内容

编辑2:

在查看了在erlang中创建的其他SSL服务器之后,他们似乎使用了某种类型的SSL/TLS连接驱动程序,我的示例是RabbitMQ和EjabberD。 在他们的Erlang代码中没有ssl:ssl\u accept,我没有做过很多调查,但他们似乎创建了自己的驱动程序,以便将TCP套接字升级为ssl/TLS套接字。 这是因为Erlang的模块SSL存在问题吗?有人知道为什么他们使用SSL/TLS的自定义驱动程序吗


对此有何想法?

实际上,并不是SSL接受或握手减慢了整个过程

我们在erlang问题列表中发现这是积压工作


默认情况下,Backlog设置为5。我已将其设置为SOMAXCONN,现在一切正常

我建议将这个问题发布在erlang问题列表上,以便从otp团队(Ingela等人)那里得到答案。我也考虑过。。。然而,可能有人不是我团队的高层,或者至少有一些线索……如果你觉得直接问OTP团队不舒服,试着问RabbitMQ或EjabberD的开发人员。他们现在应该知道为什么他们选择了各自的解决方案@EmilVikström:事实上,我刚刚在erlang问题列表上问了我的问题,还没有OTP团队回答。但我们正在努力。如果有什么有趣的事情发生,我当然会更新我的帖子。@EmilVikström:据OTP团队的Ingela说,他们这样做是因为OTP的早期版本(当那些项目创建时)不支持SSL/TLS连接升级。
$erl +S 8:8