Linux

如何提高 nscd 的記憶體命中率?

  • January 4, 2014

**我的目標:**讓 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 個條目。做一個strings /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 查找被記憶體,但查看似乎不是的“目前記憶體值數量”也發生了。

您的網路伺服器的哪一部分甚至在進行 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

引用自:https://unix.stackexchange.com/questions/97448