Ответ 1
<суб > Как alk упоминает в своем комментарии, повторная попытка getaddrinfo()
более 100 раз должна принудительно выполнить запрос nscd.
суб >
Чтобы понять, почему, давайте быстро заглянем в поток выполнения внутри getaddrinfo().
-
gaih_inet()
выполняет следующие операции над__nss_not_use_nscd_hosts
:- Проверяет, является ли это положительным целым?
- Увеличивает его.
-
Проверяет, превышает ли он количество попыток
NSS_NSCD_RETRY
- Он пытается запросить nscd ТОЛЬКО, если выполняются оба вышеуказанных условия.
Также при попытке запроса к nscd счетчик немедленно reset равен нулю, игнорируя nscd для следующего
NSS_NSCD_RETRY
разgetaddrinfo()
. -
Также
__nss_not_use_nscd_hosts
внутренне модифицируется nscd в следующих местах-
nscd/nscd_gethst_r.c строки 178, 189
- reset до1
. -
nscd/nscd_getai.c строки 89, 164
- reset до1
. -
nss/nsswitch.c, строка 709
- установить на-1
, то есть отключить nscd.
-
Исходя из вышесказанного, можно сделать вывод, что getaddrinfo()
НЕ запрашивает nscd каждый раз. Также внутреннее состояние nscd (определяется __nss_not_use_nscd_hosts
) решает, заканчивается ли getaddrinfo()
вызовом nscd или нет.
Чтобы действительно заставить один из способов избежать 100 повторных попыток, можно изменить
NSS_NSCD_RETRY
и перестроить libc для отклонения от стандартного поведение. Но я не уверен, что это НЕ приведет к другие непреднамеренные регрессии.
Ссылка: Патч, введший логику __nss_not_use_nscd_hosts
в getaddrinfo()
.