Передача RDMA без сопоставления памяти

У меня есть дополнительные процессы, которые должны обмениваться файлами по сети IB. Затем файлы будут использоваться другими процессами.

Рабочий процесс следующий:

  1. Создавать файлы в /dev/shm
  2. Измените размер файлов соответствующим образом
  3. Файлы карты в виртуальной машине процесса
  4. Зарегистрируйте mmaped область с помощью ibv_reg_mr
  5. Инициировать операцию RDMA для передачи данных

Оказалось, что узким местом в моей схеме является ib_reg_mr (замерял отдельно регистрация 3Gb памяти занимает 1,78 секунды). Кажется, что это запускает сопоставление области памяти с адресным пространством процесса. К сожалению, эта операция не нужна, так как процесс-получатель не использует эту память. Память должна быть отображена и использована другими процессами позже.

Поэтому я подумал, что было бы разумно обойти изменение таблиц страниц для процесса получения, но я не смог найти, возможно ли это вообще.

Не могли бы вы посоветовать мне, есть ли способ инициировать передачу данных в области памяти без сопоставления ее с адресным пространством процесса?


person mcsim    schedule 05.06.2016    source источник


Ответы (2)


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

person haggai_e    schedule 06.06.2016

Вместо этого попробуйте FRWR (рабочий запрос на регистрацию быстрой памяти). Это API, который выполняет регистрацию в памяти с помощью глагола ibv_post_send — гораздо более быстрый способ:

http://lists.openfabrics.org/pipermail/general/2008-May/050235.html

http://lxr.free-electrons.com/source/include/rdma/ib_verbs.h?v=3.2#L734

person kliteyn    schedule 05.06.2016
comment
Я нашел описание структуры данных ibv_send_wr в книге Linux Kernel Networking, но, к сожалению, эта структура имеет другое определение в /usr/include/infiniband/verbs.h на машине, что актуально для меня. Я предполагаю, что это означает, что ядро ​​на этой машине не поддерживает эту функцию. И я не могу обновить ядро. Но в любом случае спасибо, я могу использовать этот интерфейс в будущем. - person mcsim; 06.06.2016
comment
@mcsim вам не нужно обновлять ядро. Не знаю, какой дистрибутив и ядро ​​вы используете, но если оно не слишком старое, вы можете просто установить пакет OFED. - person kliteyn; 07.06.2016