2022-03-19 21:20:40 +00:00
|
|
|
|
# kLoop
|
|
|
|
|
|
2022-05-29 19:09:09 +00:00
|
|
|
|
[中文](README.zh.md)
|
|
|
|
|
|
2022-05-27 23:05:33 +00:00
|
|
|
|
kLoop is an implementation of the Python
|
|
|
|
|
[asyncio](https://docs.python.org/3/library/asyncio.html) event loop written
|
|
|
|
|
in [Cython](https://cython.org/), using
|
|
|
|
|
[io_uring](https://unixism.net/loti/what_is_io_uring.html) and
|
2022-03-19 21:38:34 +00:00
|
|
|
|
[kTLS](https://www.kernel.org/doc/html/latest/networking/tls-offload.html)
|
2022-05-27 23:05:33 +00:00
|
|
|
|
features of the Linux kernel, therefore called k(ernel)Loop.
|
2022-03-19 21:38:34 +00:00
|
|
|
|
|
2022-05-27 23:05:33 +00:00
|
|
|
|
kLoop is open-sourced and released under the
|
|
|
|
|
[MulanPSL - 2.0 license](http://license.coscl.org.cn/MulanPSL2).
|
2022-03-19 21:38:34 +00:00
|
|
|
|
|
2022-05-27 23:05:33 +00:00
|
|
|
|
**⚠️WARNING: THIS PROJECT IS IN PROOF-OF-CONCEPT STAGE!⚠️**
|
2022-03-19 21:38:34 +00:00
|
|
|
|
|
|
|
|
|
|
2022-05-27 23:05:33 +00:00
|
|
|
|
## Features
|
2022-04-30 12:39:05 +00:00
|
|
|
|
|
2022-05-27 23:05:33 +00:00
|
|
|
|
* **Minimum syscalls** - all I/O calls are done in the kernel thanks to
|
|
|
|
|
io_uring, and the only remaining syscall to `io_uring_enter()` is also
|
|
|
|
|
optimized to be only called when necessary using the `SQPOLL` feature. That
|
|
|
|
|
means most of the overhead of syscalls is gone;
|
|
|
|
|
* **No GIL in the main-loop** - the hot-path is written in Cython without GIL,
|
|
|
|
|
that means it's compiled into pure C code without Python structures, saving
|
|
|
|
|
some memory and execution time. On the other hand, GIL is only taken before
|
|
|
|
|
Python callbacks, so it's slightly more friendly to multithreading, which is
|
|
|
|
|
still not recommended though.
|
|
|
|
|
* **TLS offloading** - all symmetric-key encryption and decryption work is
|
|
|
|
|
offloaded to the NIC if supported, or to the thread pool of io_uring
|
|
|
|
|
otherwise. This allows us to free up CPU for more I/O, or leverage all the
|
|
|
|
|
CPU cores even if the application is running single-threaded.
|
|
|
|
|
* **Asynchronous DNS resolving** - we blended in the Rust
|
|
|
|
|
[trust-dns](https://github.com/bluejekyll/trust-dns/) library with a custom
|
|
|
|
|
I/O runtime bridging to io_uring in C (including reading the
|
|
|
|
|
`/etc/resolv.conf` and `/etc/hosts` files), providing flexible APIs to manage
|
|
|
|
|
the concurrency, cache and configuration in Python.
|
2022-04-30 12:39:05 +00:00
|
|
|
|
|
|
|
|
|
|
2022-05-27 23:05:33 +00:00
|
|
|
|
## Requirements
|
2022-03-19 21:38:34 +00:00
|
|
|
|
|
2022-04-30 12:39:05 +00:00
|
|
|
|
* Python >= 3.10
|
2022-05-27 23:05:33 +00:00
|
|
|
|
* Linux >= 5.11 (enable kTLS with `modprobe tls`)
|
|
|
|
|
* OpenSSL >= 3.0 (kTLS receive offloading requires the latest development
|
|
|
|
|
version)
|
2022-04-30 12:39:05 +00:00
|
|
|
|
|
2022-05-27 23:05:33 +00:00
|
|
|
|
Development and testing is done on Ubuntu 22.04.
|
2022-04-30 12:39:05 +00:00
|
|
|
|
|
|
|
|
|
|
2022-05-27 23:05:33 +00:00
|
|
|
|
## Architecture Diagram
|
2022-04-30 12:39:05 +00:00
|
|
|
|
|
2022-05-29 19:09:09 +00:00
|
|
|
|
![architecture.png](architecture.en.png)
|
2022-04-30 12:39:05 +00:00
|
|
|
|
|
2022-05-27 23:05:33 +00:00
|
|
|
|
Looks like the Lucky Charms factory, says @aaronbrighton ...
|