--- title: 2025 年 Linux 核心設計課程作業 —— ktcp image: https://hackmd.io/_uploads/HybjLFz1ll.png description: 檢驗學員對 Linux 核心 kthread 和 workqueue 處理機制的認知 tags: linux2025 --- # N07: ktcp > 主講人: [jserv](https://wiki.csie.ncku.edu.tw/User/jserv) / 課程討論區: [2025 年系統軟體課程](https://www.facebook.com/groups/system.software2025/) :mega: 返回「[Linux 核心設計](https://wiki.csie.ncku.edu.tw/linux/schedule)」課程進度表 :::warning 5 月 22 日會提供 Google 表單讓學員填寫並藉此提交作業 ::: ## :checkered_flag: 自我檢查清單 - [ ] 研讀〈[Linux 核心設計: RCU 同步機制](https://hackmd.io/@sysprog/linux-rcu)〉並測試相關 Linux 核心模組以理解其用法 - [ ] 如何測試網頁伺服器的效能,針對多核處理器場景調整 - [ ] 如何利用 [Ftrace](https://docs.kernel.org/trace/ftrace.html) 找出 `khttpd` 核心模組的效能瓶頸,該如何設計相關實驗學習。搭配閱讀《Demystifying the Linux CPU Scheduler》第 6 章 - [ ] 解釋 `drop-tcp-socket` 核心模組運作原理。`TIME-WAIT` sockets 又是什麼? - [ ] 參照〈[測試 Linux 核心的虛擬化環境](https://hackmd.io/@sysprog/linux-virtme)〉和〈[建構 User-Mode Linux 的實驗環境](https://hackmd.io/@sysprog/user-mode-linux-env)〉,在原生的 Linux 系統中,利用 UML 或 `virtme` 建構虛擬化執行環境,搭配 GDB 追蹤 `khttpd` 核心模組,探討以下議題 * `khttpd` 如何掛載到 Linux 核心且完成初始化? * `khttpd` 的 kthread 如何被 Linux 核心識別且執行? * kworker 和 kthread 的特性和適用場景 ## :penguin: 作業要求 * 回答上述「自我檢查清單」的所有問題,需要附上對應的參考資料和必要的程式碼,以第一手材料 (包含自己設計的實驗) 為佳 * 在 GitHub fork [khttpd](https://github.com/sysprog21/khttpd),並完成下列目標: 1. 導入 [Concurrency Managed Workqueue](https://www.kernel.org/doc/html/v4.15/core-api/workqueue.html)(CMWQ),改寫 kHTTPd;善用 eBPF 量測效能並提出改進方案,可參考 [kecho](https://github.com/sysprog21/kecho) > 研讀[透過 eBPF 觀察作業系統行為](https://hackmd.io/@sysprog/linux-ebpf)和 [eBPF Developer Tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) 2. 加入目錄存取及基本 [directory listing](https://cwiki.apache.org/confluence/display/httpd/DirectoryListings) 功能,留意 MIME 型態和檔案資源的處理 3. 以[第 8 週測驗題](https://hackmd.io/@sysprog/linux2025-quiz8)中的 `kweb` 程式碼為基礎,加入透過 sysfs 提供的控制介面,讓使用者空間可啟動/關閉伺服器及查詢內部狀態 (模組載入時預設啟動),並整合 [Linux namespaces](https://man7.org/linux/man-pages/man7/namespaces.7.html),在核心層級隔離系統資源 4. 現行 kHTTPd 初步支援 [HTTP 1.1 keep‑alive](https://en.wikipedia.org/wiki/HTTP_persistent_connection),效能仍待提升;透過 ftrace 等工具定位瓶頸並改良 5. 支援 HTTP 壓縮,善用 Linux 核心的 [crypto API](https://www.kernel.org/doc/html/latest/crypto/) 6. 引入 timer 機制,主動關閉逾時連線,嘗試引入 tickless hierarchical timing wheel 提升在高度並行環境的處理能力 7. 以 RCU 結合自訂 lock‑free 資料結構,在並行環境釋放系統資源 8. 參考 [cserv](https://github.com/sysprog21/cserv) 的 memcache 設計,在 kHTTPd 實作快取功能且避免 lock contention 9. 現用 [nodejs/http‑parser](https://github.com/nodejs/http-parser) 已停止維護且效能有限,可改採 [picohttpparser](https://github.com/h2o/picohttpparser) 或其他輕量級的 HTTP 解析器實作 (避免 SSE 指令) 10. 研讀〈[並行程式設計: 排程器原理](https://hackmd.io/@sysprog/concurrency-sched)〉,比照 cserv 和 lwan 的 coroutine 機制,用以改進事件處理流程 * 開發過程中,也該落實以下: - 修正 kHTTPd 執行時期問題 - 指出並修復現有實作缺陷,特別是安全顧慮 - 以改進版 kHTTPd 與 [cserv](https://github.com/sysprog21/cserv) 進行效能比較並說明差異 - 排除 CMWQ 相關變更(回到 kthread 架構),將錯誤修正與功能增強以 pull request 形式提交至 [khttpd](https://github.com/sysprog21/khttpd),並參與程式碼審查;若你設定的主題已有既有 pull request,可加入討論並分享成果與經驗 ## 截止日期 * May 16, 2025 (含) 之前 > 越早在 GitHub 上有動態、越早接受 code review,評分越高 ## 作業觀摩 * [fatcatorange](https://hackmd.io/@sysprog/HkyVuh0NR) * [han1018](https://hackmd.io/@sysprog/HkyNQeJrR) * [YiChianLin/khttpd](https://hackmd.io/@YiChianLin/linux2022-ktcp) * [zoanana990/khttpd](https://hackmd.io/@zoanana990/linux2022-ktcp) * [eric88525/kecho](https://hackmd.io/@eric88525/linux2022-ktcp) * [eecheng87/kecho](https://hackmd.io/@eecheng/Sy9XsgjOI) * [OscarShiang/kecho](https://hackmd.io/@oscarshiang/linux_kecho) * [bakudr18/khttpd](https://hackmd.io/@bakudr18/SkFA8Favu) * [AndybnA/khttpd](https://hackmd.io/@AndybnA/khttpd) * [eecheng/khttpd](https://hackmd.io/@eecheng/SkyvhMqwU) * [haogroot/khttpd](https://hackmd.io/@haogroot/2020q1linux-khttpd) * [KYG-yaya573142/khttpd](https://hackmd.io/@KYWeng/H1OBDQdKL)