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
目前还没有答案

相关推荐

    erlang编程 Introducing Erlang

    **Erlang编程:Introducing Erlang** Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,...

    使用erlang进行UDP测试

    使用erlang进行UDP测试,这几个是为了凑够20字。

    erlang9.rar

    "otp_win64_20.0.exe"是实际的安装文件,这意味着尽管标题提到了Erlang9,但压缩包内提供的实际上是OTP的20.0版本。这可能是由于在发布时,Erlang 20已经是基于OTP 20的版本,而Erlang 9可能不再支持或者已经过时。 ...

    erlang_mysql编译好了

    总的来说,“erlang_mysql编译好了”意味着你已经具备了在Erlang应用程序中与MySQL数据库交互的基础。接下来,你可以利用这个库来设计和实现数据密集型的应用,充分利用Erlang的并发特性和MySQL的高性能数据库功能。...

    erlang_版本24.3.4.4

    5. **安装**:最后,使用`make install`将编译好的Erlang二进制文件安装到你的系统路径。在某些系统上,你可能需要管理员权限执行此操作。 Erlang的主要特性包括: - **并发性**:Erlang的进程模型是轻量级的,...

    Erlang官网下载过慢

    Erlang是一种面向并发的、函数式编程语言,主要用于构建高度可扩展的、容错性强的分布式系统。在IT行业中,Erlang因其强大的实时性和处理大量并发连接的能力而被广泛应用于电信、互联网基础设施和实时系统。RabbitMQ...

    erlang25.0 windows版本

    对于开发者而言,理解Erlang的源码可以帮助他们更好地利用这个平台,实现更高效、更健壮的应用程序。 在使用Erlang进行开发时,你可能需要用到以下工具和概念: - **Rebar3**:Erlang的构建和依赖管理工具,帮助你...

    erlang port driver test

    Port Driver 提供了一种方式,使得 Erlang 系统能够与外部世界交互,执行低级别的I/O操作或调用非Erlang代码实现的高效算法。 标题 "erlang port driver test" 指的是一个测试项目,这个项目专注于验证和测试 ...

    二郎助手erlang开发工具、erlang编辑器

    为了更好地支持Erlang的开发,二郎助手应运而生,它是一款专为Elang语言定制的开发工具,旨在提升开发者的效率,提供更友好的编程环境。 二郎助手的核心特性在于其全面的Erlang支持,包括语法高亮、代码自动完成、...

    Erlang并发编程,Erlang程序设计,Erlang中文手册

    Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。  Erlang是一个结构化,... 使用Erlang来编写分布式应用要简单的多,因为它的分布式机制是透明的:对于程序来说并不知道自己是在分布式运行。

    erlang22最新下载包

    5. **并发与分布式系统支持**:Erlang以其轻量级进程和消息传递为基础的并发模型著名,新版本可能会加强这方面的能力,更好地支持分布式应用程序。 6. **编译器和工具链**:Erlang的编译器和构建工具可能也得到了...

    erlang资源

    Erlang是一种面向并发的、函数式编程语言,由瑞典...这两本书结合阅读,将为初学者提供一个全面的Erlang学习路径,从基础语法到高级并发编程技巧,有助于深入理解Erlang语言及其在构建高并发、分布式系统中的强大能力。

    用Erlang写了个解八数码的小程序

    标题中的“用Erlang写了个解八数码的小程序”指的是使用Erlang编程语言实现的一个解决8数码问题(也称为滑动拼图)的算法。8数码问题是一个经典的计算机科学问题,它涉及到在一个3x3的网格上,通过空格与其他数字...

    <27>erlang record

    描述中提到的“NULL”可能是由于提供的信息不全,但通常在编程中,NULL或nil可以表示一个空值或者不存在的值。在Erlang中,这种值通常用`undefined`来表示。 标签“源码”表明我们将关注Erlang Record在实际代码中...

    erlang聊天室源码

    总之,这个Erlang聊天室源码项目为初学者提供了一个了解并发编程和实时通信系统的好机会。通过学习和分析这个项目,你可以深入理解Erlang语言特性和其在构建复杂系统中的应用,同时也可借鉴RabbitMQ的设计理念,提升...

    rustler编写erlang nif

    - NIFs可以提高计算密集型任务的效率,但必须谨慎处理,因为它们可能会破坏Erlang的进程隔离和错误恢复机制。 2. **Rustler介绍**: - Rustler是一个Erlang绑定库,用于编写安全的Rust NIFs。 - 它自动处理内存...

    Erlang_CNode用户指

    CNode是Erlang生态系统中的一个重要组件,它允许Erlang虚拟机(VM)与用其他语言(如C)编写的程序进行交互。CNode提供了一种方式,使得开发者可以利用Erlang的并发特性和强大错误处理能力,同时利用C语言的高效性能...

    Erlang编程语言

    **Erlang编程语言** Erlang是一种专为构建大规模并发服务系统而设计的编程语言,尤其在电信和云计算领域有着广泛的应用。由于其独特的设计理念和能力,它在处理高并发、分布式计算以及容错性方面表现出色,使得它...

    ErlangB和ErlangC计算工具(exe可执行文件+excel两个)

    Erlang B和Erlang C是电信领域中两种重要的流量模型,用于预测和分析通信系统中的呼叫处理能力和拥塞情况。这两个模型由丹麦工程师Agner Krarup Erlang在20世纪初提出,至今仍广泛应用于现代通信网络的设计与优化。 ...

    erlang深度分析.pdf

    Erlang的内存管理是非常高效的,它使用了一种特殊的垃圾回收机制来确保低延迟。了解ERTS内存使用情况对于优化Erlang程序至关重要。 #### 8. 高可用性和故障恢复 Erlang的heart进程是系统监视器,它负责监测和恢复...

Global site tag (gtag.js) - Google Analytics