架構師日記——Varnish的性能調優

Varnish的性能調優分成兩個部分

1.一個是硬件、操作系統和網絡部分的優化
2.另外一個,也是最重要的一個,就是VCL的調優
要進行硬件、操作系統和網絡部分的優化,瞭解Varnish的進程和線程架構是有必要的,他們能幫助你更好的去調整優化,以及整合應用系統。

Varnish的進程架構圖

這裏寫圖片描述

  • 管理進程(The management process)
    Varnish主要有兩個進程,管理進程和子進程,管理進程負責:管理配置的變更(包括VCL和參數)、編譯VCL、監控Varnish運行、初始化Varnish,以及提供命令行接口等。管理進程會每隔幾秒鐘檢查一下子進程,如果發現子進程掛了,會kill掉然後重新啓動一個。這些操作都會記錄在日誌裏面,以利於你檢查錯誤。
  • 子進程(The child process)
    子進程包括幾個不同類型的線程,包括但不限於:
    1:Acceptor線程:接受新的連接並代表它們
    2:Worker線程:一個會話一個線程,通常會使用數百個Worker線程
    3:Expiry線程:負責從緩存中清除舊的內容
  • 工作區(Workspace)
    Varnish使用Workspace來減少多個線程間對於內存的競爭。Varnish有多個工作區,最重
    要的是session workspace,它通常用來操作會話數據。比如:修改www.example.com到example.com,以減少重複緩存。
    就算你的Session工作區有5G,使用了1000個線程,但實際使用的內存容量不會這麼多,虛擬內存會是5個G,但是實際的內存是根據你實際的使用來的,內存控制器和操作系統會幫你管理內存,這個不用擔心
  • 和系統的通訊,子進程會使用共享內存日誌訪問文件系統,這意味着,如果一個線程需要記錄日誌,它只需要獲得鎖,然後寫入內存,然後釋放鎖就可以了。另外每個線程都有一份日誌數據的緩存,以減少鎖的競爭
  • 日誌數據通常爲80M,分成兩個部分,第一個部分是計數器,第二個部分是請求數據。你可以使用日誌工具來查看共享內存日誌,因爲日誌記錄並不會是原始的格式。
  • 對於儲存類型,如果不需要永久保持緩存的話,建議使用malloc,如果要永久保存,或者是要緩存的內容超過了物理內存的大小,那麼使用file。
    另外一個要注意:緩存對象會有額外的開銷,以保持對緩存的追蹤,大概一個對象需要1k的額外開銷,這也意味着,最終使用的內存會比你通過-s指定的內存大小要大一些。
  • 通常對硬件、操作系統和網絡部分的優化,主要就是相關參數的優化。參數調優的方法:
    通常是在CLI界面去調整,然後測試,如果ok的話,就把它們配置到配置文件裏面去

線程模式

子進程是Varnish真正產生奇蹟的地方,它包含一系列的線程來執行不同的任務,下面羅列幾個常見的:
1.cache-worker:每個連接一個,負責處理請求
2.cache-main:一個,負責啓動
3.ban lurker:一個,負責禁用的處理
4.acceptor:一個,負責接受新的連接
5.epoll/kqueue:可配置,缺省是2個,管理線程池
6.expire:一個,負責刪除過期內容
7.backend poll:一個backend poll一個線程,用於健康檢查
通常我們只需要配置cache-worker線程數,其他的線程可以不用管。
調整Varnish的時候,需要考慮預期的流量,線程模型允許你使用多個線程池,但時間和經驗表明,只要你有2個線程池就夠了,加入更多也不會提高性能。一些舊的資料會建議你一個cpu核運行一個線程池,這個已經過時了,現在只要2個就夠了。
線程池相關的參數,前面已經都講過了,最重要的是thread_pool_min和thread_pool_max。通常保持最少在500-1000個線程都是合適的,具體的可以根據varnishstat來查看n_wrk_queued,根據具體情況來配置

線程growth時間
Varnish能支持數千個線程同時運行,但並不是所有的操作系統內核都能支撐,因此使用thread_pool_add_delay來保證每個線程間有一點延遲,現在已經不重要了,操作系統都比較成熟了,一般從20ms到2s

系統級參數
隨着Varnish越來越成熟,越來越少的參數需要調整了。sess_workspace是一個要調整的重要參數,它設置的是從客戶端傳入的Http 頭的workspace大小:
1:通常這個值從缺省的65536字節到10M
2:要注意,它是虛擬的內存,不是實際使用的內存

另外一些可調優的參數就是各種時間,如:
connect_timeout、first_byte_timeout、between_bytes_timeout、send_timeout、sess_timeout、cli_timeout
通常情況下,默認的數值能滿足大多數應用的需要,但你還是需要結合實際的應用進行調整。比如connect_timeout,默認是0.7秒,如果Varnish和backend是通過遠程來連接和訪問,這個時間可能就需要延長。

發佈了155 篇原創文章 · 獲贊 41 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章