淺談伺服器性能測試的全生命周期
在優化之前,先要搞清楚伺服器的具體業務需求是什麼,據此來優化其中的短板。
4.1.存儲的優化
IO相對來說比較耗時,我們都知道越靠近CPU的存儲,其訪問速度越快,但是其價格越貴。下圖來展示了不同存儲的容量以及訪問時間。
目前很多同學在優化伺服器性能的時候都會從存儲這方面入手。
儲存的容量以及訪問時間
4.1.1.用內存換時間
4.1.1.1.增加緩存很多web應用是有大量的靜態內容,這些靜態內容主要都是一些小文件,並且會被頻繁的讀,採用Apache以及nginx作為web伺服器。在web訪問量不大的時候,這兩個http伺服器可以說是非常的迅速和高效,如果負載量很大的時候,我們可以採用在前端搭建cache伺服器,將伺服器中的靜態資源文件緩存到操作系統內存中直接進行讀操作,因為直接從內存讀取數據的速度要遠大於從硬碟讀取。這個其實也是增加內存的成本來降低訪問磁碟帶來的時間消耗。
4.1.1.2.內存資料庫內存資料庫,其實就是將數據放在內存中直接操作的資料庫。相對於磁碟,內存的數據讀寫速度要高出幾個數量級,將數據保存在內存中相比從磁碟上訪問能夠極大地提高應用的性能。內存資料庫拋棄了磁碟數據管理的傳統方式,基於全部數據都在內存中重新設計了體系結構,並且在數據緩存、快速演算法、並行操作方面也進行了相應的改進,所以數據處理速度比傳統資料庫的數據處理速度要快很多。但是安全性的問題可以說是內存資料庫最大的硬傷。因為內存本身有掉電丟失的天然缺陷,因此我們在使用內存資料庫的時候,通常需要,提前對內存上的數據採取一些保護機制,比如備份,記錄日誌,熱備或集群,與磁碟資料庫同步等方式。
對於一些重要性不高但是又想要快速響應用戶請求的部分數據可以考慮內存資料庫來存儲,同時可以定期把數據固化到磁碟。
4.1.1.3.RDD這裡圖個新鮮,說說內存換時間在大數據云計算相關領域的一些應用。Spark最近很火,它的核心要數RDD了,RDD最早來源與Berkeley實驗室的一篇論文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》。現有的數據流系統對兩種應用的處理並不高效:一是迭代式演算法,這在圖應用和機器學習領域很常見;二是互動式數據挖掘工具。這兩種情況下,將數據保存在內存中能夠極大地提高性能。這裡不詳細說RDD了,只是想說程序員一直是覬覦內存的讀取速度的。
4.1.2.使用SSD等除了對內存方面的優化,還可以對磁碟這邊進行優化。跟傳統機械硬碟相比,固態硬碟具有快速讀寫、質量輕、能耗低以及體積小等特點。但是ssd的價格相比傳統機械硬碟要貴,有條件的可以使用ssd來代替機械硬碟。
4.2.資料庫優化大部分的伺服器請求最終都是要落到資料庫中,隨著數據量的增加,資料庫的訪問速度也會越來越慢。想要提升請求處理速度,必須要對原來的單表進行動刀了。目前主流的Linux伺服器使用的資料庫要屬mysql了,如果我們使用mysql存儲的數據單個表的記錄達到千萬級別的話,查詢速度會很慢的。根據業務上合適的規則對資料庫進行分區分表,可以有效提高資料庫的訪問速度,提升伺服器的整體性能。另外對於業務上查詢請求,在建表的時候可以根據相關需求設置索引等,以提高查詢速度。
4.3.利用多核優勢
現在運行伺服器的主流機器配置都是多核CPU的,我們在設計伺服器的時候可以利用多核心的特點,採用多進程或者多線程的框架。
關於選擇多線程還是多進程可以根據實際的需求,結合各自的優缺點進行選擇。對於多線程的使用,特別是使用線程池的時候可以通過測試不同線程池伺服器的性能來設置合適的線程池。
4.4.選擇合適的IO模型
《UNIX網路編程卷1:套接字聯網API》中有一幅圖比較經典。
IO模型阻塞I/O模型:數據沒到達之前,I/O一直阻塞,如果數據到達,則會返回。典型的是recvfrom,一般的默認都是阻塞的。非阻塞的I/O模型:和阻塞相反,只要不能得到結果的時候,I/O立刻返回。不會阻塞當前線程。IO復用模型:也就是自己要學習的部分。多路復用的意思是,將多路信號合併到一路上進行處理,類似多個管道彙集到一個管道,與之相反的是多路分解。IO復用模型主要是select,poll,epoll;對一個IO埠,兩次調用,兩次返回,比阻塞IO並沒有什麼優越性;關鍵是能實現同時對多個IO埠進行監聽;函數也會使進程阻塞,但是和阻塞I/O所不同的的,這兩個函數可以同時阻塞多個I/O操作。而且可以同時對多個讀操作,多個寫操作的I/O函數進行檢測,直到有數據可讀或可寫時,才真正調用I/O操作函數。信號驅動:首先開啟套介面信號驅動I/O功能,並通過系統調用sigaction安裝一個信號處理函數。當數據報準備好被讀時,就為該進程生成一個SIGIO信號。隨即可以在信號處理程序中調用recvfrom來讀數據報,井通知主循環數據已準備好被處理中。也可以通知主循環,讓它來讀數據報。非同步的IO模型:告知內核啟動某個操作,並讓內核在整個操作完成後(包括將數據從內核拷貝到用戶自己的緩衝區)通知我們。
這裡並不是說一定要用某個模型,epoll也並不是在所有情況下都比select性能要好的,在選擇的時候還是要結合業務需求來。
4.5.分散式部署程序
當單機伺服器已經找不到合適的優化點時,我們可以通過分散式部署來提高伺服器的響應能力。優秀的伺服器開發都會為自己的伺服器的擴容,容災提出一些解決方案。個人覺得伺服器設計的時候簡單點比較好,這樣後期擴容的時候會很方便。
總結伺服器性能測試是一項比較繁瑣的事情,作為沒有做過性能測試的同學需要事先了解伺服器的協議是如何定義的,建立框架管理機器人、統計測試中機器人收到回包的結果以及壓測過程中各項性能數據的變化。在完成了測試的過程後,可以從硬體、操作系統以及應用程序等多個方面進行對性能結果進行定位。最後在明確業務需求的前提下,通過存儲優化、資料庫優化以及分散式部署程序等手段完成伺服器的性能優化。
推薦閱讀:
※人跟環境感應的生命科學依據
※圖說健康:珍惜您的生命
※情感美文:懂你的人在心裡 愛你的人在生命里
※李明月談詩:借詩修行,把生命引向光明面|轉《詩網路》
※敬畏生命