gpt4 book ai didi

python - 如何调整系统参数以使 numpy 的 load() 和 save() 实现 AWS HDD 卷的最大带宽?

转载 作者:行者123 更新时间:2023-12-01 08:01:08 24 4
gpt4 key购买 nike

如何更改 python2.7 执行的每个 IO 读写操作的大小?

我正在尝试使用 AWS EBS HDD 存储,它通过限制 IO 操作的数量和每个操作的大小来限制带宽。引用the AWS volume type specs :

** gp2/io1 基于 16 KiB I/O 大小,st1/sc1 基于 1 MiB I/O 大小

在我的机器上运行iostat -xmdtz 1,典型输出是这样的:

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
nvme1n1 0.00 0.00 1435.00 0.00 179.12 0.00 255.64 1.77 1.22 1.22 0.00 0.69 99.60

所以看起来python使用的IO大小是256KB。我的问题是:

How can I change that to 1MB, to realize the full bandwidth potential offered by AWS?

虽然我认为Python中的IO操作大小是由一些较低级别的模块(io?)决定的,但代码的相关部分如下所示:x 是一个内存映射的 numpy 数组,像这样加载

x = np.load("...", mmap_mode = 'r')

然后实际读取它的代码部分是此代码片段中的最后一行:

shared_x_base = multiprocessing.Array(ctypes.c_uint32, n1*k, lock=False)
shared_x = np.ctypeslib.as_array(shared_x_base)
shared_x = shared_x.reshape(n1, k)
shared_x[:] = x[:]

编辑:对于写入,大小(和带宽)初始激增,如下所示:

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
nvme1n1 0.00 0.00 29.00 2033.00 3.62 507.84 507.99 59.37 28.83 33.93 28.76 0.48 100.00

但最终结果是这样的:

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
nvme1n1 0.00 0.00 1673.00 0.00 207.12 0.00 253.55 1.78 1.06 1.06 0.00 0.59 98.80

编辑:我也尝试过删除内存映射,只使用 np.load 和 np.save ( this answer 表明这是要走的路,无论哪种方式我认为它都会帮助澄清问题的根源是什么。性能更差:

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
nvme1n1 0.00 0.00 589.00 0.00 73.62 0.00 256.00 1.88 3.19 3.19 0.00 1.68 99.20

由于我不太确定问题确实与 python 的 IO 操作大小有关(请参阅 Martijn Pieters' 非常有用的答案),我想问更普遍的问题:

How can I tune the system parameters to make np.load() and np.save() operations (with or without memmapping) work at the maximal bandwidth possible under the AWS throttling policy?

最佳答案

您正在将数组作为内存映射对象打开,它使用 mmap module在引擎盖下。最终使用 mmap system call并且无法进一步配置。

相反,映射文件的 I/O block 大小由内核控制,但可以通过 mmap.PAGESIZE 发现值,或在命令行上使用 getconf PAGESIZE .

您可以通过确保 transparent hugepages support is enabled 来调整此大小。在您正在运行的内核中。

但是,iostat统计信息很大程度上受内核 I/O 缓存调整参数的影响。来自 iostat manpage :

The iostat command generates reports that can be used to change system configuration to better balance the input/output load between physical disks.

您看到的第一个“爆发”是因为 iostat为您提供从系统启动时起的整体系统统计信息:

The first report generated by the iostat command provides statistics concerning the time since the system was booted. Each subsequent report covers the time since the previous report.

不要将这些数字解释为由您的 Python 代码引起的。

如果您想调整内核 I/O 缓存,请参阅 Performance Tuning on Linux - Disk I/O ,但请考虑到 AWS 可能已经针对网络连接存储对此进行了适当调整。

关于python - 如何调整系统参数以使 numpy 的 load() 和 save() 实现 AWS HDD 卷的最大带宽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55726043/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com