ClickHouse presenta Silk, un runtime de fibras optimizado para su caché distribuida

Fuentes: Announcing Silk: a silky smooth fiber runtime for ClickHouse

ClickHouse ha presentado Silk, una biblioteca en C++ y un programador de fibras cooperativo diseñado para integrarse, en primer lugar, en su caché distribuida. La herramienta combina un bucle de robo de trabajo consciente de la topología NUMA, io_uring como base para la E/S asíncrona y cero asignaciones en el montón durante el estado estable, con el objetivo de soportar cargas de E/S altamente concurrentes donde los hilos del sistema operativo resultan demasiado costosos.

Silk ejecuta un hilo del sistema por CPU fijado a un núcleo y mantiene colas listas acotadas por CPU, anillos io_uring, árboles de espera y un eventfd como mecanismo de唤醒. Cuando una cola se vacía, el programador activa un IORING_OP_POLL_ADD_MULTI persistente y roba trabajo de CPUs cercanas según un orden de coste: primero hermanos hyperthread, luego núcleos del mismo zócalo y, por último, otros zócalos. Las pilas de las fibras se obtienen mediante mmap desde un pool por fibra con páginas de guarda, lo que evita la aliasing de caché L1 que el artículo Photon de Alibaba cifró en un 13 % de sobrecarga y que Silk no reproduce en sus pruebas.

Según los benchmarks publicados, Silk rinde alrededor de 3,6 ns por yield de fibra con robo entre CPUs, 7,6 µs en un ping-pong sobre io_uring, 5,9 millones de IOPS de fichero, hasta quince veces más rendimiento que boost::asio en una conexión y cerca de cuatro veces más en alta concurrencia, además de pilas sin bloqueos por CPU hasta 2068 veces más rápidas que una global a 32 hilos mediante rseq. La metodología se acompaña de un arnés de benchmarking reproducible en el repositorio. La compañía distribuye Silk con extensiones para GDB y un perfilador BPF para validar su uso en producción.