已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
背景
我在给一套工业数据网关做容器化。网关里有个高吞吐转发进程(C++,自研 epoll 内核),我们想升级到 io_uring 走异步 IO,目标是单核从 ~24k QPS 提到 60k+。同一个二进制在裸机(节点内核 5.15.0-91)上 io_uring_setup 直接就能跑,但一塞进 K8s(1.28.9,containerd 1.7.13,cgroup v2)就出问题。
现象
容器内 io_uring_setup 直接返回 EPERM (Operation not permitted),strace 抓到的就是这一行,进程回退到 epoll 路径后 QPS 打不上去。我基本判断是 seccomp 拦的——同一台机器裸机能跑、容器不能,差异点只在 seccomp profile。安全团队的立场很明确:不接受 seccomp: Unconfined,要求最小放行。
已尝试
securityContext.seccompProfile 从 RuntimeDefault 临时改成 Unconfined——能跑了,QPS 到 58k,验证了瓶颈确实是 syscall 被拦,但安全评审直接打回;io_uring_setup / io_uring_enter / io_uring_register 三个都不在里面;Localhost 类型,要落文件到节点(如 /var/lib/kubelet/seccomp/),我还没想清楚在"不 root 进每个 worker 节点"的前提下怎么把 profile 文件分发到全集群;期望得到的答案形态
io_uring_register 里的 IORING_REGISTER_BUFFERS 是不是必须?),有没有人踩过"放行了 setup 但漏了 register,buffer 注册失败"的坑;Localhost 自定义 seccomp profile,profile JSON 大概长什么样(只列这几个 syscall 的 allow 规则 + 其余 defaultAction=SCMP_ACT_ERRNO),以及 profile 文件如何在"不 root 进节点"的前提下分发(initContainer 写文件 / DaemonSet / 其他方式),最好有现成 YAML;不想要"理论上可以",想要具体 JSON 片段 / YAML / 命令,外加一个明确的成本收益结论。