nscd 可缓存 /etc/hosts 和 DNS 解析结果以提升高并发域名解析性能,需手动启用 hosts 缓存、配置 TTL 并用 getent 测试,修改 hosts 后需执行 nscd -i hosts 刷新缓存。

在 Linux 系统中,nscd(Name Service Cache Daemon)能有效缓存 /etc/hosts 和 DNS 查询结果,减少重复解析开销,尤其适合高并发、频繁查域名的场景(如 VPC 内 ECS 每秒 DNS 请求超 2000 次时)。它不缓存 /etc/resolv.conf 本身,但会缓存通过该文件配置的上游 DNS 所返回的解析结果。
确认并安装 nscd 服务
多数 CentOS/RHEL 系统默认未启用 nscd,Ubuntu/Debian 可能未预装:
- 检查是否已安装并运行:
systemctl status nscd;若提示“not found”或“inactive”,需安装 - CentOS/RHEL:
yum install -y nscd - Ubuntu/Debian:
apt-get install -y nscd - 安装后启用开机自启:
systemctl enable nscd
配置 hosts 缓存(关键步骤)
nscd 默认不开启任何缓存。必须显式启用 hosts 缓存才能加速域名解析(它不叫“dns 缓存”,而是通过缓存 hosts 查找路径间接提升解析效率):
- 编辑配置文件:
vi /etc/nscd.conf - 确保包含以下关键行(其他 service 如 passwd/group 可按需关闭):
enable-cache hosts yes positive-time-to-live hosts 300 negative-time-to-live hosts 20 check-files hosts yes persistent hosts yes shared hosts yes
-
positive-time-to-live设为 300 秒(5 分钟)较常用:平衡时效性与命中率;negative-time-to-live控制“查无此域名”的缓存时间,避免反复失败查询
启动并验证缓存效果
配置保存后立即生效,无需重启系统:
- 启动服务:
systemctl start nscd - 查看实时统计:
nscd -g,重点关注hosts cache hit rate和cache hits on positive entries是否随请求上升 - 手动触发一次解析(如
getent hosts example.com),再运行nscd -g对比命中数变化 - 注意:使用
ping或curl可能绕过 nscd(取决于 glibc 配置),推荐用getent hosts 域名测试
日常维护与注意事项
nscd 提升性能的同时带来缓存一致性代价:
- 修改
/etc/hosts后,旧记录仍可能被缓存:执行nscd -i hosts即可仅清空 hosts 缓存,无需重启服务 - 若发现命中率长期为 0,检查应用是否直接调用底层 socket(跳过 libc 名称服务),可尝试将
shared hosts no改为yes并重启 nscd - 变更公网 DNS 解析记录(如 CDN 切换 IP)后,需等待
positive-time-to-live过期或主动刷新,不可强依赖即时生效 - 缓存文件位于
/var/cache/nscd/,异常时可停服务后清空目录重建:systemctl stop nscd && rm -rf /var/cache/nscd/* && systemctl start nscd











