霜天部落 | 专注PHP研发,研究LAMP高性能架构部署与优化

linux开启nscd服务缓存加速

在我使用的阿里云主机上有观察到开启了一个服务nscd ,后来谷哥了下该服务的作用。了解到nscd会缓存三种服务passwd group hosts,所以它会记录三个库,分别对应源/etc/passwd, /etc/hosts 和 /etc/resolv.conf每个库保存两份缓存,一份是找到记录的,一份是没有找到记录的。每一种缓存都保存有生存时间(TTL)。其作用就是在本 当中增加cache ,加快如DNS的解析等的速度。

一、nscd的配置

通过编辑/etc/nscd.conf文件,在其中增加如下一行可以开启本地DNS cache:

  1. enable-cache hosts yes

阿里云主机上的配置如下:

  1. [root@361way ~]# cat /etc/nscd.conf
  2. #logfile /var/log/nscd.log
  3. threads 6
  4. max-threads 128
  5. server-user nscd
  6. debug-level 5
  7. paranoia no
  8. enable-cache passwd no
  9. enable-cache group no
  10. enable-cache hosts yes
  11. positive-time-to-live hosts 5
  12. negative-time-to-live hosts 20
  13. suggested-size hosts 211
  14. check-files hosts yes
  15. persistent hosts yes
  16. shared hosts yes
  17. max-db-size hosts 33554432

相关参数的解释如下:

logfile debug-file-name

指定调试信息写入的文件名。

debug-level value

设置希望的调试级别。

threads number

这是启动的等待请求的线程数。最少将创建5个线程。

server-user user

如果设置了该选项,nscd将作为该用户运行,而不是作为root。如果每个用户都使用一个单独的缓存(-S参数),将忽略该选项。

enable-cache service <yes|no>

启用或禁用制定的 服务 缓存。

positive-time-to-live service value

设置 service 在指定缓存中正的项目(成功的请求)的TTL(存活时间)。 Value 以秒为单位。较大的值将增加缓存命中率从而减低平均响应时间,但是将增加缓存的一致性问题。

negative-time-to-live service value

设置 service 在指定缓存中负的项目(失败的请求)的TTL(存活时间)。 Value 以秒为单位。如果存在由不在系统数据库中的uid(用户ID)(例如在以root身份解包linux 内核源代码时)所拥有的文件将明显改善性能;应该维持较小的值以降低缓存一致性问题。

suggested-size service value

这是内部散列表的大小, value 应该保持一个素数以达到优化效果。

check-files service <yes|no>

启用或禁用检查属于指定 服务 的文件的改变。这些文件是 /etc/passwd, /etc/group, 以及 /etc/hosts。

二、nscd 服务查看和清除

默认该服务在redhat或centos下是关闭的,可以通过services nscd start开启。缓存DB文件在/var/db/nscd下。可以通过nscd -g查看统计的信息,这里列出部分:

  1. [root@361way ~]# nscd -g
  2. nscd configuration:
  3. 5 server debug level
  4. 34d 23h 14m 18s server runtime
  5. 6 current number of threads
  6. 128 maximum number of threads
  7. 0 number of times clients had to wait
  8. no paranoia mode enabled
  9. 3600 restart internal
  10. 5 reload count
  11. passwd cache:
  12. no cache is enabled
  13. no cache is persistent
  14. no cache is shared
  15. 0 suggested size
  16. 0 total data pool size
  17. 0 used data pool size
  18. 3600 seconds time to live for positive entries
  19. 20 seconds time to live for negative entries
  20. 0 cache hits on positive entries
  21. 0 cache hits on negative entries
  22. 0 cache misses on positive entries
  23. 0 cache misses on negative entries
  24. 0% cache hit rate
  25. 0 current number of cached values
  26. 0 maximum number of cached values
  27. 0 maximum chain length searched
  28. 0 number of delays on rdlock
  29. 0 number of delays on wrlock
  30. 0 memory allocations failed
  31. yes check /etc/passwd for changes
  32. ……………………………………………………………………………………

清除缓存

  1. nscd -i passwd
  2. nscd -i group
  3. nscd -i hosts

除了上面的方法,重启nscd服务同样可以达到清理cache的目的。

三、nscd的效果

首先要看网络和dns服务器的能力,dns解析越慢,dns缓存的优势就越大.比如我们在北京用的dns服务器202.106.0.20和google的dns服务器8.8.8.8速度会差不少.

如果dns服务器比较稳定,那它对效率的影响就是一个常数.这个常数有多大呢?

我简单试了一下.在局域网内进行压力测试,压一个nginx下的静态页面,使用202.106.0.20这个dns服务器,不用dns缓存.平均一分钟可 以访问27万次.压一个简单的php页面,平均一分钟可以访问22万次.加上nscd服务后,静态页面平均一分钟可以访问120万次,要快4倍多.php 页面平均一分钟可以访问50万次,快一倍多.

如果是做搜索引擎或是一些代理服务类的项目,比如短信通道,数据推送服务,这个性能提升还是比较可观的.但在一般的项目中,一台服务器每分钟发22万次请求的情况是很少见的,所以这个性能提升也微呼其微.
但在追求极限的道路上,每一小步都至关重要噢~