2016-06-30 4 views
0

Пользователи хакеров RDMA, знает ли кто-нибудь, если rdma_get_recv_comp(), который вызывает __ibv_get_cq_event() когда-либо тайм-аут?Как избежать застревания в rdma_get_recv_comp() или __ibv_get_cq_event()?

Моя проблема с теми же программами, как показано здесь: RDMA program randomly hangs

Он отлично работает, но это не устойчив к случайным клиент отключается. В частности, если я принудительно убиваю клиента, тогда сервер застревает в rdma_get_recv_comp()/ipv_get_cq_event().

Это для Mellanox ConnectX-3, и я проверил, что таймаут по умолчанию равен 2.14s и повторяет = 1. Но я не понимаю, будет ли ibv_get_cq_event() в режиме блокировки даже тайм-аутом. Объяснение тайм-аута в документации ibv_modify_qp(), похоже, предполагает, что таймауты применяются только для отправки (rdma_get_send_comp()), поскольку только отправители ждут ACK. Но я не вижу никаких трудностей с тем, чтобы позволить получать также тайм-аут.

Если в этом случае ожидается зависание внутри rdma_get_recv_comp(), как я могу избежать его или реализовать тайм-аут?

Некоторые возможности:

  1. изменить мой клиент последовательность выключения таким образом, что он выполняет все необходимые посылает так, что он не оставит rdma_get_recv_comp() на сервере висит?

  2. заменить rdma_get_recv_comp() с петлей, что опросы для приема пополнений

ответ

2

ibv_get_cq_event() не тайм-аут. Он ожидает событий завершения (которые генерируются, когда рабочий запрос завершается и генерирует запись очереди завершения). Если событие не генерируется, скажите, потому что ваш прием никогда не завершается, тогда вы будете ждать всегда. Если QP (соединение) переходит в состояние ошибки, то все отправленные сообщения будут заполнены статусом флеша, но если вы уничтожите QP перед опросом всех завершений, они будут удалены из CQ.

Таким образом, ваша проблема может заключаться в том, что когда клиент отключается, другая сторона не обязательно обнаруживает отключение - например, если клиент просто перезагружается, тогда RDMA CM не будет отключен полностью, и если серверная сторона не будет отключена, t есть любые посылки в полете, он не заметит разъединения. Вы можете справиться с этим с помощью своего рода keepalive - 0 байт RDMA WRITEs хорошо работают для этого, так как они являются NOP, но будут терпеть неудачу, если что-то пойдет не так с соединением.

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

Наконец, можно использовать ibv_get_cq_event() неблокирующим способом. В manpage приведен пример использования poll() в базовом дескрипторе файла канала завершения для ожидания событий с таймаутом.

Смежные вопросы