我的目标:让 nscd 在多余的内存中维护一个相当大的 DNS 缓存,因为我有它可用。
描述:
我有一个网络服务器,其用户群分布广泛但重复率高。它有足够的内存,所以我认为我可以通过缓存查找来提高响应时间,但根据nscd -g
我的说法,我的缓存命中率只有 6%(这意味着nscd
很可能会为缓存引入更多延迟,或者在缓存中查找它永远找不到的条目,而不是通过网络阻止):
hosts cache:
yes cache is enabled
yes cache is persistent
yes cache is shared
211 suggested size
216064 total data pool size
2328 used data pool size
36000 seconds time to live for positive entries
20 seconds time to live for negative entries
4455 cache hits on positive entries
0 cache hits on negative entries
17357 cache misses on positive entries
42348 cache misses on negative entries
6% cache hit rate
17 current number of cached values
40 maximum number of cached values
3 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
造成 6% 命中率的一个重要因素可能是它只缓存了 17 个条目。执行 astrings /var/db/nscd/hosts
表明它创建的主机缓存条目主要针对我们内部网络上的计算机。缓存这些内容是件好事,因为网站的每日重新发布可能会加快,但我的目标是在不进行任何实际配置更改的情况下加快最终用户体验。
这是以下的相关部分nscd.conf
:
threads 10
server-user nscd
debug-level 0
paranoia no
[.....snip......]
enable-cache hosts yes
positive-time-to-live hosts 36000
negative-time-to-live hosts 20
suggested-size hosts 10657
check-files hosts yes
persistent hosts yes
shared hosts yes
max-db-size hosts 33554432
基本上,我需要帮助来理解为什么我的主机缓存会如此之小,尽管我已将主机缓存上的正 TTL 设置得非常高。我确信实际缓存条目的数量较少导致命中率如此之低。
我假设命中率为 6%,但我的正 TTL 相当大,这意味着我当前的工作量是执行 DNS 主机查找,但它们只是没有被保存。我不知道为什么这些没有被保存,也不知道接下来要检查什么。我所期望的现在将是一个相当大的 DNS 缓存。
即使命中率仍然很小(即:客户没有像我想象的那样频繁重复),我仍然期望那些DNS 查找被缓存,但查看“当前缓存值的数量”,这似乎也没有发生。
答案1
您的网络服务器的哪一部分正在执行 DNS 查找?大多数网络服务器配置明确禁用每个传入用户的反向 DNS 查找,以提高速度(因为 DNS 通常很慢)。
正如 Patrick 指出的那样,nscd 正在做正确的事情并尊重积极的 TTL 值。是的,你可以覆盖它(unbound
可以让你轻松地做到这一点,只需修改server.cache-min-ttl
,出于同样的原因,有关于将其增加超过 1 小时的警告)。然而,您的查询可能主要是 rDNS,一般来说,它们往往具有较长的 TTL。
此外,由于您的maximum number of cached values
流量如此之低,我想指出您几乎没有获得任何流量。
如果您确实关心用户经常重复的位置,我建议将其记录在 nscd 之外,而不必再担心它。
编辑(2013/12//09):
nscd -g
主机统计数据来自dev.gentoo.org
(评论中没有块):
nscd configuration:
4h 8m 43s server runtime
hosts cache:
yes cache is enabled
no cache is persistent
no cache is shared
422 suggested size
1108744 total data pool size
966632 used data pool size
600 seconds time to live for positive entries
20 seconds time to live for negative entries
67878 cache hits on positive entries
2479 cache hits on negative entries
9464 cache misses on positive entries
4276 cache misses on negative entries
83% cache hit rate
6951 current number of cached values
7641 maximum number of cached values
33 maximum chain length searched
1 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/hosts for changes
答案2
这个参数:
是的,缓存是共享的
允许应用程序在 nscd 的缓存中扎根,并且不会记录此类活动。这是预期且最有效的行为。
将其设置为“否”,您会看到命中率急剧上升,但速度会慢一些。
答案3
它可能有点偏离主题,但nscd
您可以切换到sssd
(我认为它的继任者)而不是使用。
我在 SUSE Linux Enterprise Server 11.3(完全支持)上使用它,我很高兴我进行了切换。它拥有更多、更细粒度的配置选项,nscd
并且具有远远超出所能nscd
实现的功能。
至少我认为值得一看:https://fedorahosted.org/sssd/
答案4
nscd 尊重上游 TTL 值。
A
如果 google.com 的 DNS 服务器规定记录的TTLgoogle.com
为 10 秒,而您的 TTLpositive-time-to-live
为 36000,则该记录仍将在 10 秒后过期。