Silk: 开源协作式纤程调度器

Hacker News Top 工具

摘要

Silk 是一个面向 Linux 的开源协作式纤程调度器,具有每 CPU 调度线程、io_uring 集成和拓扑感知的工作窃取功能,专为低开销下的高并发而设计。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/05/24 09:37

ClickHouse/silk

来源:https://github.com/ClickHouse/silk

Silk

一个面向 Linux 的协作式纤程调度器,具有每 CPU 调度线程、io_uring 集成和拓扑感知的任务窃取能力。纤程是轻量级的有栈协程,它们挂起而非阻塞其所属的 OS 线程,从而以较低开销实现高并发。

文档

  • docs/scheduler.md — 调度循环、上下文切换、挂起模式、异步 IO、睡眠取消、任务窃取设计及性能基准
  • docs/sync.md — 同步原语:FiberFuture、FiberFutex、FiberMutex、FiberSequencer、FiberEvent、FairFiberMutex
  • docs/util.md — 工具库:无锁数据结构、TSC 计时、内存池、CPU 拓扑、日志、断言
  • docs/perf.md — net-perf 和 file-perf 基准测试结果及 fio 对比
  • docs/coroutines.md — 无栈协程与有栈纤程:设计差异与性能数据
  • src/fibers/tests/ — 使用示例:纤程生命周期、future、同步原语、异步 IO
  • src/gdb/fiber.py — GDB 扩展;通过 source src/gdb/fiber.py 加载,然后使用 fiber-list、fiber-savecontext、fiber-restorecontext、fiber-switchcontext

依赖

  • CMake >= 3.28
  • Ninja
  • Clang 21
  • ccache(可选)
  • Boost 头文件(libboost-dev)
  • libelf(libelf-dev)—— 可选,仅 src/profiler 需要;若缺失则静默跳过 profiler。
    GTest、Google Benchmark、libbacktrace、liburing、librseq、libbpf、bpftool 和 cxxopts 以子模块形式捆绑在 contrib/ 下,无需单独安装。用于纤程切换的两个 Boost.Context 汇编源文件放入 contrib/fcontext/ 中,systemtap 的 USDT 头文件(和)放入 contrib/systemtap-sdt/ 中(均为直接放入,非子模块)。Poco、AWS SDK 和 jemalloc 可通过向 configure 传递 --build-poco、--build-aws 和 --build-jemalloc 来按需构建。可选基准测试的运行时依赖:nginx(仅 http-perf --nginx 需要;默认使用 http-perf 二进制内置的基于 Poco 的内部服务器)、fio(用于 fio-perf)和 MinIO(用于 s3-perf)。如果未在 PATH 中找到 MinIO,会自动下载到 .tools/ 目录;其余依赖需单独安装。

构建

./bb [选项] [命令]

全局选项

选项值默认值描述
-b, --builddebug, releasedebug构建类型
-s, --sanitizerthread, address, memory, undefined启用 sanitizer
-v, --verbose在运行前打印每条命令;同时将 --verbose 传递给 perf 二进制以启用调试日志

命令

configure [--build-poco] [--build-aws] [--build-jemalloc]

配置(或重新配置)CMake 构建目录。可选标志启用默认关闭的组件:--build-poco 启用 http-perf(需要 Poco),--build-aws 启用 s3-perf(需要 AWS SDK),--build-jemalloc 启用 jemalloc(由 http-perf 和 s3-perf 使用以提升分配器性能)。
./bb configure ./bb configure --build-poco --build-aws ./bb -b release configure

fmt [--check]

使用 clang-format-21 格式化所有源文件。传递 --check 在不修改文件的情况下检查格式(若有文件将被更改则退出非零)。
./bb fmt ./bb fmt --check

clean

删除整个 build/ 目录。
./bb clean

build [目标]

构建项目。如果构建目录不存在则自动配置。当未指定命令时,build 是默认命令。
./bb # debug 构建 ./bb -b release # release 构建 ./bb -s thread # 带 TSan 的 debug 构建 ./bb -b release -s address # 带 ASan 的 release 构建 ./bb build fibers-test # 构建特定目标

test [-R 模式] [-N] [ctest 标志...]

构建并运行测试。使用所有可用 CPU 并行运行。任何额外标志直接传递给 ctest。

