linux by abi包装器
linux-aio的Python项目详细描述
[英语][한국어 (korean)]
linux-aio:python包装器用于Linux Kernel AIO
直接使用linux内核aio的python包装器模块
什么是linux内核aio?
总之,它允许非阻塞和异步使用阻塞io操作,如read(2)和write(2)。
相关文件
它不同于POSIX AIO
posix aio api有aio_
前缀,而linux内核aio有io_
前缀。
已经有一个用于异步I/O的POSIX AIO API,但是Linux在glibc(一个用户空间库)中实现它,glibc应该在内部使用多线程。 因此,从下面的实验中可以看出,这比使用阻塞的io api要糟糕得多。
实施和结构
包装linux_aio
- 基于linux内核aio的底层绑定linux_aio_bind包实现。
- 与linux_aio_bind不同,它可以在不了解
ctypes
的情况下使用。
- 示例可以在test directory中的代码中找到
示例
示例可以在test directory中的代码中找到。
注释和限制
- 显然只有在Linux上才可用
- 因为它是一个包装器,所以带来了linux的限制。
- 它不能用于用作内核接口的文件。(例如
cgroup
) - Sometimes it works as Blocking.
- 有一些事情已经解决后,通过发展张贴。
- 一些功能正在添加,因为它们仍在开发中。
- 当Linux版本较低时,还有一些特性不受支持
- 您需要检查Linux man pages (4.16)及其相关的API文档
- 它不能用于用作内核接口的文件。(例如
评估
Experiment script(需要python 3.7)
设置
发行版:ubuntu server 16.04.5 lts
Linux:4.19.0
CPU:2路Intel(R)Xeon(R)CPU E5-2683 v4@2.10GHz
内存:总计64GB
存储:sk hynix sc300b sata 512gb
Python:3.7.2(Ubuntu ppa)
尝试以
1ms
间隔总共读取1000
次文件大小从
1KB
到100KB
不等,但很小。尝试同时增加读取的文件数
因为我们已经在高性能服务器上进行了实验,所以在典型的桌面上进行测试时,可能会有更大的性能差异
比较目标
- aiofiles-使用线程池
- aiofile-使用posix aio
- libaio-使用libaio
- python built-in open()
这不是一个完全公平的比较。
aiofiles
和aiofile
是支持asyncio的库因为open()
是阻塞的,所以有一个缺点是,在io进行时,您不能执行任何其他工作。libaio
和linux_aio
是非阻塞的,但必须轮询。
结果
它可能因环境而异。
运行时
- 单位:秒
# of files | 1 | 6 | 12 | 24 |
---|---|---|---|---|
aiofiles | 1.681 | 3.318 | 5.354 | 9.768 |
aiofile | 1.543 | 1.958 | 2.493 | 3.737 |
libaio | 1.311 | 1.344 | 1.362 | 1.423 |
open() | 1.252 | 1.322 | 1.375 | 1.481 |
linux_aio | 1.305 | 1.327 | 1.353 | 1.431 |
螺纹
# of files | 1 | 6 | 12 | 24 |
---|---|---|---|---|
aiofiles | 321 | 321 | 321 | 321 |
aiofile | 3 | 8 | 15 | 26 |
libaio | 1 | 1 | 1 | 1 |
open() | 1 | 1 | 1 | 1 |
linux_aio | 1 | 1 | 1 | 1 |
内存
- 物理内存(虚拟内存)
# of files | 1 | 6 | 12 | 24 |
---|---|---|---|---|
aiofiles | 21MB (22.6GB) | 21MB (22.6GB) | 21MB (22.6GB) | 21MB (22.6GB) |
aiofile | 17MB (258MB) | 17MB (654MB) | 17MB (1080MB) | 18MB (1949MB) |
libaio | 17MB (76MB) | 17MB (76MB) | 17MB (76MB) | 17MB (76MB) |
open() | 17MB (76MB) | 17MB (76MB) | 17MB (76MB) | 17MB (76MB) |
linux_aio | 17MB (76MB) | 17MB (76MB) | 17MB (76MB) | 17MB (76MB) |
CPU利用率
# of files | 1 | 6 | 12 | 24 |
---|---|---|---|---|
aiofiles | 42.8% | 85.0% | 102.2% | 113.2% |
aiofile | 31.4% | 52.4% | 67.0% | 84.0% |
libaio | 14.0% | 16.0% | 17.2% | 20.6% |
open() | 13.4% | 17.6% | 21.0% | 26.2% |
linux_aio | 13.0% | 15.0% | 16.0% | 21.0% |