Как настроить системные параметры таким образом, чтобы функции load () и save () numpy обеспечивали максимальную пропускную способность для томов жестких дисков AWS? - PullRequest
0 голосов
/ 17 апреля 2019

Как изменить размер каждой операции чтения и записи ввода-вывода, выполняемой 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?

1 Ответ

0 голосов
/ 17 апреля 2019

Вы открываете массив как объект, отображенный в памяти, который использует mmap модуль под капотом. В конечном итоге используется системный вызов mmap и не подлежит дальнейшей настройке.

Вместо этого размеры блоков ввода / вывода для mmaped файлов контролируются ядром, но могут быть обнаружены с помощью значения mmap.PAGESIZE или в командной строке с помощью getconf PAGESIZE.

Вероятно, вы можете настроить этот размер, убедившись, что поддержка прозрачных огромных страниц включена в ядре, которое вы используете.

Однако на статистику iostat сильно влияют параметры настройки кэша ввода-вывода . Из руководства iostat :

Команда iostat создает отчеты, которые можно использовать для изменения конфигурации системы, чтобы лучше сбалансировать нагрузку ввода-вывода между физическими дисками.

Первый «всплеск», который вы видите, связан с тем, что iostat дает вам общую статистику системы с момента загрузки системы :

Первый отчет, сгенерированный командой iostat, предоставляет статистику времени, прошедшего с момента загрузки системы. Каждый последующий отчет охватывает время с момента предыдущего отчета.

Не интерпретируйте эти числа как вызванные вашим кодом Python.

Если вы хотите настроить кеш ввода / вывода ядра, см. Настройка производительности в Linux - Дисковый ввод / вывод , но учтите, что AWS, вероятно, уже настроил это соответствующим образом для сетевого хранилища.

...