Erlang文件I/O性能评测

本文评测了Erlang文件I/O与C标准I/O在不同环境和参数下的性能差异,包括顺序读写、随机读写、性能优化选项分析,以及具体I/O块大小对性能的影响。

转载:http://chaoslawful.iteye.com/blog/310346#bc2251686

 

评测目的

本测试主要目的是考察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。

 

 

在安装 Erlang 时,如果遇到错误提示 `/usr/lib/erlang/bin/epmd: No such file or directory`,通常意味着 Erlang 的安装路径配置不正确或安装过程中某些步骤未能正确完成。 从提供的引用来看,Erlang 的安装涉及将二进制文件链接到特定目录,并设置环境变量以确保系统可以找到这些文件[^1]。以下是一些可能的解决方案: ### 1. 检查软链接是否正确 根据引用 [^1],Erlang 安装过程通常会创建指向 `/usr/local/soft/erlang/bin` 的符号链接。请确认该目录下是否存在 `epmd` 及其对应的链接: ```bash ls -l /usr/lib/erlang/bin/epmd ``` 如果不存在,请手动创建符号链接: ```bash ln -s /usr/local/soft/erlang/bin/epmd /usr/lib/erlang/bin/epmd ``` ### 2. 验证环境变量设置 确保已将 Erlang 的 `bin` 目录添加到系统的 `PATH` 环境变量中。可以使用以下命令检查当前 `PATH` 是否包含 `/usr/local/soft/erlang/bin`: ```bash echo $PATH ``` 如果没有,请编辑 `/etc/profile` 文件并追加以下内容: ```bash export PATH=$PATH:/usr/local/soft/erlang/bin ``` 然后刷新环境变量: ```bash source /etc/profile ``` ### 3. 确认完整安装 确保你已经完整地解压了 Erlang 源码包,并按照标准流程执行了 `make` 和 `make install` 命令。如果安装中断或未完全执行,可能会导致部分文件缺失。 ### 4. 检查目标系统配置(如用于分布式部署) 如果你正在构建一个 Erlang 发行版并通过 `target_system/2` 函数进行部署[^2],请确保所有必要的脚本和可执行文件都已正确复制,并且 `%FINAL_ROOTDIR%` 和 `%EMU%` 被正确替换为实际路径和虚拟机类型。 ### 5. 检查分布式 Erlang 配置 如果问题出现在分布式 Erlang 应用中,可能是由于端口配置问题导致 `epmd` 无法启动。你可以参考 Erlang 官方文档对 `inet_dist_listen_min` 和 `inet_dist_listen_max` 进行配置[^3]: ```erlang {kernel, [ {inet_dist_listen_min, 6000}, {inet_dist_listen_max, 7999} ]}. ``` ### 示例:验证 Erlang 安装 安装完成后,可以通过以下命令验证 `epmd` 是否可用: ```bash epmd -d ``` 如果一切正常,应该能看到 `epmd` 的调试输出信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值