Bog BOS: Сервер кеширования имен (nscd)
Результаты разрешения имен хостов, пользователей и групп пользователей стандартными функциями libc (glibc) сервисами имен (про переключение сервисов имен см. NSS) в операционных системах Solaris и Linux могут кэшироваться с помощью сервера nscd. nscd кеширует результаты, полученные NSS.
Прикладная программа, которой необходимо, например, получить адрес хоста по его имени, вызывает подпрограмму gethostbyname(3) или аналогичную. При сборке программы к ней прилинковываются подпрограммы из библиотеки libc (glibc), которые проверяют наличие требуемой информации в кеше nscd (если, конечно, запущен сервер nscd). Если информацию из кеша извлечь не удалось, то используется NSS для определения сервиса имен, который (которые) будет использован для поиска адреса по имени. В общем случае, таким сервисом служит DNS клиент (resolver).
Кеширование имен пользователей и групп пользователей имеет смысл, если для их разрешения используется некий сетевой сервис (NIS или NIS+). Кеширование имен хостов очень полезно, если на хосте не запущен локальный сервер DNS (уровень кеширования имен хостов на почтовом сервере достигает 92%).
В Solaris сервер /usr/sbin/nscd и скрипты запуска устанавливаются по умолчанию. Скрипт запуска /etc/init.d/nscd имеет опции start и stop. Для запуска и остановки создаются соответствующие ссылки:
В Red Hat Linux и совместимых с ним (ядро не ниже 2.2!) сервер /usr/sbin/nscd и скрипт запуска /etc/rc.d/init.d/nscd входят в состав пакета ncsd-*.rpm (кстати, исходные тексты пакета берутся из glibc-*.srpm). nscd реализован в виде многопоточного процесса, общающегося с включаемой в glibc клиентской частью с использованием unix-сокета /var/run/.nscd_socket (права 0666, кто-нибудь пробовал записать туда мусор?). Для предотвращения повторного запуска используется файл /var/run/nscd.pid. Опции скрипта: start, stop, status, restart, reload. Для запуска и остановки создаются соответствующие ссылки (управление через chkconfig):
Посмотреть статистику (в Linux возможность доступна только root и не показывается уровень заполнения таблиц):
Имя файла конфигурации можно изменить с помощью ключа запуска -f (по умолчанию — /etc/nscd.conf).
При изменении настройки NSS или DNS-клиента сервер nscd требуется перезапустить.
В некоторых версиях имена хостов, имеющих несколько адресов, не кешируются, чтобы не мешать балансировке нагрузки удалекнного сервера.
Версия Linux имеет дополнительные ключи запуска:
- -d (отладочный режим)
- -t (—nthreads, максимальное число нитей)
- -K (—shutdown)
- -i (—invalidate имя-таблицы)
- -S (—secure имя-таблицы,yes; использовать отдельный кеш для каждого uid)
Каждая строка файла конфигурации задант значение некоторого атрибута. Действие оператора может быть ограничено пределами одной таблицы (hosts, passwd, groups). Комментарии начинаются символом # и завершаются концом строки.
Атрибуты:
- debug-level уровень-отладки (по умолчанию — 0; максимальный уровень — 10; при отладке nscd не уходит в фоновый режим; сообщения при уровне отладки 0 выдаются на syslog (NOTICE))
- logfile имя-отладочного-файла
- threads число-нитей (только для Linux; не меньше 5)
- server-user имя-пользователя (только для Linux; для повышения безопасности сервер nscd может запускаться под uid, отличным от root)
- enable-cache имя-таблицы yes | no
- positive-time-to-live имя-таблицысекунд
- negative-time-to-live имя-таблицысекунд
- suggested-size имя-таблицыразмер-hash-таблицы (размер должен быть простым числом; алгоритм остается эффективным даже если размер hash-таблицы в несколько раз меньше реального числа элементов)
- keep-hot-count имя-таблицычисло-часто-используемых-элементов (я не понял, что это значит; только для Solaris)
- check-files имя-таблицы yes | no (проверять ли регулярно — раз в 10 секунд — изменение локального файла (типа /etc/hosts) и сбрасывать соответствующий кеш)
- old-data-ok имя-таблицы yes | no (использовать устаревшие данные вместо ого, чтобы дожидаться обновления; только для Solaris)
Конфигурация по умолчанию расчитана на работу в составе рабочей станции, а не на сервера. Имена пользователей и групп пользователей у меня почти не используются, да и NIS не запущен), а вот кеширование имен хостов используется на сервере интенсивно, так что настройку таблицы хостов я сделал такую (кстати, она максимальная для Solaris по количеству позиций в таблице и количеству горячих позиций):
Источник
📑 Nscd — служба, которая кэширует запросы службы имён
Nscd — это демон (сервис), который предоставляет кэш для наиболее общих запросов службы имен. По умолчанию, поведение демона кэша определяет файл с настройками /etc/nscd.conf.
Установка сервиса (демона) nscd в Linux Ubuntu:
Можно посмотреть, что вообще происходит с кешем:
и список закешированных доменов
Допустимыми службами являются: passwd, group или hosts. Nscd ничего не знает о протоколах служб. Это также означает, что если вы изменяете .etc/resolv.conf для DNS запросов, nscd продолжит использование старых данных, если вы настроили в файле /etc/nsswitch.conf поиск узлов через использование DNS . В этом случае, вам нужно перезапустить nscd.
Nscd предоставляет кэширование для баз данных passwd, group, и hosts через стандартные интерфейсы libc, такие как getpwnam, getpwuid, getgrnam, getgrgid, gethostbyname, и другие.
Каждый кэш имеет для своих данных отдельное TLL (time-to-live — время жизни); изменения в локальной базе данных (/etc/passwd, и других) приводит к тому что кэш становится неправльным в течении пятнадцати секунд.
Nscd содержит два кэша на каждую категорию: попаданий (найденный элемент) и промахов (ненайденные элемены). Каждый кэш имеет для своих данных отдельный TTL (время жизни). Эти параметры настраиваются в /etc/nscd.conf . Для того, чтобы программа использовала кэширование, nscd должен быть запущен перед ней. Таким образом NSS кэш может решить проблему отключения сети, благодаря тому, что информация о пользователе будет получаться из кэша, пока он не устареет, даже если нет соединения с LDAP.
Файл /etc/nscd.conf читается демоном nscd при его запуске. Каждая строка задаёт или атрибут и значение, или атрибут, службу и значение. Поля разделяются или пробелами или символами табуляции. Символ # (решётка) говорит от начале комментария; следующие за ним до конца строки символы, не интерпретируются nscd.
Задаёт имя файла, в который будет записываться отладочная информация.
Устанавливает необходимый уровень отладки.
Здесь указывается число тредов (нитей) которые запускаются для ожидания запросов. Всегда создаются как минимум пять тредов.
Если эта опция установлена, nscd будет запущен от указанного пользователя, а не от пользователя root . Если используются отдельные кэши для каждого пользователя (ключ -S), то данная опция игнорируется.
Разрешает или запрещает кэш заданной службы service .
positive-time-to-live service value
Устанавливает время жизни (TTL) для положительных (успешные запросы) записей в заданном кэше для службы service . Значение Value задаётся в секундах. БОльшие значения увеличивают вероятность повторного использования запрошенных данных и уменьшают время ответа, но также увеличивают проблемы с достоверностью кэша.
negative-time-to-live service value
Устанавливает время жизни (TTL) для отрицательных (неуспешные запросы) записей в заданном кэше для службы service . Значение Value задаётся в секундах. Может значительно увеличить производительность, если существуют некоторые файлы, которыми владеет пользователь, у которого идентификатор пользователя (UID) не существует в системных базах данных (например распаковка tar’ом из под суперпользователя root исходных текстов ядра); должно бы быть небольшим, чтобы уменьшить проблемы достоверности кэша.
suggested-size service value
Задаёт размер внутренней хэш-таблицы, значение value для оптимальной эффективности должно бы быть простым числом.
Разрешает или запрещает проверку изменений для файлов, принадлежащих к заданной службе service . Это файлы /etc/passwd, /etc/group, и /etc/hosts.
Источник
nscd — кэширование dns запросов
В статье pdnsd – локальный кэширующий dns сервер я уже рассказывал о том, как можно организовать локальный кэширующий сервер.
Сегодня рассмотрим еще один вариант кэширования dns-запросов.
Во многих Linux-системах используется демон кэширования службы имен nscd. Он ставиться по умолчанию. И что интересно, о нем очень мало статей и информация, которая представлена в сети, очень скудна. В archlinux данный демон так же представлен и по умолчанию отключен.
Согласно man nscd:
Nscd предоставляет кэширование для баз данных passwd, group, и hosts через стандартные интерфейсы libc, такие как getpwnam, getpwuid, getgrnam, getgrgid, gethostbyname, и другие. Каждый кэш имеет для своих данных отдельное TLL (time-to-live — время жизни); изменения в локальной базе данных (/etc/passwd, и других) приводит к тому что кэш становится неправильным в течении пятнадцати секунд. Заметим, что файл shadow специально не кэшируется. Вызовы getspnam оставляют результат некэшированным.
Для того, чтобы активировать его, достаточно запустить данный демон:
Все! Все запросы к серверам имен теперь будут кэшироваться, и при следующем обращении браузера к dns-серверу будут браться значения из кэша.
Источник
Stable IT
FastNetMon
Thursday, 22 April 2010
Использование nscd на CentOS / Debian
real 0m16.113s
user 0m0.003s
sys 0m0.002s
time wget -q -O/dev/null xxx.com
real 0m16.215s
user 0m0.001s
sys 0m0.002s
Ставим nscd, который суперски умеет кэшировать запросы к DNS
Активируем запуск при загрузке:
Статистику работы nscd можно узнать командой:
Через несколько суток работы nscd на одном из наших хостинг-серверов было получены следующие значения:
0 server debug level
4d 17h 21m 20s server runtime
8 current number of threads
32 maximum number of threads
0 number of times clients had to wait
no paranoia mode enabled
3600 restart internal
yes cache is enabled
yes cache is persistent
yes cache is shared
211 suggested size
216064 total data pool size
18296 used data pool size
600 seconds time to live for positive entries
20 seconds time to live for negative entries
26303 cache hits on positive entries
0 cache hits on negative entries
18186 cache misses on positive entries
36 cache misses on negative entries
59% cache hit rate
190 current number of cached values
542 maximum number of cached values
7 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/passwd for changes
yes cache is enabled
yes cache is persistent
yes cache is shared
211 suggested size
216064 total data pool size
17648 used data pool size
3600 seconds time to live for positive entries
60 seconds time to live for negative entries
3283 cache hits on positive entries
0 cache hits on negative entries
4439 cache misses on positive entries
67 cache misses on negative entries
42% cache hit rate
245 current number of cached values
268 maximum number of cached values
8 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/group for changes
no cache is enabled
yes cache is persistent
yes cache is shared
0 suggested size
0 total data pool size
0 used data pool size
3600 seconds time to live for positive entries
20 seconds time to live for negative entries
0 cache hits on positive entries
0 cache hits on negative entries
0 cache misses on positive entries
0 cache misses on negative entries
0% cache hit rate
0 current number of cached values
0 maximum number of cached values
0 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/hosts for changes
yes cache is enabled
yes cache is persistent
yes cache is shared
211 suggested size
216064 total data pool size
1432 used data pool size
28800 seconds time to live for positive entries
20 seconds time to live for negative entries
32 cache hits on positive entries
0 cache hits on negative entries
15 cache misses on positive entries
1876 cache misses on negative entries
1% cache hit rate
9 current number of cached values
26 maximum number of cached values
2 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/services for changes
А вот потребление памяти:
ps aux | grep nscd
root 5138 0.0 0.0 346312 1020 ? Ssl Apr24 0:38 /usr/sbin/nscd
Теперь тестируем скорость работы DNS:
real 0m27.112s
user 0m0.003s
sys 0m0.001s
time wget -q -O/dev/null xxx.com
real 0m0.107s
user 0m0.001s
sys 0m0.001s
time wget -q -O/dev/null xxx.com
real 0m0.106s
user 0m0.001s
sys 0m0.001s
time wget -q -O/dev/null xxx.com
real 0m0.105s
user 0m0.000s
sys 0m0.002s
Теперь если отключить nscd, проблема вернется:
real 0m22.109s
user 0m0.000s
sys 0m0.003s
nscd умеет кэшировать не только DNS запросы, но и кучу всяких других тяжелых операций, выполняемых из libc, например: getpwnam, getpwuid, getgrnam, getgrgid, gethostbyname (как раз DNS).
Nscd provides caching for accesses of the passwd(5), group(5), and hosts(5)
databases through standard libc interfaces, such as getpwnam(3), getpwuid(3),
getgrnam(3), getgrgid(3), gethostbyname(3), and others.
Причем, не стоит бояться ошибок кэширования, так как он очень умный:
Источник