评测目的
本测试主要目的是考察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%。图表如下:
分享到:
相关推荐
Port Driver 提供了一种方式,使得 Erlang 系统能够与外部世界交互,执行低级别的I/O操作或调用非Erlang代码实现的高效算法。 标题 "erlang port driver test" 指的是一个测试项目,这个项目专注于验证和测试 ...
- **I/O处理**:ERTS采用了高效的I/O模型,通过POLL事件机制,允许进程在等待I/O完成时不会阻塞整个系统。 - **消息传递**:ERTS中的进程间通信完全基于消息传递,这是一种非常高效的方式。消息队列按进程级别组织,...
9. **IO处理**:Erlang的IO系统基于Unix哲学,将所有设备视为文件,支持多种IO模型如kernel poll(如epoll、kqueue),并使用定时器处理和逻辑处理(process、coroutine、fiber)等机制,优化了I/O性能。 10. **...
2. **mp3_sync.beam** - 这个模块可能是关于多媒体文件同步或处理的,Erlang的并发特性使其适合处理I/O密集型任务,如音频和视频处理,通过同时处理多个数据流来优化性能。 3. **processes.beam** - Erlang的进程...
3. **标准库**:提供大量预定义的模块,如数学运算、字符串处理、文件I/O、网络通信等。 4. **分布式特性**:Erlang OTP支持跨节点的进程通信,允许在多个节点上分布运行应用,提供容错和负载均衡能力。 5. **...
这将生成`.beam`文件,这些文件是Erlang虚拟机可执行的模块。 4. **测试**:编译完成后,可以运行`rebar3 eunit`进行单元测试,确保库功能正常。 ### 三、esockd的使用 1. **启动esockd应用**:在Erlang shell中...
5. **Erlang文件I/O**:学习Erlang的file模块,如何进行读写操作,以及如何使用其异步I/O特性。 6. **并发与事件驱动编程**:理解Erlang的进程模型,如何处理并发事件,以及如何设计事件驱动的程序结构。 7. **跨...
5. **异步和回调**:Erlang的并发特性允许非阻塞I/O,hackney可能提供了异步请求的接口,通过回调函数处理结果。 6. **安全特性**:是否支持HTTPS/TLS,证书验证、加密等安全相关功能。 7. **中间件支持**:可能...
- **异步I/O**:框架支持非阻塞I/O操作,提高系统整体吞吐量。 - **配置灵活性**:开发者可以通过配置选项调整连接超时、重试策略、SSL选项等,适应不同的应用场景。 - **模块化设计**:Shackle的设计是模块化的,...
- 考虑使用epoll或kqueue等高级I/O多路复用技术,提高并发性能。 - 限制连接池大小,防止资源过度消耗。 通过理解以上知识点,你可以更好地理解和使用Erlang中的tcp_client模块,无论是创建自己的TCP客户端连接...
3. **Kernel**:提供基本的系统接口,如文件I/O、网络通信和进程间通信。 4. **stdlib**:标准库,包含各种常用的数据结构和函数,如列表处理、模式匹配和文件操作。 5. **Compiler**:Erlang的编译器,将Erlang源...
4. **资源管理**:服务器可以监控和限制系统资源的使用,如CPU、内存和磁盘I/O,防止资源耗尽导致系统崩溃。 5. **扩展性**:gen-batch-server设计为可扩展,允许开发者自定义任务处理逻辑,添加新的调度策略或错误...
1.2.1. 操作系统配置:优化内存、CPU和磁盘I/O以适应EMQ的需求,确保网络连通性。 1.2.2. EMQ部署安装:访问EMQ官方网站获取最新版本的安装包,按照官方指南进行安装。 1.2.2. EMQ集群部署:在所有服务器上配置...
**WINIO技术:** WINIO是一种在Windows操作系统下进行底层I/O访问的技术,它允许程序员绕过传统的系统调用,直接与硬件接口交互,提供更高的性能和更细粒度的控制。通常,这种技术被用于实时系统、设备驱动开发、...
1. **性能监控工具**:这些工具可以实时或周期性地收集Riak服务器的关键指标,如CPU使用率、内存消耗、网络吞吐量和I/O操作。通过这些数据,我们可以识别系统瓶颈,为性能调优提供依据。 2. **基准测试脚本**:基准...
- **非阻塞I/O**:Node.js 使用异步I/O模型,避免了线程上下文切换带来的开销,提高了性能。 - **模块系统**:Node.js 内置了模块系统,通过 `require` 和 `module.exports` 来组织代码,便于代码重用和管理。 ###...
在处理torrent文件时,Elixir提供了强大的文件I/O功能。例如,可以使用`File`模块来读取和写入文件,或者使用`Stream`来处理大型文件而无需一次性加载到内存。在Yolandi中,这些工具可能用于跟踪下载进度、存储已...
- TMemoryTransport:使用内存进行I/O操作。 - TZlibTransport:结合zlib进行压缩传输,通常与其他传输方式联合使用。 3. 支持的服务模型: - TSimpleServer:简单的单线程服务模型,常用于测试。 - ...