主机缓存的守护进程nscd

nscd 代表 Name Service Cache Daemon,用于为普通名称服务请求提供缓存。
为了提供主机缓存,nscd 守护进程使用 /etc/hosts 文件作为它的数据库,对数据库所做的任何更改都会立即通知 ny nscd,一旦这些更改,它将刷新缓存。
但是,这只会在很短的延迟后发生(除非 inotify(7) 机制可用并且 glibc 2.9 或者更高版本可用)该守护程序用于大多数需要频繁查找各种数据库和表的环境中时基来构建缓存并提高应用程序的最终性能,例如。
LDAP 使用 nscd 处理从客户端到服务器、网络服务器等的任何绑定请求

nscd 使用标准的 libc 接口为不同的数据库提供缓存,例如它使用 GETHOSTBYADDRGETHOSTBYNAME和其他主机数据库。

每个数据库有两个缓存:一个用于找到项目的正缓存,一个用于未找到项目的负缓存。
每个缓存对其数据都有一个单独的 TTL(生存时间)周期。
这些参数可以使用/etc/nscd.conf文件进行配置。

让我们看看主机缓存可用的几个选项和变量

要收集 nscd 的统计信息,请执行以下命令

注意:由于在本文中我们专注于主机缓存,因此我将 grep 仅显示主机缓存详细信息的输出

hosts cache:
            yes  cache is enabled
             no  cache is persistent
            yes  cache is shared
            211  suggested size
         216064  total data pool size
            320  used data pool size
            600  seconds time to live for positive entries
              2  seconds time to live for negative entries
              5  cache hits on positive entries
              0  cache hits on negative entries
              9  cache misses on positive entries
              1  cache misses on negative entries
             33% cache hit rate
              2  current number of cached values
              4  maximum number of cached values
              1  maximum chain length searched
              0  number of delays on rdlock
              0  number of delays on wrlock
              0  memory allocations failed
            yes  check /etc/{hosts,resolv.conf} for changes

'cache is enabled ' 告知主机缓存的状态,这意味着我们已启用此缓存。
如果任何缓存被禁用,这将是“否”

'缓存是持久的' 如果我们希望缓存在守护进程重启时保持持久,例如:存储的统计信息将保存在内存中,并且不会为大多数统计值刷新。

例如:
我现有的“启用”持久缓存的统计信息

hosts cache:
            yes  cache is enabled
            yes  cache is persistent
            yes  cache is shared
            211  suggested size
        3244035  total data pool size
              0  used data pool size
            600  seconds time to live for positive entries
              2  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
          88180  cache misses on negative entries
              0% cache hit rate
              0  current number of cached values
          30889  maximum number of cached values
            185  maximum chain length searched
              0  number of delays on rdlock
              0  number of delays on wrlock
              0  memory allocations failed
            yes  check /etc/{hosts,resolv.conf} for changes

重启nscd服务

# /etc/init.d/nscd restart
Shutting down Name Service Cache Daemon                                                                                 done
Starting Name Service Cache Daemon

守护进程重启后,值仍然相同

hosts cache:
            yes  cache is enabled
            yes  cache is persistent
            yes  cache is shared
            211  suggested size
        3244035  total data pool size
              0  used data pool size
            600  seconds time to live for positive entries
              2  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
          88180  cache misses on negative entries
              0% cache hit rate
              0  current number of cached values
          30889  maximum number of cached values
            185  maximum chain length searched
              0  number of delays on rdlock
              0  number of delays on wrlock
              0  memory allocations failed
            yes  check /etc/{hosts,resolv.conf} for changes

禁用“缓存持久化”并重新启动 nscd 守护程序服务后

hosts cache:
            yes  cache is enabled
             no  cache is persistent
            yes  cache is shared
            211  suggested size
         216064  total data pool size
              0  used data pool size
            600  seconds time to live for positive entries
              2  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,resolv.conf} for changes

所以所有的缓存条目都被清除了。

cache is shared 如果启用此选项,连接到服务器的任何客户端节点将在 nscd 缓存中自行执行查找,而不是询问 nscd 守护进程,这会使查找过程更快。
如果客户端主机条目在主机缓存中不可用,则仅需要 nscd 守护程序来更新缓存。
一旦 nscd 处于共享模式,nascd 缓存命中率通常显示为 0%,因为 nscd 大多不使用,并且从缓存中执行反向查找

建议大小(来自手册页)这是内部哈希表大小,值应保持为最佳效率的质数。
默认值为 211.

总数据池大小这占已被 nscd 查找的缓存主机条目的总列表(正负)

used data pool size nscd 当前会话中使用的主机缓存。
每次 nscd 守护进程重新启动时,此值将重置为“0”,并使用现有主机文件构建新使用的数据池大小。

秒 肯定条目的生存时间(来自手册页)在指定的缓存中为服务设置肯定条目(成功查询)的 TTL(生存时间)。
值以秒为单位。
较大的值会增加缓存命中率并减少平均响应时间,但会增加缓存一致性问题。

秒 否定条目的生存时间(来自手册页)在指定的服务缓存中为否定条目(不成功的查询)设置 TTL(生存时间)。
值以秒为单位。
如果 UID(用户 ID)拥有的多个文件不在系统数据库中(例如以 root 身份解压 Linux 内核源代码),则可以显着提高性能;应该保持较小以减少缓存一致性问题。

cache hits on positive entry 只有当 nscd 守护进程在非共享模式下运行时才会填充这个值,例如:'cache is shared' 变量是 'no'。
在这种情况下,nscd 执行所有查找,并将增加来自目标主机的任何查找的值,该主机设法与客户端主机建立 ESTABLISHED 网络连接。

例如。

我在主机文件中添加了以下条目

192.169.32.10 cc01-nds-ins

接下来我尝试从 192.169.32.10 ssh 到目标节点并观察 nscd 统计信息

# nscd -g | grep "hosts cache" -A 22 | grep "cache hits on positive entries"
             13  cache hits on positive entries

因此,由于 192.169.32.10 出现在我们的主机文件中,因此我们增加了正条目的缓存命中率

缓存命中负条目 只有当 nscd 守护程序在非共享模式下运行时才会填充此值,例如:“缓存共享”变量为“否”。
在这种情况下,nscd 执行所有查找,并将增加来自无法与客户端主机建立 ESTABLISHED 网络连接的目标主机的任何查找的值。

内存分配失败 如果未启用持久模式,那么除非为 nscd 分配的数据库大小空间不足,否则我们会看到此值增加的可能性很小。
启用持久模式后,所有缓存都存储在内存中,当我们开始看到内存分配失败的递增值时,可能会耗尽空间

例如:
我将数据库大小减少到以下大小

max-db-size             hosts           335511

并重新启动 nscd 服务

过了一会儿,我开始收到多个内存分配失败

hosts cache:
            yes  cache is enabled
             no  cache is persistent
            yes  cache is shared
            211  suggested size
         334559  total data pool size
         334544  used data pool size
            600  seconds time to live for positive entries
              2  seconds time to live for negative entries
              0  cache hits on positive entries
              0  cache hits on negative entries
              1  cache misses on positive entries
           3483  cache misses on negative entries
              0% cache hit rate
              1  current number of cached values
           3484  maximum number of cached values
             28  maximum chain length searched
              0  number of delays on rdlock
              0  number of delays on wrlock
         100418  memory allocations failed
            yes  check /etc/{hosts,resolv.conf} for changes
日期:2020-06-02 22:17:30 来源:oir作者:oir