在《high performence server architecture》(中,作者提出了自己的觀點關於如何編寫高效能的伺服器程式。作者感興趣的地方不在於使用多執行緒之類的並行技術,作者認為處理請求的基礎設施決定了程式的效能。作者也坦言,他提出的觀點和方法並不是提高伺服器效能的唯一途徑。作者總結了四大效能殺手:
如果處理請求的操作不會涉及資料拷貝,不會做上下文切換,不會涉及大量的記憶體分配,並且沒有鎖爭用,那麼,伺服器的效能會相當可觀。
資料拷貝
減少資料拷貝是乙個共識,基本上每乙個從業人員在職業生涯早期都被告誡避免資料拷貝。在大學裡,教授也一再教導要遵守這條箴言,很顯然,避免資料拷貝是個流行語。但是,問題是有些時候資料拷貝不會被察覺。對於你使用的底層驅動或是第三方包是否有大量的資料拷貝,你不得而知。乙個例子是hash演算法,hash演算法會涉及到全量的資料拷貝,並且需要大量的計算。
乙個能避免記憶體拷貝的切實可行的方法是使用間接傳值和buffer描述符,切記不要傳遞buffer的指標。buffer描述符需要包含下面一些屬性:
這樣一來,不需要主動地拷貝資料使之在記憶體中一直存在,只需要簡單地增加buffer描述符的引用。但是,作者的觀點是,不要過度要求避免資料拷貝。作者見過很多為了避免資料拷貝所採取的方法反而讓情況更糟糕,例如強制上下文環境切換或者是將大的i/o請求打散。資料拷貝確實很昂貴,當你需要查詢系統中那些冗餘的操作時,資料拷貝是需要優先被檢查的。但是,也要評估你的所做所為帶來的回報。
上下文切換
避免資料拷貝的經驗廣為所知,但是,上下文切換對程式效能的影響卻不被關注。
Linux 高效能伺服器程式框架
伺服器解構主要分為如下三個主要模組 1 i o處理單元。接收客戶端傳送的資料都屬於i o處理單元。2 邏輯單元。接收到資料之後進行的一些處理都屬於邏輯單元。3 儲存單元。如下圖所示 伺服器程式設計框架 1 c s模型 c就是客戶端,s就是伺服器。所以這個模型也稱客戶端 伺服器模型。c s模型如下圖所...
高效能伺服器設計
原文 http blog.chinaunix.net u 5251 showart 236329.html 先後檢視了 haproxy l7sw 和lighttpd 的相關原始碼,無一例外,他們一致認為多路復用是效能最好的伺服器架構 事實也確實應該如此,程序的出現一方面就是為了儲存任務的執行上下文從...
高效能伺服器設計
先後檢視了haproxy l7sw 和lighttpd 的相關原始碼,無一例外,他們一致認為多路復用是效能最好的伺服器架構。事實也確實應該如此,程序的出現一方面就是為了儲存任務的執行上下文從而簡化應用程式設計,如果程式的邏輯結構不是很複雜,那麼用整個程序控制塊來儲存執行上下文未免有些大材小用,加上程...