标志描述
-R <模式>仅运行匹配正则表达式的测试
-N列出测试而不运行
--timeout SECONDS每个测试的超时时间(秒,默认 180,0 表示无限制)
--coverage使用覆盖率检测、运行测试,并生成 HTML 报告、lcov 文件和 Cobertura XML 报告(位于 build/debug-coverage/ 下)
--rerun-failed仅重新运行上次失败的测试
--repeat until-fail:<n>每个测试最多重复 n 次,首次失败即停止(适合查找不稳定测试)
--output-on-failure测试失败时输出测试内容
``
./bb test
./bb test -R FiberMutex
./bb -s thread test
./bb test –rerun-failed
./bb test –coverage
``

bench [-R 模式] [-N] [gbench 标志...]

构建并运行基准测试。

标志描述
-R <模式>仅运行匹配模式的基准测试
-N列出基准测试而不运行
--timeout SECONDS每个基准测试的超时时间(秒,默认 180,0 表示无限制)
``
./bb -b release bench
./bb -b release bench -R LockFreeQueue
``

性能命令

每个 perf 命令构建相关二进制并运行基准测试,以 Markdown 表格形式输出结果。持续时间、预热和延迟选项可接受单位后缀(ns、us、ms、s、m);裸数字被视为秒。所有 perf 命令均接受 --timeout SECONDS(每次运行的超时时间;默认 180,0 表示无限制)。

file-perf

使用 io_uring 的异步文件 I/O 基准测试。

选项默认值描述
--file PATH/dev/shm/file-perf.bin测试文件路径
--bs SIZE4k块大小
--size SIZE1g文件大小
--duration DURATION10测量持续时间
--warmup DURATION2预热持续时间
--numjobs N [N ...]1并行作业数
--iodepth N [N ...]16每个作业的 IO 队列深度
--rw MODE [MODE ...]randread访问模式:randread、randwrite、seqread
--flamegraph分析并生成火焰图 SVG
--print-counters每次运行后打印性能计数器
``
./bb -b release file-perf
./bb -b release file-perf –bs 64k –size 4g
./bb -b release file-perf –numjobs 1 16 –iodepth 1 16
./bb -b release file-perf –rw randread randwrite
./bb -b release file-perf –flamegraph
``

fio-perf

使用 io_uring 引擎的 fio 对比。选项与 file-perf 相同(除 --flamegraph 和 --print-counters)。不构建任何东西。
./bb fio-perf ./bb fio-perf --bs 64k ./bb fio-perf --numjobs 1 16 --iodepth 1 16

net-perf

TCP 回显基准测试。启动本地服务器并运行客户端。当 --host 指向远程主机时,不在本地启动服务器。

选项默认值描述
--host127.0.0.1服务器主机
--port17777服务器端口
--msg-size BYTES64回显消息大小
--duration DURATION10测量持续时间
--warmup DURATION2预热持续时间
--connections N [N ...]1000要扫描的连接数
--delay DURATION0服务端每条消息的延迟(例如 1ms、100us)
--flamegraph分析客户端并生成火焰图 SVG
--print-counters每次运行后打印性能计数器
``
./bb -b release net-perf
./bb -b release net-perf –connections 1 64 256 1024
./bb -b release net-perf –delay 1ms
./bb -b release net-perf –host 10.0.0.2
./bb -b release net-perf –flamegraph
``

net-perf-asio

使用 Boost.Asio C++20 协程的 TCP 回显基准测试。选项与 net-perf 相同。
./bb -b release net-perf-asio ./bb -b release net-perf-asio --connections 1 64 256 1024 ./bb -b release net-perf-asio --delay 1ms ./bb -b release net-perf-asio --flamegraph

http-perf

HTTP/1.1 GET 基准测试。默认使用 silk 的内部 HTTP 服务器(基于 FiberSocketImpl 的 Poco HTTPServerConnection,每个连接一个纤程);传递 --nginx 则针对 nginx 运行。

