Sockets Erlang接受SSL连接的速度非常慢(与C+;+;)
我目前正在用Erlang编写的一段代码测试极端条件 我已实施的技术,监督有多重接受能力 在这里,代码稍微修改以处理监控程序的SSL连接: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},
-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个英特尔至强E5620
- 8x 2.4GHz
- 24号冲头
$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