nscd 配置示例说明
在文章 Linux 系统如何处理名称解析中我们提到了 nscd
作为 glibc 的组件提供了 dns 缓存的功能, 这篇文章则主要介绍 nscd
的部署和使用注意事项. 如下列表:
测试机器
Centos 6/7
Ubuntu 18.04/20.04
Debian 10.6
如何安装
目前安装 nscd 可能会依赖 glibc 相关的包, 运行时间长的系统安装的时候大概率都需要升级 glibc. 如果一定要安装, 建议下载和系统已有的 glibc 相同的版本.
备注: 如果升级了 glibc, 我们建议重启系统中所有使用了 glibc 内存分配的应用程序.
以如下方式指定安装 nscd:
Centos 6/7:
yum install nscd
ubuntu / Debian:
apt install nscd
配置说明
不同发行版系统的配置大体一致, 配置文件都为 /etc/nscd.conf, 主要的区别如下所示:
Centos 系统: 安装时创建 nscd 用户, 以 nscd 用户启动服务;
Debian/Ubuntu 系统: 安装时不创建用户, 以 nobody 用户启动服务;
基于此我们可以统一配置如下示例(仅开启 hosts 相关的缓存):
# /etc/nscd.conf
#
# An example Name Service Cache config file. This file is needed by nscd.
#
logfile /var/log/nscd.log
threads 6
max-threads 32
server-user nobody
debug-level 0
paranoia no
enable-cache passwd no
enable-cache group no
enable-cache services no
enable-cache netgroup no
enable-cache hosts yes
positive-time-to-live hosts 300
negative-time-to-live hosts 5
suggested-size hosts 503
check-files hosts yes
persistent hosts no
shared hosts yes
max-db-size hosts 33554432
整体上缓存的有效时间建议设置的不要太大(这里为 300秒
), 缓存失效时间也不要太长(这里为 5 秒
). suggested-size
为内部结构的哈希大小, 需要为一个素数.
说明: 配置中的空行不要出现空字符串, 以免出现配置解析错误.
备注: ubuntu 系统通过 apt 安装后会直接启动 nscd 服务, 同时默认开启 persistent 持久化, 所以不能直接修改 suggested-size 选项, 该选项需要为素数, 表示 hash 大小, 相当于最大缓存 dns 的条目数. 如果需要修改该值(比如素数 503, 1021 等), 有以下几种方式: Ubuntu/Debian 系统:
1. 修改 persistent 为 no, 再修改 suggested-size, 重启 nscd 服务, 这样重启后会忽略持久化信息(/var/cache/nscd/hosts); 2. 删除持久化信息(/var/cache/nscd/hosts), 再修改 suggested-size, 重启 nscd 服务;
备注: 可以参考文章 preventing-ubuntu-starting-daemon-when-install-package 禁止 Ubuntu/Debian 在 apt install
后自动启动服务.
性能说明
另外, 我们对 nscd 做了下简单的测试对比, 测试代码见 getaddrinfo_bench.c
// 禁用 nscd 时
Running benchmark
getaddrinfo: 1024/1024 successful lookups
getaddrinfo: 1.474190ms average per lookup
// 开启 nscd 时
Running benchmark
getaddrinfo: 1024/1024 successful lookups
getaddrinfo: 0.008714ms average per lookup
可以看到性能的提升还是很明显的, 原先 1s 只能解析 678 次, 开启 nscd 后, 1s 可以解析 114757 次.