---
title: 2020 年春季 Linux 核心設計課程作業 —— kecho
image: https://repository-images.githubusercontent.com/181623502/5a221200-560c-11ea-8a63-53e08f8c367c
description: 檢驗學員對 Linux 核心 kthread 和 workqueue 處理機制的認知
---
# H09: kecho
###### tags: `linux2020`
> 主講人: [jserv](http://wiki.csie.ncku.edu.tw/User/jserv) / 課程討論區: [2020 年系統軟體課程](https://www.facebook.com/groups/system.software2020/)
:mega: 返回「[Linux 核心設計](http://wiki.csie.ncku.edu.tw/linux/schedule)」課程進度表
## :memo: 預期目標
* 學習 Linux 核心的 kernel thread 和 workqueue 處理機制
* 學習 [Concurrency Managed Workqueue](https://www.kernel.org/doc/html/v4.15/core-api/workqueue.html) (cmwq)
## :rocket: `kecho`: 執行在 Linux 核心模式的 TCP 伺服器
取得 kecho 原始程式碼並編譯:
```shell
$ git clone https://github.com/sysprog21/kecho
$ cd kecho
$ make
```
預期會見到以下:
* 執行檔: `bench` 及 `user-echo-server`
* 核心模組 `kecho.ko` 及 `drop-tcp-socket.ko`
接著可進行測試:
```shell
$ make check
```
參考輸出:
```
Preparing...
Send message via telnet
Progress : [########################################] 100%
Complete
```
該操作由以下動作組成:
```shell
$ sudo insmod kecho.ko
$ telnet localhost 12345
```
會出現以下輸出:
```
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
```
可輸入任何字元 (記得按下 Enter),然後就會看到 telnet 回應你剛才輸入的字元。
按下 `Ctrl` 和 `]` 組合鍵,之後按下 `q`,即可離開 telnet 畫面。接著可以試著在 `$ telnet localhost 12345` 時不要輸入任何字元,只是等待,會看到以下的 kernel 訊息 (可用 `$ dmesg` 觀察):
```
cope
le: 4404 kB
RssShmem: 0 kB
VmData: 880 kB
VmStk: 132 kB
VmExe: 136 kB
VmLib: 6336 kB
VmPTE: 212 kB
VmSwap: 0 kB
HugetlbPages: 0 kB
CoreDumping: 0
Threads: 1
SigQ: 0/31543
```
kecho 掛載時可指定 port 號碼: (預設是 `port=12345`)
```shell
$ sudo insmod kecho.ko port=1999
```
修改或測試 kecho 的過程,可能因為 `TIME-WAIT` sockets 持續佔用,導致 `rmmod` 無法成功,這時可透過給定的 `drop-tcp-socket` 核心模組來剔除特定的 TCP 連線。請詳細閱讀 [kecho](https://github.com/sysprog21/kecho) 以得知必要的設定和準備工作。
## :house: `user-echo-server`: 執行於使用者層級的 TCP 伺服器
`user-echo-server` 是 `kecho` 的使用者層級的實作,可對照功能和比較效能,運用 [epoll](http://man7.org/linux/man-pages/man7/epoll.7.html) 系統呼叫,會傾聽 port 12345。
不管是 `user-echo-server` 抑或 `kecho`,都可搭配給定的 `bench` 程式來分析效能。請詳細閱讀 [kecho](https://github.com/sysprog21/kecho) 以得知必要的設定和準備工作。
## :checkered_flag: 自我檢查清單
- [ ] 給定的 `kecho` 已使用 CMWQ,請陳述其優勢和用法
- [ ] 核心文件 [Concurrency Managed Workqueue (cmwq)](https://www.kernel.org/doc/html/latest/core-api/workqueue.html) 提到 "The original create_`*`workqueue() functions are deprecated and scheduled for removal",請參閱 Linux 核心的 git log (不要用 Google 搜尋!),揣摩 Linux 核心開發者的考量
- [ ] 解釋 `user-echo-server` 運作原理,特別是 [epoll](http://man7.org/linux/man-pages/man7/epoll.7.html) 系統呼叫的使用
- [ ] 是否理解 `bench` 原理,能否比較 `kecho` 和 `user-echo-server` 表現?佐以製圖
- [ ] 解釋 `drop-tcp-socket` 核心模組運作原理。`TIME-WAIT` sockets 又是什麼?
## :penguin: 作業要求
* 回答上述「自我檢查清單」的所有問題,需要附上對應的參考資料和必要的程式碼,以第一手材料 (包含自己設計的實驗) 為佳
:::warning
:warning: 如果你在 2020 年 3 月 30 日前,已從 GitHub [sysprog21/kecho](https://github.com/sysprog21/kecho) 進行 fork,請依據 [Alternatives to forking into the same account](https://github.community/t5/Support-Protips/Alternatives-to-forking-into-the-same-account/ba-p/7428) 一文,對舊的 repository 做對應處置,然後重新 fork
:::
* 在 GitHub 上 fork [kecho](https://github.com/sysprog21/kecho),目標是修正 `kecho` 的執行時期的缺失,提升效能和穩健度 (robustness)
* 若使用者層級的程式頻繁傳遞過長的字串給 `kecho` 核心模組,會發生什麼事?
* 參照 [kecho pull request #1](https://github.com/sysprog21/kecho/pull/1),嘗試比較 kthread 為基礎的實作和 CMWQ,指出兩者效能的落差並解釋
* 如果使用者層級的程式建立與 `kecho` 核心模組的連線後,就長期等待,會導致什麼問題?
* 研讀 [Linux Applications Performance: Introduction](https://unixism.net/2019/04/linux-applications-performance-introduction/),嘗試將上述實作列入考量,比較多種 TCP 伺服器實作手法的效能表現
## 繳交方式
編輯 [Homework5 作業區共筆](https://hackmd.io/@sysprog/linux2020-homework5),將你的觀察、上述要求的解說、應用場合探討,以及各式效能改善過程,善用 gnuplot 製圖,紀錄於新建立的共筆
## 截止日期
* Apr 25, 2020 (含) 之前
> 越早在 GitHub 上有動態、越早接受 code review,評分越高