1、实验环境:

联想小型机:

操作系统:RedHat Enterprise LinuxServer release6.4(Santiago)

内核版本号:Linux server1 2.6.32-358.el6.x86_64#1 SMP

CPU型号:Intel(R)Xeon(R)CPU
E7-4820 @2.00Ghz。

内存:132G

磁盘:289G

、基于erlang开发设计了TCPserver,

)tcp连接过程序的建立,server端的port数=clientport数+1;(2)port的打开的数量上限决定着tcp连接的个数。

,通过ulimit
–n 1000000。该值不能超过硬限制的个数。

假设要进一步提高。须要从软限制和硬限制双方面考虑,详细可參考:还有一方面/proc/sys/net/ipv4/ip_local_port_range的值决定了一个侦听端口所能接收的最大tcp连接数,改动该值能够通过vi
/etc/sysctl.conf,改动后运行sysctcl -p使其生效。提高连接数的一个方法是通过开多个侦听端口来接收client的连接。怎样改动操作系统所能打开的最大文件数和ip_local_port_range成为影响tcp连接总数的两个关键点。

Erlang虚拟机默认的port上限为65536, erlang17通过erl
+Q 1000000能够改动端口上限为1000000,利用erlang:system_info(port_limit)进行查询,系统能够打开的最大文件描写叙述符能够通过erlang:system_info(check_io)中的max_fds进行查看,查看系统当前port数量能够用erlang:length(erlang:ports())得到

、代码:

tcp_client

-module(tcp_client).

]).

loop_start(Port,Num)->

case start(Port)of

system_limit
-> io:format("");

)

end.

start(Port)->

try

case gen_tcp:connect("127.0.0.1",Port,
[binary,{packet,raw},{active,true},{reuseaddr,true}])of

{ok,Socket}->Socket;

{error,Reason}-> {error,Reason}

end

catch

throw:T->T;

exit:R->R;

error:E->E

end.

send_data(Socket,Data)when
is_list(Data)orelse is_binary(Data)->

gen_tcp:send(Socket,Data),

receive

{tcp,Socket,Bin}->

io:format("recv~p~n",[Bin]);

{tcp_closed,Socket}->

io:format("receive server don't accept connection!~n")

end.

close(Socket)when is_port(Socket)->

gen_tcp:close(Socket).

generic_server:

-module(generic_server).

-behaviour(gen_server).

-define(TCP_OPTIONS,[binary,{packet,raw},{reuseaddr,true},{active,false}]).

]).

-export([]).

,maxconn}).

start(ServerName,Port,Max,{M,F})->

gen_server:start_link({local,ServerName},?MODULE,[#server_state{port=Port,maxconn=Max,loop={M,F}}],[]).

init([State=#server_state{port=Port}])->

case gen_tcp:listen(Port,?

TCP_OPTIONS)of

{ok,LSocket}->

{ok,accept(State#server_state{lsocket=LSocket})};

{error,Reason}->

{stop,{create_listen_socket,Reason}}

end.

accept(State=#server_state{lsocket=LSocket,loop=Loop,conn=Conn,maxconn=Max})->

Pid = spawn(generic_server,accept_loop,[self(),LSocket,Loop,Conn,Max]),

State.

accept_loop(Server,LSocket,{M,F},Conn,Max)->

erlang:group_leader(erlang:whereis(user),self()),

{ok,Sock} = gen_tcp:accept(LSocket),

if

true ->

gen_server:cast(Server,{accept_new,self()}),

M:F(Sock)

end.

handle_cast({accept_new,FromPid},State)->

Conn =State#server_state.conn,

]),

LSocket =State#server_state.lsocket,

Loop=State#server_state.loop,

Max=State#server_state.maxconn,

,Max]),

{noreply,
State}};

handle_cast({connect_close,FromPid},State)->

Conn=State#server_state.conn,

]),

}}.

echo_server:

-module(echo_server).

]).

start(Port)->

,

generic_server:start(echo_server,
Port, Max, {?

MODULE,loop}).

loop(Sock)->

)of

{ok,Data}->

gen_tcp:send(Sock,Data),

loop(Sock);

{error,closed}
->

io:format("client sock close~n"),

gen_server:cast(echo_server,{connect_close,self()})

end.

、通信流程

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemNjXzAwMTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">

5、结论

设定ulimit  –n 100000。假定ip_local_port_range   1   65535,侦听一个port的连接数为65534,再打开一个侦听port为100000-65534=34466,  
单端口受制于ip_local_port_range的范围。总共的连接数为打开的文件描写叙述符个数。

