案例探討: 強化 server-framework 效能
主講人: jserv / 課程討論區: 2016 年系統軟體課程
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
返回「進階電腦系統理論與實作」課程進度表
預期目標
- 詳實分析 server-framework 的架構、系統設計,效能評估,以及效能改進方案
- 說明 async, reactor, protocol-server 彼此之間的關聯
- 探討 epoll, pipe, signals 等系統呼叫,以及 server-framework 如何使用
- 多執行緒設計的議題
mutex lock, condition variables, thread pool 對效能的影響
- 分析 HTTP request 和 web server 的行為
- 實做與分析 lock-less thread pool
- 提出效能分析 (含 HTTP 1.1 Keep-Alive) 以及改善方案
Part 1
- video: Part 1
- server framework 運作流程
- 說明 async, reactor, protocol-server 彼此之間的關聯
- 實做與分析 lock-less thread pool
報告內容的改進和提問
- 格式:
[ 時間點 ] 簡單描述
- [ 04:06 ] pipe 可否取代為其他機制?是否會對效能產生衝擊?
- [ 07:30 ] 不是 "wiki",而是 "Wikipedia"
- [ ??:?? ] 接口(對岸術語)->(介面)
- [ 03:34 ] epoll 解釋清楚,ready queue(放在哪裡???kernel or user),觀念釐清,讓 kernel 幫我們追蹤
- [ 04:45 ] 取代pipe,用什麼方法,讓thread停下來的方式,semophore
- [ 05:32 ] protocol server wait
- [ 08:40 ] synchronous 蒐集事件,在一次處理
- [ 10:06 ] if is async -> it is not a reactor !!
- [ 11:39 ] 為了命名更符合實際行為,可以將async 改成 thread pool
- [ 11:50?? ] 訊號的用語 -> 改為block
- [ 13:34 ] 字要大一點,解釋為甚麼有兩個perform_tasks(async)
- 解釋sched_yield():提示sched不再排程這個程式了(linux-2.6.23 改用 CFS 後,sched_yield() 行為已不同,基本上不會實際影響 CFS)
- [ 15:10 ] reacter_review解釋,後面跳過,thread join示意圖
- [ 17:16 ] socket accept詳細,如何處理同時連線的問題
- [ 20:42] 不用交給下位同學
- [ 22:59 ] Epoll跟poll再甚麼情況下會一樣,如何用ab去測試
-c
?
- [ 32:47 ] timeout 的影響,解讀清楚
- [ 33:46 ] 演說須知:麥克風若拿得太靠近嘴緣,會導致回音
- [ 37:34 ] 可以加上git commit
- ab+google evidence
Part 2
- video: Part 2
- 分析 HTTP request 和 web server 的行為
- 探討 epoll, pipe, signals 等系統呼叫,以及 server-framework 如何使用
- 彙整Server-framework行為與改進方式 (workqueue 的效能)
- kernel-mode web server 分析,作為日後 Web accelerator 的準備
報告內容的改進和提問
- [00:42] NCSA mosaic 最早的瀏覽器(browser),支援多種通訊協定
- [2:21] 最新:HTTP 2.0
- [7:47] 效能好壞與 user space socket 處理方式有關
- [9:01] Why 完成連線與未完成連線的queue只有在kernel裡面並只有kernel專屬??
- 避免像filesystem存取需要大量r/w lock ,socket只須block accept() ,kernel做完再copy到user space,以空間換取時間
- [15:40] unix signal: async
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
-
如ping 後,在terminate下ctrl+c ,ping中偵測到handler,將統計訊息印出後exit
-
[30:53] monolithic(kernel是全部包好的),linux module被注入時就是kernel不可分割個一部份
Server-framework 效能強化
永勁、仲庭:
紹華:
博聖:
鏡清:
鈺融:
Kernel-mode Web Server
Action items
- 在 GitHub 上 fork 出自己的版本,後續修正和改良都在裡頭
- 將原本作為參數設定的 Python 程式,用 C 程式重寫
Kernel server 原理介紹
-
使用 kernel server 必須有一咪咪模組的概念,送您鳥哥
-
簡單來說,試著把模組理解成在核心中的執行檔,只不過這個執行檔是必須透過一些手續 ( insmod ) 才能運作的,完成掛載後,此時的你正身處在核心中,那"直接"使用核心的資源就相當正常了!當能使用核心資源時,就會省去原本從 user space 進行系統呼叫時的成本。
-
而這邊所謂的成本就是使用核心資源或者一些需要 kernel mode 運行的操作時,我們並不是直接去存取核心,而是透過切換模式( user -> kernel ),在這樣的前提下,context switch 自然就是成本之一;而另一成本便是 user 與 kernel 在切換時必須將狀態傳送給另外一方,而不是直接的存取,因此這邊的解決辦法便是"複製"一份自身的資訊給對方,而這邊memory copy 的行為也會有成本存在!
-
因此讓 server 在核心中直接運行,將可以省去上述成本,也就是 no-copy 的行為!當然 kernel web server 不單純只有在kernel 中運作,還會透過方法與 user space 進行溝通,如 TUX的架構,這邊只簡單介紹 kernel web server 的概念,並未探討 kernel 與 user 之間的溝通方法。
User space 透過系統呼叫 socket( ) 的實作:
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
Kernel web server 透過模組直接掛載在 kernel space 之中:
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
-
圖中 client 直接訪問 kernel 中的 server socket,因此不需要有 copy 的成本!
-
要注意的是,此處的 server request handler 是不局限於 user space 的,也可以將處理 request 的工作放在 kernel 之中。
-
在這邊 kernel web 中使用到了 netlink 的系統呼叫,是 kernel 與 user 直接的溝通,在後續實作上也沒有使用到,目前正在研究中,因此暫不說明。
kernelhttp
kernel-web