# Concurrency Managed Workqueue [workqueue 官方文件](https://www.kernel.org/doc/html/latest/core-api/workqueue.html) [2025 年 Linux 核心設計課程作業 —— ktcp](https://hackmd.io/@sysprog/linux2025-ktcp/%2F%40sysprog%2Flinux2025-ktcp-c#%E4%BD%BF%E7%94%A8-Ftrace-%E8%A7%80%E5%AF%9F-kHTTPd) [Linux 核心設計: Concurrency Managed Workqueue](https://hackmd.io/@RinHizakura/H1PKDev6h) [紀錄:一對一討論](https://hackmd.io/P82xNXcZS46lh6VoHQkJyA?view) ## 為甚麼需要它 過去的 workqueue 實作有兩種 - multi threaded (MT) wq - single threaded (ST) wq ### 名詞解釋 - work item: 一個要執行的函式 - workqueue: 存放 work item - work thread: 用來執行 work item >When such an asynchronous execution context is needed, a work item describing which function to execute is put on a queue. An independent thread serves as the asynchronous execution context. The queue is called workqueue and the thread is called worker. ### single threaded (ST) wq 每建立一個 workqueue ,會在系統建立一個 work thread ### multi threaded (MT) wq - 每建立一個 workqueue ,會在每個 CPU 上建立一個 work thread,這很可能導致把 pid 數量( 32k )用完 - 每個 cpu 最多只能有一個執行緒處理工作 :::info [Concurrency Managed Workqueue之(二):CMWQ概述](http://www.wowotech.net/irq_subsystem/cmwq-intro.html) 上面寫說某個 cpu 被阻塞,該 cpu 處理的其他 work 也會被阻塞,但沒有找到 MTWQ work item 會先排入各個 cpu 的敘述,不知道是不是對的,但好像很合理? ::: ## CMWQ 設計 ### threaded workqueues - 所有 worker 執行緒由 worker-pool 統一管理 -> 解決了 MTWQ 大量建立 thread 與 cpu 阻塞的問題 - 使用者層面的工作佇列(寫核心模組用到的部份)與後端處理(實際處理工作的部份)分離 - 每個 cpu 有兩個 worker pool - 一個負責處理「一般」優先等級的工作項目 - 一個負責處理「高優先」工作項目 - 為了服務 unbound workqueue(不綁定特定 CPU 的工作佇列)所排入的工作項目,系統還會動態建立額外的 worker-pool。 ### BH workqueue ### 建立與排程工作項目 ### 並行度管理 - worker-pool 與並行度管理 - worker-pool 透過 hook 排程器來管理並行度 - 維持足以避免處理停滯就算最佳化 - 當 cpu 上還有一個 runnable worker 時,worker-pool 不會啟動新的工作 - 但當最後一個執行中的 worker 進入睡眠時,系統會立即排程另一個 worker :::info kxo 的 mcts 是不是因為這個設計,變得很卡? ::: - idle worker 保留 - cmwq 會保留 idle worker 一段時間,若有新的 work-item 要處理,就不用重新建立 - Forward Progress - 系統必須能在需要更多執行上下文時建立新的 worker,才能保證前向進度。此保證仰賴 rescue worker 的機制 - `WQ_MEM_RECLAIM` ### kworker thread 的排程策略 ``` chrt -p 27779 pid 27779's current scheduling policy: SCHED_OTHER pid 27779 目前的排程優先權:0 ``` - `WQ_CPU_INTENSIVE` 的影響經過實測,不會影響排程策略跟 nice 值,但跑 mcts 的時候電腦變得不卡了,根據 doc 的描述,它會讓這個 workqueue 的 work 不會阻礙其他 work 的執行 >runnable CPU intensive work items will not prevent other work items in the same worker-pool from starting execution