0 0

用erlang试着做了个反向代理,但感觉转发效率好低,不知道为什么15

下面是核心代码,原始的结构是一个listener的sup,一个client的sup,一旦有接入,就起一个worker,worker是用gen_fsm做的。开始以为这是由于结构不好,就把核心代码取出来写了个简单的程序,但结果一样。

我用ab -n 100 -c 10在虚拟机(vmware player 4,ubuntu 10.04 server,分配了4核,384G内存)做的测试,服务是nginx的一个静态页,直接访问是20000多rps,通过这个代理只有2000多。虚拟机和实体机差不多,虚拟机用单核测试分别是10000多和1000多,关掉smp对结果没什么影响。试过-K启动erl,也试过加上no_delay、delay_send这些参数。

另外我还试过用nodejs写了一个,和这个简单的代码几乎一样,但是效率非常高,几乎和不用代理一样。

-module(prx).
-export([start/0]).

start() ->
  case gen_tcp:listen(8080, [binary, {packet, 0}, {active, true}]) of
    {ok, ListenSocket} ->
      accept(ListenSocket);
    _ ->
      true
  end.

accept(ListenSocket) ->
  {ok, ClientSocket} = gen_tcp:accept(ListenSocket),
  spawn(fun() -> accept(ListenSocket) end),
  case gen_tcp:connect("localhost", 80,
      [binary, {packet, 0}, {active, true}]) of
    {ok, ServerSocket} ->
      loop(ClientSocket, ServerSocket);
    _ ->
      io:format("??~n"),
      true
  end.

loop(ClientSocket, ServerSocket) ->
  receive
    {tcp, ClientSocket, Bin} ->
      gen_tcp:send(ServerSocket, Bin),
      loop(ClientSocket, ServerSocket);
    {tcp, ServerSocket, Bin} ->
      gen_tcp:send(ClientSocket, Bin),
      loop(ClientSocket, ServerSocket);
    {tcp_closed, _} ->
      gen_tcp:close(ClientSocket),
      gen_tcp:close(ServerSocket);
    {tcp_error, _} ->
      gen_tcp:close(ClientSocket),
      gen_tcp:close(ServerSocket);
    _O ->
      io:foramt("others: ~p~n", [_O])
  end.
2011年12月08日 18:59
目前还没有答案

相关推荐

Global site tag (gtag.js) - Google Analytics