前言

使用Erlang语言也写一个测试和前面大同小异的测试,在100万个并发连接用户情况下,就是想观察一下极显情况下的表现。

这个测试使用了优秀的Erlang界的明星框架cowboy,加单易用的接口,避免了我们对HTTP栈再次进行闭门造车。

测试Erlang服务器

运行在VMWare Workstation 9中,64位Centos 6.4系统,分配14.9G内存左右,双核4个线程,服务器安装Erlang/OTP R16B,最新版本支持异步代码热加载,很赞。

下载安装

本系统已经提前安装JDK,只需要安装Erlang好了。

安装依赖

yum install build-essential m4

yum install openssl

yum install openssl-devel

yum install unixODBC

yum install unixODBC-devel

yum -y install openssl make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel

yum install xsltproc fop

源代码安装

#wget https://elearning.erlang-solutions.com/binaries/sources/otp_src_R16B.tar.gz

#tar xvf otp_src_R16B.tar.gz

cd otp_src_R16B

./configure --prefix=/usr/local/erlang --enable-hipe --enable-threads --enable-smp-support --enable-kernel-poll

make

make install

添加到环境变量中(/etc/profile)

export ERL_HOME=/usr/local/erlang export PATH=$ERL_HOME/bin:$PATH

保存生效

source /etc/profile

测试进程创建

这里拷贝《Erlang程序设计》一书提供的processes.erl源码,稍作修改。

创建一百万个进程,看看大概花费多少时间。

[yongboy@base erlang]$ erl +P 10240000

