執行人: Jordymalone
依據 ktcp 作業規範,提交 CMWQ 以外的 pull request
完成所有的作業要求
執行 pre-commit.hook 會出現以上錯誤,說明 cppcheck 回報這條 suppression 是多餘的,因此觸發了 unmatchedSuppression
警告。
參考 lab0-c 的 Commit 0180045,@komark06,Cppcheck manual
目前是先修改 pre-commit.hook
如下
一次性地抑制所有可能出現的 unmatchedSuppression 警告。
目前不清楚 cppcheck 從哪個版本有做相關的更動
是否要以這改動提交 PR?
編譯 khttpd 專案
出現以下 warning
TODO: 待釐清
已提交 pull request
掛載 khttpd 模組並指定 Port,若不指定預設就是 8081
執行 wget localhost:8081
可正常下載並獲得 index.html 的檔案,裡面有 Hello World!!! 表示成功
但透過 dmesg 觀察會發現有以下 error
TODO: 待釐清
在導入 CMWQ 之前先使用 htstress 這個 Benchmark Tool 來測試效果。
導入前:
khttpd 最初的設計思路是為每個連線都生成獨立的一條 kthread。
在模組初始化時,
可以看到我們會使用 kthread_run
啟動一條 daemon thread 來扮演 server 的角色去負責接收連線。同時他會去執行 http_server_daemon
這個函式,可以看到以下:
kthread_run
是個巨集,詳情可參閱 /include/linux/kthread.h
當有 client 被 accept 進來時,一樣透過 kthread_run
生成一條獨立的 thread 執行 http_server_worker
去處理這個 client 的要求。
參考 kecho 的實作,我們先在 http_server.h
中加入:
新增 httpd_service
結構的用意是,我們可以使用鏈結串列來去追蹤 work item 的狀況。
is_stopped
用來記錄是否停止head
用來記錄 work item接著,修改 main.c
中模組載入時初始化的部分,
這邊的 alloc_workqueue 若設定 WQ_UNBOUND 不知道會不會比較好。
透過 alloc_workqueue
建立 workqueue,將後續所有 HTTP 請求封裝為 work item,並交由 kworker 於背景處理。
而主要改動都在 http_server.c
中,新增了 create_work
和 free_work
函式,前者的用途是每當有新連線 accept 成功時,通過 kmalloc
分配一塊 http_request
結構,然後用 INIT_WORK(work->khttpd_work, http_server_worker);
將他的成員 khttpd_work
初始化為一個 work item,綁定 http_server_worker
函式,一旦 kworker 拿到這個 work item 就會自動呼叫 http_server_worker
這個函式。
後者 free_work
則是在模組卸載時走訪鏈結串列上還沒被釋放的 http_request
。
同時我們針對 http_server_daemon
做以下修改:
初始化一個全域的 daemon_list,紀錄尚未釋放的 http_request
,在迴圈當中,每次有新連線 accept 進來,將接收到的 socket 透過 create_work
封裝成 struct http_request
,再使用 queue_work 交由系統的 CMWQ 排程。
同時也對 http_server_worker
做適度的修改,詳情請見對應的 Commit。
導入後:
從上述兩組數據可以看出,在相同的測試條件下,導入 CMWQ 之前和之後:
指標 | 導入前 | 導入後 |
---|---|---|
總耗時(秒) | 13.001 | 7.907 |
吞吐量(req/sec) | 15383.6 | 25293.244 |
執行 rmmod 會出現以下訊息,但不影響移除模組
待處理