【发布时间】:2019-09-07 14:40:27
【问题描述】:
python2.7如何改变每个IO读写操作的大小?
我正在尝试使用 AWS EBS HDD 存储,它通过限制 IO 操作的数量和每个操作的大小来限制带宽。引用the AWS volume type specs:
** gp2/io1 based on 16 KiB I/O size, st1/sc1 based on 1 MiB I/O size
在我的机器上运行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。我的问题是:
如何将其更改为 1MB,以充分发挥带宽潜力 由 AWS 提供?
虽然我认为 python 中的 IO 操作大小是由一些较低级别的模块 (io?) 决定的,但代码的相关部分如下所示:
x 是一个 memmapped numpy 数组,像这样加载
x = np.load("...", mmap_mode = 'r')
然后实际读取它的那部分代码就是这段代码sn-p的最后一行:
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
编辑:我也试过删除 memapping,只使用 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 的非常有帮助的答案),我想更一般地问一下:
如何调整系统参数以使 np.load() 和 np.save() 操作(有或没有 memmapping)在 AWS 限制策略下的最大带宽下工作?
【问题讨论】:
标签: python amazon-ec2 io bandwidth amazon-ebs