全部產品
Search
文件中心

:ECS DNS查詢請求限速該如何緩解?

更新時間:Mar 13, 2025

VPC內每台ECS機器每秒最高DNS峰值為5000次,單機每秒請求DNS峰值超過閾值後,將面臨限速風險,可用性SLA將無法保證。為了緩解此類情況,建議您從如下兩個方面考慮:

  • 擴容ECS數量,使得DNS查詢請求能夠負載分攤到更多的ECS,從而降低每個ECS的DNS查詢請求量;

  • ECS主機開啟nscd(Name Service Cache Daemon)服務進行緩衝加速;

    說明

    nscd服務開啟情況下,會導致變更解析記錄的生效時間更長。

什麼是nscd?

nscd是一個系統快取服務,使用者緩衝名稱服務資訊,例如passwd、group、hosts、services以及netgroup等,它可以提高系統查詢快取命中率,從而減少對名稱服務的查詢次數和流量消耗,進而加快服務響應速度,本實踐主要用於降低ECS的DNS查詢請求數,所以重點介紹hosts配置。

nscd常用Linux指令

指令

說明

yum install -y nscd

安裝nscd。

systemctl start nscd

啟動nscd。

systemctl stop nscd

停止nscd。

systemctl restart nscd

重新啟動nscd。

systemctl status nscd

查詢nscd的營運狀態。

nscd -g

輸出生效後的各個參數選項配置情況和快取命中率統計。

nscd -i

使指定的緩衝失效,可以指定passwd、group、hosts、services、netgroup等,例如:nscd -i hosts。

cat /etc/nscd.conf

查詢當前nscd配置詳情。

vi /etc/nscd.conf

修改nscd配置參數。

安裝nscd

nscd一般在Linux作業系統中預設安裝。如果不確定當前ECS是否已經安裝了nscd,可以執行以下命令進行檢測:

systemctl status nscd#檢查nscd的運行狀態。

如果檢測結果如下,則說明沒有安裝nscd。

image.png

執行以下命令進行安裝:

yum install -y nscd

image.png

此時再執行命令查看nscd的運行狀態,nscd已經安裝但是處於未啟動狀態。

image.png

開啟nscd服務

輸入如下指令開啟nscd服務:

systemctl start nscd

此時再執行命令查看nscd的運行狀態,nscd已經處於運行狀態。

image.png

說明

CentOS/RedHat作業系統安裝nscd指令:yum install -y nscd;

Debian/Ubuntu作業系統安裝nscd指令:apt-get install -y nscd;

nscd配置參數

nscd的預設設定檔路徑在/etc/nscd.conf,可以通過執行如下指令查看nscd配置:

cat /etc/nscd.conf

image.png

關鍵配置參數說明

配置參數

說明

debug-level

reload-count

跟緩衝主動重新整理有關,此配置參數決定了請求成功緩衝主動去查詢並更新緩衝的次數。

paranoia

偏執模式,如果開啟則nscd會周期性地重啟。

restart-interval

如果paranoia開啟,此參數表示重啟間隔時間。

enable-cache

開啟快取服務。

positive-time-to-live

請求成功響應緩衝的存留時間。

negative-time-to-live

請求失敗響應緩衝的存留時間,建議設定為0,以免失敗的緩衝影響業務請求。

check-files

定期檢查/etc/passwd、/etc/group、/etc/hosts等快取檔案的修改時間,如果檔案自上次檢查以來有過更改,則緩衝失效。

persistent

開啟時,nscd在重啟之後會保留之前的緩衝內容,如果paranoia開啟,建議開啟此功能。

shared

用於服務nscd資料庫的記憶體映射與用戶端共用,預設為 yes,如果想利用nscd -g指令查詢快取命中率,則 shared 需要設定為 no。

max-db-size

nscd 快取資料庫的最大大小,單位為Byte。

重要
  • positive-time-to-live沒有什麼實際意義,TTL值以DNS查詢請求返回的TTL為準。

nscd緩衝效果檢測

nscd關閉時撥測

  1. 在ECS上執行如下命令對53連接埠UDP報文進行抓包:

    tcpdump -i any udp and port 53
  2. 然後在nscd的狀態為關閉情況下,在ECS上執行多次如下指令,連續撥測三次。

    ping -c 1 -n www.taobao.com#對網域名稱www.taobao.com發一次ping指令。

    image.png

  3. 查看相對應的抓包情況,能夠發現53連接埠3次DNS請求查詢,並且每次DNS請求查詢都返回網域名稱解析記錄,證明DNS請求查詢記錄並未被緩衝,ECS每次都要通過53連接埠發送DNS請求查詢。

    image.png

nscd開啟時撥測

  1. 執行啟動指令將nscd服務開啟,並通過狀態查詢指令確定nscd為開啟狀態。

  2. 在nscd的狀態為開啟情況下,在ECS上執行如下指令,連續撥測6次。同時需要對ECS的53連接埠進行抓包。

    ping -c 1 -n www.taobao.com

    image.png

  3. 查看相對應的抓包情況,能夠發現53連接埠只抓到1次DNS請求查詢,證明DNS請求查詢命中nscd緩衝,沒有通過53連接埠發送DNS請求查詢。image.png

    重要

    您在抓包的過程中會發現即使ping指令已經執行完畢,但是每隔一段時間tcpdump依舊可以查到相關網域名稱DNS查詢請求報文,這是由於nscd的主動重新整理機制導致的,屬於正常現象。可以通過將reload-count 參數設定為0關閉主動重新整理機制。

  4. 您也可以通過執行以下指令來查詢快取命中資訊,在一段時間內多次執行ping指令後然後查看快取命中情況。

    nscd -g#輸出生效後的各個參數選項配置情況和快取命中率統計等。

    image.png