contributed by < Korin777
>
使用者可以創建 workqueue 共享系統上的 worker-pool , 並根據設定的 flag 來使用對應的 worker-pool , woker-pool 會在需要時喚醒或動態增加 worker 來處理 work item , idle worker 不會被立刻釋放以減少建立 worker 的成本
commit 0f89eac
在原本的實做中,每當有新的連線需要自己創建新的 kernel thread 來處理,參考 kecho 引入 CMWQ 讓 worker-pool 上的 worker 來處理這些連線
首先在 module 載入時建立 workqueue , WQ_UNBOUND
表示此為 unbound workqueue , 它會去使用 unbound worker-pool , 最後一個參數為每個 cpu 同時能處理的 work item 數量,這邊 0 代表預設的 256 個
每個連線會有各自的 struct khttpd
紀錄使用的 socket 及對應的 work item ,透過 INIT_WORK 來設定實際要處理的 function => http_server_worker
struct http_service
連接我們建立的 work item ,在卸載 module 時可以透過它去確保所有 work item 都執行完成並釋放資源
最後把創建好的 work item 插入 workqueue 讓對應的 worker-pool 中的 worker 執行
Original | CMWQ | |
---|---|---|
(requests/sec) | 75470.673 | 136500.882 |
透過 ./htstress -n 100000 -c 1 -t 4 http://localhost:8081/
測量,每秒能處理的 requests 顯著增加
commit 7213049
原本想參考 sehttpd 來實做 timer ,後來發現 kernel api 也有 timer 可以使用,便試著用他來關閉逾期的連線
timer_list
結構體定義於 <linux/time.h>, timer 透過 list_head
的變形 hlist_head
連接, expires
為 timeout 的時間點,透過 function
來執行 timeout 後序該做的事
首先定義 timer 的 callback function ,在連線逾時後主動關閉連線,這裡將 timer_list
嵌入 khttpd
結構體來取的連線對應的 socket
接著透過 timer_setup 來初始化 timer
透過 mod_timer 在每次收到新的 request 時重製 timer 逾時的時間點
最後透過 del_timer_sync 在逾時或 client 關閉連線時將 timer 從 hlist_head
中移除