目錄:
PowerDNS簡單教程(4):優化篇(本篇)
最后一篇,介紹一下PowerDNS的性能優化。
其實,這才是我的終極目的。簡單的說,就是把
QPS
調到盡可能高。
QPS
,也就是每秒鍾接收請求的數量,這是服務器抗壓能力的一項很重要的指標。我的初步想法是讓
QPS
達到
50000+
(其實這是領導給的要求)。第一眼看到這個數字說實話我的內心是有點崩潰的,因為這個數字看上去有點大,而我也不知道一個服務器到底承載能力有多強,不過同事說剛裝好的
pdns
已經可以達到
30000+
,而在某某公司這個數值是
6
位數的,於是我稍稍安心了點。
不過這里還有另一個問題:
QPS
的數值要怎么測呢?在同事的幫助下我找到一個工具,是
BIND
下自帶的一個開源的專門測試
DNS
性能的小工具,叫做
queryperf
。安裝起來比較簡單,下載一個
bind
,進入
bind
目錄下的contrib/queryperf目錄中:
ls # 看看這里都有什么 sudo ./configure sudo make ls
可以看到變出來一個名叫queryperf的文件(可執行文件)。沒錯就是這樣神奇,快快快給個崇拜的眼神 ~咳咳,回來回來,這個queryperf文件就是我們要的東西,其他的都沒有什么用了。
有工具了,還需要一個測試文件,內容是“域名+空格+類型”這樣格式的記錄。我寫了一個腳本來生成,腳本大概是醬嬸滴:


這樣就生成了50萬條記錄。之后開始測試。
./queryperf -d (你的測試文件) -s (你的DNS服務器地址,默認localhost) -p (DNS服務器端口,默認53)
常用命令可以使用-h查看。
測試的結果應該是醬嬸滴(這是第一次達到5萬QPS的截圖留念,后來又高了不少了):


如果不是的話,查一查是不是腳本寫的有問題,還有地址、端口、數據庫等等配置是否正常,可以用monitor模式啟動pdns然后盯着看一看查詢過程。
看到結果其實查詢原理就簡單了,N條記錄,M秒查詢出結果,相除一下就是QPS了。
好了熱身活動結束,下面開始正式優化的過程(上面的測試結果是我已經優化過一部分了):
優化的思路主要有這么幾個方面:PowerDNS設置;MySQL優化;Linux優化。
(1)PowerDNS方面:
可參考官網的優化方案:
https://doc.powerdns.com/md/authoritative/performance/。要設置的內容都在pdns.conf配置文件中。
①緩存。在DNS服務器運行的過程中,可以dump查看一下相關參數,例如緩存碰撞的結果,如果miss較多,說明應該調大緩存的生存時間。在pdns.conf中控制緩存生存時間的主要有4個變量:cache-ttl,negquery-cache-ttl,query-cache-ttl,recursive-cache-ttl,默認的時間都不太一樣,全部改成60。
②線程。PowerDNS有兩個地方用到了線程,分別是receiver-threads和distributor-threads,官方解釋是接收線程和分發線程。但是這兩個線程並不是越多越好的。一是因為mysql的最大連接數有限,如果開多了線程,在monitor中可以看到,根本就沒有連接到mysql;而是因為線程數過多的話,CPU要一直進行上下文切換,時間浪費過多。官網介紹說,distributor-threads是越小越好的,設置為1的時候會達到最優;而receiver-threads我經過實際測試,設置為12的時候QPS達到了最優。這個並沒有什么科學的解釋推理,只是經多方嘗試后得到的結果。個人感覺,這個跟CPU核心數是有關的,只是沒其他機器可以做實驗了。
③日志。PowerDNS在查詢過程中有日志記錄,這個是會浪費一定的時間的。可以把記錄日志相關的參數關掉。log-dns-details和log-failed-updates關掉實際測試並沒有什么卵用,但是無意中發現query-logging關掉會有顯著提高。(所謂“關掉”並不是把這個參數注釋掉,而是讓參數值為no)
官網中還介紹了pdns_control中看到的參數代表的含義:
https://doc.powerdns.com/md/authoritative/performance/。同時也介紹了pdns.conf中的每個參數的含義:
https://doc.powerdns.com/md/authoritative/settings/ 。我看到的有意義的也就上面介紹的這幾個了。
(2)MySQL:
MySQL優化百度上能找到很多,我看了一部分介紹,根據其中的幾個優化了一下MySQL。優化方法是進入用root進入mysql
show variables; 可以看到當前的所有變量(這是主要修改的地方)
show status; 可以看到當前的狀態(根據狀態來修改)
set xxx=yyy;可以修改變量(xxx是變量名,yyy是變量值)
如果不讓改,那就到/etc/mysql/my.cnf配置文件中改,之后sudo service mysql restart重啟數據庫服務。
優化后並沒有看到明顯的效果。我猜想MySQL還沒有達到瓶頸,所以優化起來對QPS提高目前還沒有太多幫助。
(3)Linux:
Linux參數會影響到MySQL的一些性能。既然MySQL么有達到瓶頸,那么優化Linux意義也不是太大。
最終,按我司服務器的優化結果,本機QPS達到了84000+。
以上。在實際測試QPS的過程中,需要關注系統硬件的相關信息,我使用的是vmstat,需要用的同學請自行百度。上下文切換的瓶頸就是通過這個工具看出來的。現在達到了CPU瓶頸,我還不知道怎么解決。另外,猜想pdns連接backend的過程還是有地方可以優化的,這是需要pdns和MySQL配合完成的地方。繼續優化。
vmstat使用方法可以看我之前發過的博客:
http://www.cnblogs.com/anpengapple/p/5197530.html 沒錯,當時就是為了做PowerDNS優化才找的。
******************************即將結束的分隔線******************************
PowerDNS就介紹到這里了,不是很深,原因是:一是DNS的知識我也懂的不多,二是把PowerDNS搭建起來用起來這些足夠了,三是PowerDNS的中文資料很少,官方英文資料我啃起來也是頭疼(好吧這才是主要原因)。網上的中文博客基本也就是教了教怎么安裝PowerDNS和Poweradmin,並沒有涉及到功能及優化方面,而且CentOS居多,Ubuntu的博客甚少。不知道是不是因為玩PowerDNS的都是牛人,沒有遇到什么問題,因此覺得沒有什么好記錄的。寫這幾篇一是為了備忘,同時也是為了將來有類似我這樣的菜鳥可以拿來用用。秉承着一個理念:予人玫瑰,手留魚香,肉絲。但願真的有用吧。