kLoopPython asyncio 事件循環(huán)
kLoop 是一個 Python asyncio 事件循環(huán)的實(shí)現(xiàn),主要用 Cython 編寫,重點(diǎn)使用了 Linux 內(nèi)核的 io_uring 和 kTLS 功能,故稱作 k(ernel)Loop。
主要特性
- 系統(tǒng)調(diào)用次數(shù)非常少:得益于 io_uring,所有 I/O 調(diào)用都由內(nèi)核完成;因?yàn)閱⒂昧?span>
SQPOLL,唯一的系統(tǒng)調(diào)用io_uring_enter()也僅在必要時才會用到,因此節(jié)省下了幾乎所有系統(tǒng)調(diào)用的額外開銷; - 主循環(huán)主體不占有 GIL:雖然使用了 Cython 編寫,但大部分最核心的代碼都被編譯為不需要 Python 結(jié)構(gòu)的普通 C 代碼,一方面節(jié)省內(nèi)存開銷和處理時間,另一方面不持有 GIL,僅在有 Python 回調(diào)時才上 GIL 鎖,對多線程稍微友好一點(diǎn),但還是推薦單線程跑;
- 內(nèi)核網(wǎng)卡代工 TLS:如果硬件支持,TLS 通訊的全部對稱加密解密皆由網(wǎng)卡完成,空出 CPU 來做更多的 I/O;即使網(wǎng)卡不支持,io_uring 也可以在內(nèi)核中開多線程來執(zhí)行對稱加解密,不受應(yīng)用端單線程的限制,充分利用多核 CPU;
- 純異步 DNS 解析:混編進(jìn)了 Rust 寫的 trust-dns,I/O 層直接走 io_uring(包括加載
/etc/resolv.conf和/etc/hosts文件),在 C 和 Rust 之間互相調(diào)用完成 DNS 解析,并且提供了更加靈活的 Python 接口來控制并發(fā)、緩存和配置文件。
環(huán)境需求
- Python >= 3.10
- Linux >= 5.11 (用
modprobe tls命令來啟用 kTLS 模塊) - OpenSSL >= 3.0(支持 kTLS 收包代工需要最新的開發(fā)版本)
目前主要是在 Ubuntu 22.04 上開發(fā)測試的。
架構(gòu)圖
評論
圖片
表情
