Как изменить размер каждой операции чтения и записи ввода-вывода, выполняемой python2.7?
Я пытаюсь использовать хранилище на жестком диске AWS EBS, которое ограничивает пропускную способность, устанавливая ограничения на количествоопераций ввода-вывода и размер каждой операции.Чтобы процитировать спецификации типа тома AWS :
** 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, составляет 256 КБ.Мой вопрос:
Как я могу изменить это значение на 1 МБ, чтобы реализовать полный потенциал полосы пропускания, предлагаемый AWS?
Хотя я думаю, что размер операции ввода-вывода в pythonопределяется каким-то модулем более низкого уровня (io
?), для чего это стоит, соответствующая часть кода выглядит следующим образом: x - это записанный массив memmapped, загруженный так:
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 ( этот ответ предполагает, что это путь, и в любом случае я думал, что это поможет выяснить, каков источник проблемы. Производительность еще хуже:
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
Поскольку я менее уверен, проблема действительно в том, что я на питонеО размере операции (см. Очень полезный ответ Мартина Питерса), я хотел бы спросить более широко:
Как я могу настроить системные параметры, чтобы сделать np.load () и np.save ()операции (с или без привязки к памяти) работают на максимально возможной полосе пропускания в соответствии с политикой регулирования AWS?