Erlang R16B (erts-5.10.1) [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V5.10.1 (abort with ^G)

1> processes:max(200000).

Maxmium allowed process is 16777216 Process spawn time=1.1 (2.68) microseconds ok

2> processes:max(200000).

Maxmium allowed process is 16777216 Process spawn time=1.7 (2.33) microseconds ok

3> processes:max(200000).

Maxmium allowed process is 16777216 Process spawn time=1.55 (2.12) microseconds ok

4> processes:max(1000000).

Maxmium allowed process is 16777216 Process spawn time=2.97 (3.967) microseconds ok

5> processes:max(1000000).

Maxmium allowed process is 16777216 Process spawn time=2.4 (2.729) microseconds ok

6> processes:max(1000000).

Maxmium allowed process is 16777216 Process spawn time=2.19 (2.735) microseconds ok

7> processes:max(10000000).

Maxmium allowed process is 16777216 Process spawn time=3.328 (4.2777) microseconds ok

8> processes:max(10000000).

Maxmium allowed process is 16777216 Process spawn time=3.144 (3.1361) microseconds ok

9> processes:max(10000000).

Maxmium allowed process is 16777216 Process spawn time=3.394 (3.2051) microseconds ok

恩,创建1000万个进程,每一个进程花费3.4微秒(μs)的CPU时间,相当于4.3微秒(μs)的消耗时间(亦即消耗的真实时间),在一定量的区间内,其值变化,可以看做是一个常量。

初始化小问题

Cowboy初始化需要事项

我们做的简单程序,使用了非常受欢迎的cowboy框架,其启动函数:

cowboy:start_http(my_http_listener, 100,

[{port, 8000}],

[{env, [{dispatch, Dispatch}]}]

),

Cowboy默认支持1024个连接,服务器端输出:

online user 1122 online user 1123

停滞于此,后续的连接只能排队等候了。

这里设置支持无限个连接好了。

{max_connections, infinity}

话说,Cowboy为Erlang世界的明星产品,绝对值得一试!

Erlang默认创建进程限制

Erlang在我的机器上默认允许创建的线程也是有限的:

erlang:system_info(process_limit).

262144

才26万个,不够用。在启动脚本(start.sh)处添加允许创建的最大线程支持:

#!/bin/sh

erl +K true +P 10240000 -sname testserver -pa ebin -pa deps/*/ebin -s htmlfilesimple\

-eval "io:format(\"Server start with port 8000 Success!~n\")."

脚本启动后现在在erl shell中测试一下:

erlang:system_info(process_limit).

16777216

数量完全够用了。

开启erlang的epoll属性

+K true | false 是否开启kernel poll,就是epoll;

不开启,测试过程中,在内存完好情况下,经常会有连接失败情况。

使用cowboy_req:compact降低内存占用

一旦你从request对象中获取到足够的信息,以后不再获取其附加属性时,调用compact/1函数可去除无用属性,起到节省内存作用。

程序里面调用如下:

init(_Any, Req, State) -> NowCount = count_server:welcome(),

io:format("online user ~p :))~n", [NowCount]),

output_first(Req),

Req2 = cowboy_req:compact(Req),

{loop, Req2, State, hibernate}.

在本例中精测压缩内存效果不明显,因为 ,测试端输出的HTTP头部压根就没有几个。

Cowboy无法处理没有header的HTTP请求

这里需要牢记,也不能算是BUG,前面的client2.c源码,就未曾设置HTTP Header元数据,需要做些简单修改,修改之后的测试端程序文件名为client5.c,

可以到这里 下载client.c。

Cowboy处理长连接

Cowboy很贴心的提供了cowboy_loop_handler behaviour。在init/3函数中,可以进入休眠状态,节省内存,消息到达时,被唤醒,值得一赞!

其定义如下:

注意hibernate和timeout参数,按照实际需求返回即可。

htmlfile_handler示范代码如下:

100万并发连接达成

测试过程跌跌撞撞的,虽然这中间因为内存问题抛出若干的异常,但也达到100W连接的数量

online user 1022324 :))

online user 1022325 :))

online user 1022326 :))

online user 1022327 :))

online user 1022328 :))

online user 1022329 :))

online user 1022330 :))

online user 1022331 :))

online user 1022332 :))

online user 1022333 :))

online user 1022334 :))

online user 1022335 :))

online user 1022336 :))

online user 1022337 :))

online user 1022338 :))

可以看到状态信息

算一下:

14987952K = 14636M

14987952/1022338 = 14.7K/Connection

未启动时的内存情况:

total used free shared buffers cached

Mem: 14806 245 14561 0 12 60

-/+ buffers/cache: 172 14634

Swap: 3999 0 3999

启动后的内存占用情况:

total used free shared buffers cached

Mem: 14806 435 14370 0 12 60

-/+ buffers/cache: 363 14443

Swap: 3999 0 3999

用户量达到1022338数量后的内存一览:

total used free shared buffers cached

Mem: 14806 14641 165 0 1 5

-/+ buffers/cache: 14634 172

Swap: 3999 1068 2931

可以看到,当前内存不够用了,需要虚拟内存配合了。

查看一下当前进程的内存占用

ps -o rss= -p `pgrep -f 'sname testserver'`

4869520

这样算起来,系统为每一个进程持有 4869520/1022338 = 4.8K 内存。

这个值只是计算物理内存,实际上连虚拟内存都占用了,估计在4.8K-6.8K之间吧。

和C语言相比,内存占用相当大,我虚拟机器分配的15G内存,也仅仅处理达到100万的连接,已经接近极限时,会发现陆陆续续的有连接失败。

不得不说的代码热加载

运行时系统的代码热加载功能,在这个实例中,通过vi修改了htmlfile_handler.erl文件,主要修改内容如下:

io:format("online user ~p :))~n", [NowCount]),

......

io:format("offline user ~p :(( ~n", [NowCount]).

执行make,编译

[root@base htmlfilesimple]# make

==> ranch (get-deps)

==> cowboy (get-deps)

==> htmlfilesimple (get-deps)

==> ranch (compile)

==> cowboy (compile)

==> htmlfilesimple (compile)

src/htmlfile_handler.erl:5: Warning: record status is unused

src/htmlfile_handler.erl:29: Warning: variable 'Reason' is unused

Compiled src/htmlfile_handler.erl

很好,非常智能的rebar,自动只编译了htmlfile_handler.erl一个文件,然后通知Erlang的运行环境进行代码热替换吧。

(testserver@base)4> code:load_file(htmlfile_handler).

查看日志输出控制台,可以看到已经生效,同时也保存着到状态数据等。

非常利于运行时调试,即不伤害在线状态数据,又能即时修改,赞!但生产环境下,一般都是版本切换,OTP的版本切换,测试或马上修改bug时,着实有些复杂。

小结

和C相比,处理相同的事情(100万并发连接),及其简单,但Erlang会需要更多的内存,廉价的内存可以满足,只是我的搭建在Vmware中的虚拟机器已经达到了它所要求的极限。

完整的源代码,可点击这里下载。

erlang web服务器性能,100万并发连接服务器笔记之Erlang完成1M并发连接目标相关推荐

  1. 访问量100万的网站服务器,100万访问量 服务器配置

    100万访问量 服务器配置 内容精选 换一换 弹性负载均衡有不同的负载均衡,分别是共享型负载均衡和独享型负载均衡,便于用户根据不同的应用场景和功能需求选择合适的负载均衡器类型.共享型负载均衡:适用于访 ...

  2. 各种云服务器性能优秀强大,各家云服务器性能对比

    各家云服务器性能对比 内容精选 换一换 外部镜像文件在从原平台导出前,没有按照"Windows操作系统的镜像文件限制"的要求完成初始化操作,推荐您使用弹性云服务器完成相关配置.流程 ...

  3. 战地一服务器性能怎么提高,战地1服务器设置教程

    战地1服务器设置教程 内容精选 换一换 您可以根据以下步骤使用管理控制台创建一个裸金属服务器实例.本教程以部署一台Web应用服务器为场景,旨在帮助您快速创建一个实例,因此不会涵盖所有可能的选项.详细的 ...

  4. ldap 服务器性能调优,监控OpenLDAP服务器性能指南.pdf

    跟踪OpenLDAP 服务器性能 原文:/articles/monitoringldap.html LDAP 已经成为互联网标准的目录访问协议,并且用于访问一切从DNS 区域文件 到用户帐户信息.随着 ...

  5. 8核16g服务器性能,8核16g云服务器

    8核16g云服务器 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. GPU加速型 ...

  6. windows服务器性能分析方法小结,Windows服务器性能分析方法小结

    Windows服务器性能各种指标的分析 事情的起因是BOSS/CRM系统的扩容.我所要做得,仅仅是写一份CRM Windows服务器的性能分析,不过这足以让我一筹莫展了,毕竟当时对主机性能分析的认识, ...

  7. 服务器性能是什么,什么是服务器性能的显卡,怎么理解?

    什么是服务器性能的显卡,怎么理解? 如果单说""二字就是个伪命题,服务分不同的性能级别,有些刀片器的性能甚至还不如某些发烧级的游戏台式机,那它所用的显卡性能也会比较一般,如果是说哪 ...

  8. powerbi服务器性能分配,Power BI 报表服务器容量计划指南

    Power BI 报表服务器容量计划指南 04/02/2020 本文内容 Power BI 报表服务器是自助式 BI 和企业报表解决方案,客户可以在本地(防火墙后)进行部署. 它将 Power BI ...

  9. linux服务器性能查看命令,查看Linux服务器性能的日常命令和工具大全

    通过使用以下命令和工具,可以在1分钟内对系统资源使用情况有个大致的了解uptime dmesg | tail vmstat 1 mpstat -P ALL 1 pidstat 1 iostat -xz ...

  10. et框架做游戏服务器性能好吗,et游戏服务器框架

    et游戏服务器框架 内容精选 换一换 华为云视频分析服务帮助中心,为用户提供产品简介.用户指南.API参考.常见问题等技术文档,帮助您快速上手使用视频分析服务. ServiceStage是一个应用托管 ...

最新文章

  1. Leetcode 461. Hamming Distance JAVA语言
  2. (转)浅谈HTML5与css3画饼图!
  3. JavaScript 函数 伪数组 arguments
  4. Qt|C/C++植物大战僵尸修改器(用户版)
  5. HDUOJ --2523
  6. linux下面java配置,linux下面配置java环境变量
  7. 查看php文件的效果,HTML5的交互式动画效果文件夹预览查看特效
  8. mac 安装memcached服务
  9. 体验 Vista Speech Recognition,使梦想成为可能
  10. c#语言经典程序100例,C#入门必看的实例程序100个 - 源码下载|Windows编程|其他小程序|源代码 - 源码中国...
  11. 面试官:有没有比读写锁更快的锁?
  12. JSONObject遍历
  13. 学习wordpress模板制作第一天 函数bloginfo
  14. 第二节:各种路由约束(动态路由、静态路由、组合路由、正则约束、命名空间约束、区域内路由)...
  15. js基础-19-判断图片加载完成的方法
  16. php新手自学手册,PHP完全自学手册(文档教程)
  17. 充电器input与output_变频器input和output的区别?
  18. Hello Python(十七)——Python扩展模块开发
  19. GWAS: 网页版的基因型填充(genotype imputation)
  20. 【计算机网络】宽带接入技术

热门文章

  1. python decimal.quantize()参数rounding的各参数解释与行为
  2. 卓尼斯ZT-180点评
  3. CentOS 6.5 shell中su切换自动输入密码
  4. 基于SpringCloud Alibaba实现的论坛
  5. Myeclipse10如何进行代码提示和自动补全
  6. 项不会计算为接受 0 个参数的函数_玩转excel函数:详解四种计数函数,从基础到提高...
  7. 邵阳学院学校云认证码_2021年湖南对口单招升学学校排名
  8. BNU 斩(超级大水题)
  9. js 获取元素文本_JS中获取元素属性的8大方法
  10. 【UVA12230】Crossing Rivers(概率/期望)