SunRPC включает односторонний обмен сообщениями (потоковая передача / пакетная обработка?) - PullRequest
4 голосов
/ 31 августа 2010

У нас есть некоторые службы, использующие SunRPC в Linux (RHEL 4/5), которые мы хотели бы ускорить.

Наш вызов RPC не требует возвращаемого значения, хотя по природе RPC, ack всегда отправляется всегда. Это приводит к задержке, которая в последнее время стала проблемой - при работе через надежный транспорт (TCP) мы надеемся избежать задержки, вызванной ответом RPC.

Docs здесь указывает, что Solaris имеет ключевое слово "oneway", позволяющее только это, хотя Linux / glibc, похоже, не поддерживает это.

Есть ли способ включить потоковую передачу или одностороннюю передачу сообщений с SunRPC в Linux?

Ответы [ 2 ]

2 голосов
/ 19 ноября 2010

В стандартный вызов clnt_call() необходимо внести два изменения, чтобы получить асинхронный (или «пакетный») вызов RPC: аргумент, указывающий на функцию XDR для структуры данных ответа, должен бытьNULL и аргумент тайм-аута должен быть нулем, т. Е.

static struct timeval ZERO_TIMEOUT = { 0, 0 };
static char clnt_res;
memset((char*)&clnt_res, 0, sizeof(clnt_res);
if (clnt_call(clnt, messageType, (xdrproc_t)xdr_messageType_t, (caddr_t)argp,
            (xdrproc_t)NULL, (caddr_t)&clnt_res, ZERO_TIMEOUT) != RPC_SUCCESS) {
    ...
}
1 голос
/ 19 ноября 2010

Если ваша RPC-библиотека не поддерживает связь по "одностороннему пути", то вы всегда можете использовать Pattern Pool Thread , чтобы эмулировать вызов типа "запустить и забыть" в вашей программе.Вместо того, чтобы отправлять удаленный вызов напрямую (и, таким образом, блокировать до тех пор, пока вы не получите ответ), вы ставите в очередь команду , которая выполняет удаленный вызов в другом потоке и позволяет вашей основной программе продолжить выполнение.

...