效能對於伺服器來說是至關重要的,畢竟每個活動都期望起請求能很快的得到響應.影響伺服器效能的首要因素就是系統的硬體資源.比如cpu的個數 速度 記憶體的大小等.不過由於硬體技術的飛速發展,現代伺服器都不缺反硬體資源,因此我們需要考慮的主要問題是如何從"軟環境"來提公升伺服器的效能.伺服器的"軟環境",一方面是指系統的軟體資源,比如作業系統允許使用者開啟的最大檔案描述符數量;另一方面指的就是伺服器程式本身,即如何從程式設計的排程確保伺服器的效能.
下面我們進一步分析高效能伺服器需要注意的其他幾個方面:池 資料複製 上下文切換和鎖.
1.池既然伺服器的硬體資源"充裕",那麼提高伺服器效能的乙個很直接的方法就是以空間換時間,即浪費伺服器的硬體資源以換取其執行效率.這就是池的概念.池是一組資源的集合,這組資源在伺服器啟動之初就被完全建立好並初始化,這成為靜態資源分配.當伺服器進入正式執行階段,即開始處理客戶請求的時候,如果它需要相關的資源,就可以直接從池中獲取,無須動態分配.很顯然,直接從池中取得所需資源比動態分配資源的速度要快很多.因為分配系統資源的系統呼叫都是很耗時的.當伺服器處理完乙個客戶連線後,可以吧相關的資源放回池中,無須執行系統呼叫來釋放資源.從最終的效果來看,池相當於伺服器管理系統資源的應用層設施,它避免了伺服器對核心的頻繁訪問.
不過,既然池中的資源是預先靜態分配的,我們就無法預期應該分配多少資源.這個問題又該如何解決?最簡單的解決方法就是分配足夠多的資源,即針對每個可能的客戶連線都分配必要的資源,這通常會導致資源的浪費,因為任一時刻的客戶數量都可能遠遠沒有達到伺服器能支援的最大客戶數量.好在這種資源的浪費對於伺服器來說不會構成問題.還有一種解決方法就是預先分配一定的資源,此後如果發現資源不夠用,就再動態分配一些並加入翅中.
根據不同的資源型別,可以吧池分別多種.常見的有記憶體池,程序池,執行緒池和連線池.
記憶體池通常用於socket的接收快取和傳送快取.對於某些長度優先的客戶請求,比如http請求,預先分配乙個大小足夠的接收緩衝區是合理的.當客戶請求的長度超過接收緩衝區的大小時,我們可以選擇丟棄請求或動態擴大接收緩衝區.
程序池和執行緒池都是併發常用的.當我們需要乙個工作執行緒或工作程序來處理新到來的客戶請求時,我們可以直接從程序池和執行緒池取得乙個執行實體,而無需動態呼叫fork或pthread_creat來建立程序和執行緒.
連線池通常使用者伺服器或伺服器集群的內部永久連線.
在圖8-4中,每個邏輯單元可能都需要平凡的訪問本地的某個資料庫.簡單的做法:邏輯單元每次需要訪問資料庫的時候就想資料庫程式發起連線,而訪問完畢後釋放連線.很顯然,這樣做法效率太低.一種解決方法就是使用連線池,連線池的伺服器預先和資料庫程式建立的一組連線的集合.當某個邏輯單元需要訪問資料庫時,它可以直接從連線池中取得乙個連線的實體並使用之.待完成資料庫的訪問之後,邏輯單元再講該鏈結返回給連線池.
2.資料複製
高效能伺服器應該避免不必要的資料複製.尤其是當資料複製傳送在使用者**和核心之間的時候.如果核心可以直接從socket或檔案讀取的時候,則應用程式就沒必要從核心緩衝區複製到應用程式緩衝區.這裡所的直接處理, 指的是應用程式不關心這些資料的內容,不需要對他們做任何分析.比如ftp伺服器,當客戶請求乙個檔案時,伺服器只需要檢測目標檔案是否存在,以及使用者是否有讀取他的許可權,而絕對不關心這個檔案的具體內容.這樣的話 ftp伺服器無須吧目標檔案的內容完整的讀入到應用程式緩衝區中並呼叫send函式來傳送,而是可以使用零拷貝函式(sendfile)來直接將其傳送給客戶端.
此外,使用者**內部(不可訪問核心)的資料也是可以避免的,舉例來說,當兩個工作程序之間要傳遞大量的資料時,我們就應該考慮使用共享記憶體來在他們之間共享這些資料,而不是使用管道或者訊息佇列來傳遞.
3.上下文切換和鎖
併發程式必須考慮上下文切換的問題,即程序切換和執行緒切換導致的系統開銷.即使是io密集型的伺服器,也不該使用過多的工作執行緒,否則執行緒間的切換將占用大量的cpu時間.伺服器真正用於處理業務邏輯的cpu時間的比重就顯得不足了.因此為每個客戶連線都建立乙個工作執行緒的伺服器是不可取的.
圖8-11描述的半同步/半非同步模式是一種比較合理的解決方案.它允許乙個執行緒同時處理多個客戶連線.此外,多執行緒伺服器的乙個優點是不同的執行緒可以同步執行在不同的cpu上,當執行緒的數量不大於cpu的數量是,上下文的切換就不是問題了.
伺服器效能提高建議
這些天在看游雙的高效能伺服器程式設計這本書,總結下如何提高伺服器效能 1 伺服器的本身的硬體資源,比如cpu的個數 速度 記憶體大小等,這是硬體資源方面 軟體資源方面 1 使用執行緒池和程序池,傳統的處理流程是監聽執行緒監聽有沒有新的使用者連線伺服器,每當有乙個新的 使用者進入,伺服器就開啟乙個新的...
伺服器IO效能提公升方案
介質 hdd ssd 介面sata scsi controller,raid卡or南橋,是否有快取 檔案系統 xfs,或其他brtfs之類的 磁碟佇列演算法deadline cfq noop dm記憶體快取設定 raid形式 效能raid0 磁碟空間使用率 100 故成本最低。讀效能 n單塊磁碟的讀...
websphere伺服器效能調整建議
更改http server的配置檔案引數keepalive。原因 這個值說明是否保持客戶與http server的連線,如果設定為on,則請求數到達maxkeepaliverequests設定值時請求將排隊,導致響應變慢。方法 開啟ibm http server安裝目錄,開啟資料夾conf,開啟檔案...