Linux下基于Erlang的高并发TCP连接压力实验的更多相关文章

  1. 配置开发支持高并发TCP连接的Linux应用程序全攻略

    http://blog.chinaunix.net/uid-20733992-id-3447120.html http://blog.chinaunix.net/space.php?uid=16480 ...

  2. Linux配置支持高并发TCP连接(socket最大连接数)

    Linux配置支持高并发TCP连接(socket最大连接数) Linux配置支持高并发TCP连接(socket最大连接数)及优化内核参数 2011-08-09 15:20:58|  分类:LNMP&a ...

  3. 高并发TCP连接数目问题

    linux可通过五元组唯一确定一个链接:源IP,源端口,目的IP,目的端口,传输层协议.而一个端口不允许被两个及以上进程占用(一个进程可同时占用多个端口),据此是否可以推测一台linux服务器最多可以 ...

  4. linux下突破10万高并发的nginx性能优化经验

    一.这里的优化主要是指对nginx的配置优化,一般来说nginx配置文件中对优化比较有作用的主要有以下几项:1)nginx进程数,建议按照cpu数目来指定,一般跟cpu核数相同或为它的倍数.worke ...

  5. 基于RTKLIB构建高并发通信测试工具

    1. RTKLIB基础动态库生成 RTKLIB是全球导航卫星系统GNSS(global navigation satellite system)的标准&精密定位开源程序包,由日本东京海洋大学的 ...

  6. Linux C++ Socket 高并发短连接 TIME_WAIT 挥之不去解决方法

    近期遇到一个项目 需要在Linux上建立一个Socket 进行 HTTP_GET , 需要线程高并发的 使用TCP Socket 进行Send 发送HTTP_GET请求到 指定网站 . 而且不需要re ...

  7. Linux 下 简单客户端服务器通讯模型(TCP)

    原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...

  8. 分享知识-快乐自己:Linux下安装 erlang 及 RabbitmMQ

    Linux下安装 erlang 及 RabbitmMQ: 下载地址一  下载地址二 下载地址三 安装依赖: yum install ncurses-devel 安装 erlang: 1):下载Erla ...

  9. Linux下基于LDAP统一用户认证的研究

    Linux下基于LDAP统一用户认证的研究                   本文出自 "李晨光原创技术博客" 博客,谢绝转载!

随机推荐

  1. Java学习03

    Java学习03 1.java面试一些问题 一.什么是变量 变量是指在程序执行期间可变的数据.类中的变量是用来表示累的属性的,在编程过程中,可以对变量的值进行修改.变量通常是可变的,即值是变化的 二. ...

  2. Yii2 国际化的问题 zh-CN

    代码增加位置: 在项目文件目录的config->main.php 的 return 内增加以下内容,并在项目目录中新建messages 内设置 en-US 和zh-CN 文件夹.zh-CN文件夹 ...

  3. Python之路Day13

    day13主要内容:JavaScript.DOM.jQuery 武Sir blog:http://www.cnblogs.com/wupeiqi/articles/5369773.html JavaS ...

  4. AHK(1)之运行程序或打开文档

    小鸟学AHK(1)之运行程序或打开文档   AHK就是AutoHotKey,是一款免费的.Windows平台下开放源代码的热键脚本语言. 亲爱的朋友,叫我怎么向你推荐它呢! COOL,对,就是酷,那么 ...

  5. hibernate HQL查询 2.2

    hql(都要在事务中完成)session.beginTransaction();session.getTransaction().commit(); session.beginTransaction( ...

  6. lua学习:使用Lua处理游戏数据

    在之前lua学习:lua作配置文件里,我们学会了用lua作配置文件. 其实lua在游戏开发中可以作为一个强大的保存.载入游戏数据的工具. 1.载入游戏数据 比如说,现在我有一份表单: data.xls ...

  7. jvm Classload method介绍

    1,jvm Classload默认几个重要方法介绍 findClass:Finds and loads the class with the specified name from the URL s ...

  8. 自定制emoji替换系统的emoji键盘

    一.关于emoji表情 随着iOS系统版本的升级,对原生emoji表情的支持也越来越丰富.emoji表情是unicode码中为表情符号设计的一组编码,当然,还有独立于unicode的另一套编码SBUn ...

  9. iOS弹出底部视图简单实现

    - 项目基本目录 其中xib文件用来自定义需要弹出的视图. 在主控制器里设置popview的frame等信息代码如下: 底部视图(popview)初始化放在父类视图的最顶部或者说是整个屏幕的最底部,宽 ...

  10. BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )

    既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...