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。

執行以下命令進行安裝:
yum install -y nscd
此時再執行命令查看nscd的運行狀態,nscd已經安裝但是處於未啟動狀態。

開啟nscd服務
輸入如下指令開啟nscd服務:
systemctl start nscd此時再執行命令查看nscd的運行狀態,nscd已經處於運行狀態。

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
關鍵配置參數說明
配置參數 | 說明 |
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,如果想利用 |
max-db-size | nscd 快取資料庫的最大大小,單位為Byte。 |
positive-time-to-live沒有什麼實際意義,TTL值以DNS查詢請求返回的TTL為準。
nscd緩衝效果檢測
nscd關閉時撥測
在ECS上執行如下命令對53連接埠UDP報文進行抓包:
tcpdump -i any udp and port 53然後在nscd的狀態為關閉情況下,在ECS上執行多次如下指令,連續撥測三次。
ping -c 1 -n www.taobao.com#對網域名稱www.taobao.com發一次ping指令。
查看相對應的抓包情況,能夠發現53連接埠3次DNS請求查詢,並且每次DNS請求查詢都返回網域名稱解析記錄,證明DNS請求查詢記錄並未被緩衝,ECS每次都要通過53連接埠發送DNS請求查詢。

nscd開啟時撥測
執行啟動指令將nscd服務開啟,並通過狀態查詢指令確定nscd為開啟狀態。
在nscd的狀態為開啟情況下,在ECS上執行如下指令,連續撥測6次。同時需要對ECS的53連接埠進行抓包。
ping -c 1 -n www.taobao.com
查看相對應的抓包情況,能夠發現53連接埠只抓到1次DNS請求查詢,證明DNS請求查詢命中nscd緩衝,沒有通過53連接埠發送DNS請求查詢。
重要您在抓包的過程中會發現即使ping指令已經執行完畢,但是每隔一段時間tcpdump依舊可以查到相關網域名稱DNS查詢請求報文,這是由於nscd的主動重新整理機制導致的,屬於正常現象。可以通過將reload-count 參數設定為0關閉主動重新整理機制。
您也可以通過執行以下指令來查詢快取命中資訊,在一段時間內多次執行ping指令後然後查看快取命中情況。
nscd -g#輸出生效後的各個參數選項配置情況和快取命中率統計等。