time wget -q -O/dev/null xx.com
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
CentOS way
yum install -y nscd
Активируем запуск при загрузке:
chkconfig nscd on
Запускаем:
/etc/init.d/nscd start
Debian way
apt-get install -y nscd
Статистику работы nscd можно узнать командой:
nscd -g
Через несколько суток работы nscd на одном из наших хостинг-серверов было получены следующие значения:
nscd -g
nscd configuration:
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
passwd cache:
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
group cache:
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
hosts cache:
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
services cache:
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:
time wget -q -O/dev/null xxx.com
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, проблема вернется:
time wget -q -O/dev/null xxx.com
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.
Причем, не стоит бояться ошибок кэширования, так как он очень умный:
The daemon will try to watch for changes in configuration files appropriate
for each database (e.g. /etc/passwd for the passwd database or /etc/hosts and
/etc/resolv.conf for the hosts database), and flush the cache when these are
changed.
http://kernel.org/doc/man-pages/online/pages/man8/nscd.8.html
Интересно какой будет от него эффект на NS сервере %)
ReplyDeleteДа никакого =)
ReplyDeleteА тогда в каких целяъ использовать его?
ReplyDeleteНу для много каких, это же прозрачный кэшер для libc функций, хорошо работающий при запросе имен юзеров, групп, резолвинге хостов (часто эта функция отключена).
ReplyDelete"А тогда в каких целяъ использовать его?"
ReplyDeleteНу там сверху написано: все, что нужно libc
Пример из жизни: у меня пользователи подключатся по SSH, проходя аутентификацию в LDAP. Вот чтобы такому пользователю сделать команду ls, ему нужно тыщу раз слазить в LDAP и там проверить UID всех. Это просто жуть. Да что я говорю, вот наглядная картинка:
Пустая директория:
testuser@git1:~$ time ls -l
total 0
real 0m0.004s
user 0m0.004s
sys 0m0.000s
А теперь та же директория, где есть что отрезолвить в LDAP:
testuser@git1:~$ time ls -lA
total 12
-rw------- 1 testuser 2001 220 Jan 3 18:30 .bash_logout
-rw------- 1 testuser 2001 3184 Jan 3 18:30 .bashrc
-rw------- 1 testuser 2001 675 Jan 3 18:30 .profile
real 0m30.049s
user 0m0.008s
sys 0m0.008s
30 секунд на листинг почти пустой домашней директории? Волей не волей узнаешь что такое nscd.
************
Паш, спасибо за наводку. Реально спасло.
Кстати, да :) И твою задачу более корректно решать через nscd чем мою.
ReplyDelete