选项默认值描述
--host127.0.0.1服务器主机
--port18080服务器端口
--duration DURATION10测量持续时间
--warmup DURATION2预热持续时间
--connections N [N ...]1000要扫描的连接数
--delay DURATION0服务端每个请求的延迟(例如 1ms、100us);纤程服务器使用 silk::FiberScheduler::sleep,nginx 使用 lua sleep
--threads使用每连接线程客户端模式而非纤程
--nginx客户机针对 nginx 而非内部服务器运行
--flamegraph分析客户端并生成火焰图 SVG
--print-counters每次运行后打印性能计数器
``
./bb -b release http-perf
./bb -b release http-perf –threads
./bb -b release http-perf –nginx
./bb -b release http-perf –delay 5ms
./bb -b release http-perf –connections 1 512 1024 2048
./bb -b release http-perf –flamegraph
``

s3-perf

S3 对象存储基准测试。启动本地 MinIO 服务器(如果未在 PATH 中找到,会自动下载到 .tools/ 目录)并运行客户端。

选项默认值描述
--endpoint URLhttp://127.0.0.1:9000S3 端点
--bucket NAMEtest-bucketS3 桶
--key NAMEtest-objectS3 对象键
--region NAMEus-east-1S3 区域
--access-key KEYminioadminS3 访问键
--secret-key KEYminioadminS3 秘密键
--size SIZE4096对象大小;无单位时为字节(例如 4096、64k、1g)
--duration DURATION10测量持续时间
--warmup DURATION2预热持续时间
--numjobs N [N ...]1并行作业数
--iodepth N [N ...]16每个作业的 IO 队列深度
--rw MODE [MODE ...]read访问模式:read、write、readwrite
--threads同时使用线程执行器运行
--flamegraph分析第一个配置并生成火焰图 SVG
--print-counters每次运行后打印性能计数器
--data-dir PATH/dev/shm/minio-dataMinIO 数据目录
``
./bb -b release s3-perf
./bb -b release s3-perf –rw read write
./bb -b release s3-perf –numjobs 1 16 –iodepth 1 64
./bb -b release s3-perf –threads
./bb -b release s3-perf –flamegraph
``

perf

一次运行多个 perf 基准测试。目标为位置值,列在选项之后。

目标描述
filefile-perf
fiofio 对比
netnet-perf
net-asionet-perf-asio
net-epollnet-perf-epoll
httphttp-perf(内部服务器,纤程客户端)
http-threadshttp-perf(内部服务器,线程客户端)
http-nginx针对 nginx 的 http-perf(纤程客户端)
s3s3-perf(纤程)
s3-threadss3-perf(线程)
all运行以上所有目标
选项描述
——
--duration DURATION覆盖每二进制的测量持续时间(例如 60s)
--warmup DURATION覆盖每二进制的预热持续时间(例如 10s)
--timeout SECONDS每次运行的超时时间(默认 180,0 表示无限制)
``
./bb -b release perf file net
./bb -b release perf all
./bb -b release perf –duration 60s –warmup 10s file net net-asio
./bb -b release perf –duration 60s –warmup 10s all
``

相似文章

宣布 Silk:为 ClickHouse 打造的丝滑纤程运行时

Lobsters Hottest

Silk 是一个为 ClickHouse 设计的新栈式纤程库和调度器,通过 NUMA 感知的工作窃取、io_uring 以及热路径上的零堆分配来提升异步 I/O 性能。它适用于分布式缓存、对象存储和网络 I/O 等 I/O 密集型组件。

面向GPU集群的高影响力调度系统

Hugging Face Blog

Ai2的AI基础设施团队详细介绍了如何用一套基于GPU时间预算、分层公平份额分配和时间切片合约的系统,取代原有的优先级GPU调度器,从而在优先保障高影响力研究的同时,在数千块H100、B200和B300 GPU上保持集群的满载运行。

Show HN: Runloom – 适用于Python自由线程的Go风格协程

Hacker News Top

Runloom是一个新的Python库,为自由线程Python(3.13t/3.14t)提供了Go风格的栈式协程和任务窃取调度器,使得阻塞代码能够在无GIL的情况下跨核心并发运行。它声称在生成吞吐量和调度性能上可以与Go匹敌或超越。

利用Linux进程进行高性能网络仿真(2022)

Hacker News Top

本文介绍了Phantom,一个借用Linux进程在高效离散事件网络仿真器中运行未经修改的应用程序的工具,展示了相较于Shadow和NS-3等现有工具的显著速度提升。