评测目的
本测试主要目的是考察Erlang文件I/O同C标准I/O之间具体的性能差异。
预备知识
Erlang中有普通文件I/O和裸文件I/O两类操作,其中普通文件I/O的文件句柄是一个进程ID,因此可以从Erlang节点网络的任意位置访问该句柄;而裸文件I/O的文件句柄是一个tuple结构,只在同一节点上打开该文件的进程内有效,无法跨进程跨节点访问。一般来说裸文件I/O速度要远高于普通文件I/O。
此外Erlang RTS还有一些选项能够改善大I/O流量情况下的进程响应速度,这里主要使用的是如下2个选项:
- +K true|false
- 该选项用于打开(true)或关闭(false,默认)Erlang RTS的Kernel poll功能。当Kernel poll被关闭时,RTS使用普通的用户态事件轮询接口select/poll进行进程和I/O调度,调度开销较大;打开Kernel poll时,RTS将使用内核级事件轮询接口(如Linux上的epoll等)进行调度,开销较小,可以提高存在大量进程时的响应速度。
- +A integer -
该选项用于调整Erlang RTS用于异步I/O的异步线程池大小。目前可以设置为0(不使用异步I/O,默认)至1024之间的整数。当不使用异步I/O时,RTS会把对于较大数据块的I/O操作切分为多个小数据块的I/O,以避免单个大I/O操作阻塞RTS的消息循环导致其他进程无法继续响应;当使用异步I/O时,RTS会把I/O操作派发到异步线程池中的某个worker线程的任务队列里,由独立于RTS消息循环的worker线程来处理耗时很长的I/O操作(Leader-Follower模式)。这两种对大I/O操作的处理方式都存在一定开销:不使用异步I/O时单个I/O操作变成多次I/O操作,让I/O操作调用开销增加了N倍(N为平均切分出的I/O操作次数);使用异步I/O时,OS需要在RTS调度线程和异步I/O线程之间进行上下文切换,这也是相对较为耗时的操作。
为此,评测时也进行了默认状态(+K false +A 0
)和调整后状态(+K true +A 32
)的I/O性能比较。
评测环境及用例
评测环境为公司发放的笔记本HP nx6320,Intel Duo T2400 1.83GHz(2 cores),1GB RAM,60G SATA HD。
测试用例分为顺序读写和随机读写2种,每种类型下分别进行参数调整前后的读和写时间测试:
-
顺序读算法:按照指定的块大小逐块读取测试数据文件,直至全部读取完毕为止,测量全部用时;
- 顺序写算法:按照指定的块大小逐块将随机数据写入测试数据文件,直至写入大小满足要求为止,测量全部用时;
- 随机读算法:随机移动到测试数据文件内某处,按照指定的块大小读取1块,直至累计读取长度满足要求为止,测量全部用时;
- 随机写算法:将测试数据文件预先truncate到指定大小,然后随机移动到文件内某处,按照指定的块大小写入1块随机数据,直至累计写入长度满足要求为止,测量写入过程全部用时。
测试数据文件大小为100MB,I/O块大小从1KB、2KB开始按2的倍数递增至1024KB,以测试不同I/O块大小对性能的影响。
评测结果
顺序I/O
使用Erlang默认参数进行读操作时,C标准I/O速度是Erlang普通文件I/O速度的~5076%,是Erlang裸文件I/O速度的~191%;增加上述的RTS选项后Erlang I/O速度基本没有变化。图表如下:
使用Erlang默认参数进行写操作时,C标准I/O速度是Erlang普通文件I/O速度的~92%,是Erlang裸文件I/O速度的~194%;增加上述的RTS选项后,普通文件I/O速度降低,裸文件I/O速度提高,此时C标准I/O速度是Erlang普通文件I/O速度的~192%,是Erlang裸文件I/O速度的~124%。图表如下:
随机I/O
使用Erlang默认参数进行读操作时,C标准I/O速度是Erlang普通文件I/O速度的~2556%,是Erlang裸文件I/O速度的125%;增加上述的RTS选项后Erlang I/O速度基本没有变化。图表如下:
使用Erlang默认参数进行写操作时,C标准I/O速度是Erlang普通文件I/O速度的~128%,是Erlang裸文件I/O速度的~62%;增加上述的RTS选项后普通文件I/O速度有所提高,但裸文件I/O速度有所降低,此时C标准I/O速度是Erlang普通文件I/O速度的~125%,是Erlang裸文件I/O速度的~107%。图表如下:
测试代码
C标准I/O顺序读写代码
见附件中的 seq_rw.c.zip。
C标准I/O随机读写代码
见附件中的rand_rw.c.zip。
Erlang顺序读写代码
见附件中的 seq_rw.erl.zip。
Erlang随机读写代码
见附件中的 rand_rw.erl.zip。
- 大小: 56.7 KB
- 大小: 58.4 KB
- 大小: 56.9 KB
- 大小: 52.8 KB
分享到:
相关推荐
erlang 25.1
rabbitmq安装相关的包,erlang.rpm/rabbitmq-server.rpm/socat.rpm,安装步骤看https://blog.csdn.net/qq_37846169/article/details/126085715?utm_source=app&app_version=5.5.0
erlang官方没有龙芯版本的安装包,这个是用24版本的源码在龙芯3a5000下编译的版本,解压缩以后将bin路径加入PATH环境变量即可使用。
官网下载实在是困难,我把当前Erlang / OTP 21.0 版本提交到这里提供给大家和自己下载 原先积分0的现在都这么高了,为了方便大家,放出云盘地址:https://pan.百度.com/s/1hb8vPiMslXxNuJC8PvnKgg提取码wmx8
虽然 Linux VM 像任何其他进程(内存、系统进程、磁盘)一样拥有自己的状态,但与外部世界的所有 I/O 都是通过 Erlang VM(当前工作:网络、系统控制台)作为消息发送的。 要求 sudo apt-get install user-mode-...
此文件为otp_src_20.2.tar.gz 的二次压缩文件 解压先用unzip otp_src_20.2.zip 出来, 然后就是安装时的 tar -zxvf otp_src_20.2.tar.gz内容了, 此文件为了自己使用是方便找到,请把分数定为1分,谢谢
This guide covers Erlang/OTP requirements, recommendations, caveats and commonly used installation sources. Unsupported Versions Erlang/OTP versions older than 19.3 are not supported by currently ...
java php python erlang 千万级内存数据性能比较,
Erlang opt_win64 20.2 windows exe 安装包 Erlang 20.2 is the upcoming version of Erlang For Windows x64 installer 截至2018.01.25 groovy最新最稳定版本
Erlang/OTP Application完整例子,含代码和二进制,对于学习Erlang/OTP Application很有帮助。 配套文章http://blog.csdn.net/mycwq/article/details/12610677
Erlang/OTP 26.2.1,Erlang,OTP,26.2.1
erlang otp25 win安装包
Erlang OTP 20.1 Windows 64-bit Binary File 下载地址:http://www.erlang.org/downloads
rabbitmq 1.4.0源码,基于erlang语言
Erlang 运行环境的安装文件,Erlang 运行环境的安装文件.
使用erlang做后端、flutter做前端开发的一款开源的即时聊天解决方案(基于erlang/otp的高性能web框架 cowboy 做后端服务,用 "8核16G 主机"压测,保持100万+TCP稳定在线90分钟以上) 支持基于webrtc 一对一视频通话...
This book is what you get if you put together an Erlang enthusiast who worked on the R1 release of OTP in 1996 and a Distributed Systems specialist who discovered Erlang/OTP
服务端采用erlang的gen_server,客户端采用java的swing组件,用界面按钮进行操作
二十多年来,在传统电信领域高并发、高可靠、高容错的严酷环境下,Erlang语言和OTP平台被锻炼得坚如磐石,浓郁的函数式特质更是恰到好处地弥补了传统命令式语言在并发编程上的固有缺陷,大大降低了构筑并发、容错、...
rabbitmq安装前的环境安装,Erlang23.0 Windows64安装包,官网下载了几个小时