關於RoR的效能研究 二

2021-08-20 20:46:52 字數 1183 閱讀 7797

參考:《netty權威指南》(李版)1.1.2

其實我並不關心puma是怎麼安排程序/執行緒的,上文只是驗證了ror框架是支援多程序/多執行緒部署的。

現在我們著重研究下passenger + nginx部署ror的網路io模型和程序/執行緒安排形況。

為了更好地理解,我們通過passenger + apache的對比來驗證。

nginx:epoll,io復用

* 實際上這種說法不準確,nginx的實現依賴的是linux2.6以上核心的epoll或是bsd核心的kqueue 

apache:select,io復用

既然都是io復用模型,那這裡就要簡要對比一下epoll和select

1、支援單程序開啟的fd(socket檔案描述符)數量

select最大的缺陷就是單個程序開啟的fd數量嚴重受限。這個數量由巨集fd_setsize設定,預設是1024,這就意味著通常情況下單程序select監視的socket將不超過1024個。而想修改這個巨集必須重新編譯核心,並且修改之後會帶來網路效率的下降。

apache選擇的方案是採用多程序,但是程序維護是需要代價的,而且程序間通訊也有代價。

epoll則沒有這個限制,epoll支援的fd數量是作業系統的最大控制代碼數(可以通過cat /proc/sys/fs/file-max來檢視)。這個值跟系統記憶體關係較大,1gb記憶體的機器上這個值大約是10萬。

2、io效率與fd數量的關係

select/poll還有乙個缺陷就是當被監視的socket很多的時候,由於大部分情況下只有少數socket處於活躍狀態,但是select/poll的每次呼叫都會對全部的socket進行線性掃瞄,這樣會導致io效率呈線性下降。

對於epoll來說,由於只有活躍的socket才會主動呼叫callback函式,所以epoll只會對活躍的socket進行操作。從這點上來說epoll實現的是一種偽aio(偽非同步io)。

3、核心與使用者空間的訊息傳遞

無論哪種io,最終都需要將核心資料拷貝到使用者空間。epoll是通過核心和使用者間mmap同一塊記憶體來實現的,所以效率更高。

這就意味著nginx比apache擁有更加出色的併發能力,nginx採用epoll是其擁有高併發能力的根本原因。

nginx:非同步多程序,每個程序同時處理多個(數萬個)連線請求

apache:同步多程序,每個程序處理乙個連線請求

nginx:支援

apache:不支援

關於彙編ROR的運算

設 ax 5,bx 3 cx 2,執行下列程式段後,ax lop ror bx,cl adc ax,bx loop lop 請問ror是怎麼移位的?謝謝ror是迴圈右移指令,把目的運算元整體右移由源運算元指定的位數,被移出的位依次回填到左邊空出的位,同時移進標誌位。如本題,bx 3 cx 2 3轉換...

關於sql指令碼效能的一些研究

select a.from function a where not exists select funid from relfunpakagefun b where funpakageid 786d25cb 8e2e 4f2d a893 808f1ac24ae5 and a.funid b.fun...

關於ExtJS5的初步研究(二)

相容性層 相容性層的主要目標是幫助您識別呼叫方法,需要注意。這個標識的形式控制台訊息和 或描述錯誤。在某些情況下,前者的行為也恢復的相容層,這樣你就可以向前推進,使調整後的遷移過程。預設的相容性檢查 在開發模式,如果你呼叫已在ext js5中被刪除的方法,而沒有指定相容性級別,您將收到錯誤。例如ge...