linux2023
contributed by < JoshuaLee0321
>
kecho
已使用 CMWQ,請陳述其優勢和用法我想要先提到一個在 workqueue.h
中的笑話,在 linux-hwe-5.19-headers-5.19.0-41/include/linux/workqueue.h
的第 343 行,有一個定義了 WQ_MAX_ACTIVE = 512
註解上這樣打: /* I like 512, better ideas? */
相當的有幽默感。
使用方法其實沒有到很難
根據上面的流程圖可以看到,先行宣告一個 struct workqueue_struct *wq
,在 alloc_workqueu()
時設定好此 wq
的行為模式,接下來只需要給他工作即可
根據 workqueue.h
中有一個 enum
對於各個 FLAG
的定義以及它的名稱,不難猜出要這些參數有甚麼用處。以下來一一介紹:
參考資料:
相比於其他自行定義的 queue,如果程式設計者創造出太多 thread,這些 thread 每一個都有一個自己獨立的 PID,有機會導致 kernel space 中的 process 數量太多,而 user space 根本沒有辦法調度任何 process
另外在很多情況下,queue 中的 process 都是需要被異步處理,而通常自己設計的 queue 無法達成這個效果
相比之下,CMWQ明確的劃分了前後端的實作
讓用戶不需要關心如何分配每個 thread 在任何時間上的需不需要被執行,並且提出 thread pool
機制,讓所有進程都可以存取到共享的 thread
搭配閱讀《Demystifying the Linux CPU Scheduler》第 1 章和第 2 章,描述 CPU 排程器和 workqueue/CMWQ 的互動,應探究相關 Linux 核心原始程式碼
研讀〈Linux 核心設計: RCU 同步機制〉並測試相關 Linux 核心模組以理解其用法
如何測試網頁伺服器的效能,針對多核處理器場景調整
如何利用 Ftrace 找出 khttpd
核心模組的效能瓶頸,該如何設計相關實驗學習。搭配閱讀《Demystifying the Linux CPU Scheduler》第 6 章
解釋 drop-tcp-socket
核心模組運作原理。TIME-WAIT
sockets 又是什麼?
參照 eBPF 教程
virtme
建構虛擬化執行環境,搭配 GDB 追蹤 khttpd
核心模組參照 kecho 的程式碼,可以發現為了在核心中有效管理每一個 thread,可以看到在 echo_server.h
中存在
同理,我也在 http_server.h
中新增了同樣的結構方便管理每一個 caller
再來是修改原本的 http_server_worker.c
在原本的 kecho
當中必須要有幾個制式的流程:
process listhead of daemon
所以我們必須要照著上面的流程更改原本的程式碼。
首先更改 main.c
中的全域變數 khttp_wq
當作我們的佇列 (由以上第 1 行紀錄)
再來在第六行的地方初始化剛剛宣告的佇列。
由於我覺得在
http_server.c
又有一個新的結構體,這樣導致我要更改每一個結構體時必須要到不同的檔案中修改,於是我把所有有關結構體的宣告都移動到http_server.h
中
http_server.c
中的 struct http_request
移動到 http_server.h
並且在第 6, 7 行新增了鏈結串列節點以及 CMWQ 的結構。接下來更改 http_server.c
,首先,先實作 create_work
以及 free_work
,兩者皆參考 kecho-echo_server.c
中的對應函式實作
再來根據 kecho-echo_server.c
中可以發現,其傳遞參數的方法是由 container_of
的方法把 struct work_struct
當作參數放入 khttp_worker
中,所以在 khttp
中也必須要做一樣的事情,並且把相對傳遞參數的方法改掉
可以看到在第 7 行增加了 realloc
的標籤,由於先前的函數在失敗之後就直接回傳 -1 當作失敗,並且重複使用 thread,在這邊因為沒有辦法回傳,所以我選擇的方法為重複 kzalloc
直到成功為止。另外可以看到第 4 行已經利用 container_of
取出結構體,並且在第 15, 18, 32 行取代成 worker->socket
。
經過以下的改動,我已經把 CMWQ 實作在 khttp
中了,以下為兩者之間用 hstress.c
的比較
以下數據皆使用
./htstress localhost:8081 -n 100000 -c 10
來做區別
khttpd without CMWQ
khttpd with CMWQ
可以看到,在實作了 CMWQ
之後,速度從原本的 4.6 秒降低至 4.01 秒。
http_server_worker
時,我總是不知道裡面有哪些參數是可以使用的另外在修改了 http_server_worker
中的一小部分:
這樣一來就可以隨時得知 buf
中的資訊
favicon.ico
favicon.ico
這個關鍵字,查了之後才發現許多瀏覽器都會發送此類型的靜態 request
參考資料: favicon.ico
在 kernel 中並不存在 process 的概念,如果要做出 directory listing 的功能,必須要給每一個連線者專屬的記憶體空間,讓他可以去訪問當前她想要的東西