Установка максимального количества незавершенных рабочих запросов для помещения в очередь отправки пары очередей в RDMA

Я пытаюсь создать пару очередей с помощью ibv_create_qp(), и мне нужно описать размер пары очередей, установив поля struct ibv_qp_cap и предоставив их функции создания. Моя проблема связана с полем max_send_wr, которое соответствует максимальному количеству невыполненных рабочих запросов, которые могут быть отправлены в очередь отправки этой конкретной пары очередей.

Согласно различным веб-ресурсам [1,2], вы должны установить это конкретное поле где-то в диапазоне [0 ... dev_cap.max_qp_wr], где max_qp_wr — это максимальное количество невыполненных рабочих запросов в любой поддерживаемой очереди отправки или получения. устройством RDMA (информацию можно получить, отправив запрос на устройство с помощью ibv_devinfo -v). При попытке создать QueuePair, когда я устанавливаю для поля максимально возможное значение (max_qp_wr, которое для моего устройства равно 32 КБ), функция ibv_create_qp() завершается с ошибкой ENOMEM. Путем проб и ошибок я выяснил, что он отлично работает, если я уменьшаю его до 8K.

Таким образом, мне интересно узнать, существует ли детерминированный способ вычисления значения max_send_wr для устройства RDMA, не прибегая к методу проб и ошибок? Кроме того, согласно некоторым данным [1], для конкретного устройства RDMA могут быть другие соображения для очереди отправки или получения, которые не позволяют создать QP с максимальными значениями. Каковы могут быть эти особенности устройства RDMA и как они влияют на расчет максимального значения?

[1] https://www.rdmamojo.com/2012/12/21/ibv_create_qp/

[2] https://linux-rdma.vger.kernel.narkive.com/rkR0gUjT/rdma-create-qp-and-max-send-wr


person kfertakis    schedule 14.11.2019    source источник


Ответы (1)


Я не уверен, что есть детерминированный и портативный способ ответить на ваш вопрос. В некоторых устройствах устройство устанавливает ограничение на размер рабочей очереди, а не на количество записей (например, устройства Mellanox), поэтому в зависимости от других параметров, таких как максимальный встроенный размер и записи с разбросом-сбором, фактическое количество отправить запросы на работу может.

person haggai_e    schedule 17.11.2019
comment
Итак, при создании приложения RDMA, скажем, для устройств Mellanox, каким будет лучший способ (наилучшая практика) установить поле max_send_wr, чтобы избежать ошибки ENOMEM. Должен ли я заранее рассчитать максимальное количество записей, которые мое приложение может отправить в очередь отправки этого QP? Спасибо - person kfertakis; 02.12.2019
comment
Я думаю, что лучше всего установить размер очереди на основе требований приложения и свойств сети. Например, для достижения скорости линии с одной очередью размер очереди должен быть примерно равен произведению пропускной способности сети на задержку. Некоторые протоколы имеют кредиты на уровне приложений, и тогда вам не нужно больше записей в очереди, чем количество кредитов. Если вы хотите автоматически определить, какие размеры очередей будут работать, вы можете попробовать большое число, а затем уменьшить его, если вы потерпите неудачу. - person haggai_e; 04.12.2019