Linux下基于Erlang的高并发TCP连接压力实验
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连接压力实验的更多相关文章
- 配置开发支持高并发TCP连接的Linux应用程序全攻略
http://blog.chinaunix.net/uid-20733992-id-3447120.html http://blog.chinaunix.net/space.php?uid=16480 ...
- Linux配置支持高并发TCP连接(socket最大连接数)
Linux配置支持高并发TCP连接(socket最大连接数) Linux配置支持高并发TCP连接(socket最大连接数)及优化内核参数 2011-08-09 15:20:58| 分类:LNMP&a ...
- 高并发TCP连接数目问题
linux可通过五元组唯一确定一个链接:源IP,源端口,目的IP,目的端口,传输层协议.而一个端口不允许被两个及以上进程占用(一个进程可同时占用多个端口),据此是否可以推测一台linux服务器最多可以 ...
- linux下突破10万高并发的nginx性能优化经验
一.这里的优化主要是指对nginx的配置优化,一般来说nginx配置文件中对优化比较有作用的主要有以下几项:1)nginx进程数,建议按照cpu数目来指定,一般跟cpu核数相同或为它的倍数.worke ...
- 基于RTKLIB构建高并发通信测试工具
1. RTKLIB基础动态库生成 RTKLIB是全球导航卫星系统GNSS(global navigation satellite system)的标准&精密定位开源程序包,由日本东京海洋大学的 ...
- Linux C++ Socket 高并发短连接 TIME_WAIT 挥之不去解决方法
近期遇到一个项目 需要在Linux上建立一个Socket 进行 HTTP_GET , 需要线程高并发的 使用TCP Socket 进行Send 发送HTTP_GET请求到 指定网站 . 而且不需要re ...
- Linux 下 简单客户端服务器通讯模型(TCP)
原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...
- 分享知识-快乐自己:Linux下安装 erlang 及 RabbitmMQ
Linux下安装 erlang 及 RabbitmMQ: 下载地址一 下载地址二 下载地址三 安装依赖: yum install ncurses-devel 安装 erlang: 1):下载Erla ...
- Linux下基于LDAP统一用户认证的研究
Linux下基于LDAP统一用户认证的研究 本文出自 "李晨光原创技术博客" 博客,谢绝转载!
随机推荐
- [C#参考]事件和委托的关系
前面说了委托,接下来就要说一说事件了,同时最后再说一下委托和事件的区别. 事件和委托很相似,事件就好像是被简化的针对特殊用途的委托.看下面的图: 从这张图中能看到,事件是发布者的一个成员,它不是类型. ...
- Node.js学习笔记1(简介)
1.什么是Node.js? Node.js,或者 Node,是一个可以让 JavaScript 运行在服务器端的平台.它可以让 JavaScript 脱离浏览器的束缚运 ...
- android studio 安装与环境搭建
转摘自:http://blog.csdn.net/zhanghefu/article/details/9286123 第一章 andriod studio 安装与环境搭建 一.Android St ...
- [LeetCode]题解(python):024-Swap Nodes in Pairs
题目来源: https://leetcode.com/problems/swap-nodes-in-pairs/ 题意分析: 给定一个链表,每两个相邻节点就行交换.比如1->2->3-&g ...
- Nginx阅读笔记(三)之proxy_pass用法
在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走,如果没有/,则会把匹配的路径部分也给代理走. 假设访问 ...
- net core 静态文件
asp.net core 之静态文件目录的操作 文章前言 之前写了一篇关于模拟登录的文章,自我感觉内容不太丰富,今天的这篇文章,希望在内容上能丰富些.本人缺少写文章的经验,技术上也是新手,但我会努 ...
- NET Core,你必须了解无处不在的“依赖注入”
NET Core,你必须了解无处不在的“依赖注入” ASP.NET Core的核心是通过一个Server和若干注册的Middleware构成的管道,不论是管道自身的构建,还是Server和Middle ...
- 工程脚本插件方案 - c集成Python基础篇(VC++嵌入Python)
序: 为什么要集成脚本,怎么在工程中集成Python脚本. 在做比较大型的工程时,一般都会分核心层和业务层.核心层要求实现高效和稳定的基础功能,并提供调用接口供业务层调用的一种标准的框架划分.在实际中 ...
- CloudStack 物理网络架构
原文地址:http://www.shapeblue.com/cloudstack/understanding-cloudstacks-physical-networking-architecture/ ...
- struts2的总体回想(ACTION、拦截器、值栈、OGNL表达式、ModelDriven方案等)
ValueStack:struts2的一个存放数据的数据结构(核心) ValueStack大致能够理解为:由Map和对象栈组成 ValueStack作用范围:一个请求,用它来取代request的作用域 ...