k8s 系真的是 qps 杀手

2021-10-02 17:46:37 +08:00
 liuxu
测试了下 k3s,发现 qps 10 倍下跌。

压测机:ubuntu20.04 ,wrk2,6C16G 。
靶机:ubuntu20.04 ,2C4G 。
靶机和压测机均为同一内网,使用 vultr 多台机器搭建。

准备:
ubuntu20.04 下编译最新的 stable 版本 nginx-1.20.1,编译后的文件制作成 docker 镜像上传到 docker hub,然后又制作了一个 helm 包,用于直接安装到 k3s 测试。
其中 index.html 均为字符串"helloworld",nginx 配置 worker_connections 为 102400,worker_processes 为 auto 。
所有系统 nofile 为 102400 。

压测目标:
所有请求保证在 1s 以内,1k 或 10k 加减,如测试 1k 、2k,2k 超过 1s 则丢弃 2k 的数据,只留下 1k 的。10k 、20k,20k 超过 1 秒则丢弃 20k 的数据。


压测步骤:
1. 裸机启动 docker run,压测,然后卸载 docker,安装 k3s,默认 runtime 为 containerd 。
结果:裸 docker run 并发 10k,rps 30k 。k3s 直接降到并发 1k,rps 1k 。



2.分别安装 k3s(runtime 为 containerd)和 k3s(runtime 为 docker)压测。
结果:同为并发 1k,rps 1k,docker 延迟明显高于 containerd 。



3. k3s 使用 containerd,并分别安装 2 、3 、4 个 node 压测,其中 master 会被 taint 掉 agent,也就是真正运行 nginx 的为 1 、2 、3 个 node,其中每个 node 分配 1 个 nginx pod (当然 master 没有 pod )。
结果:随着 node 数增加,rps 也可以慢慢增加。但总的来说,即使此时有 4 个 2C4G 的 node,也只能并发 1k,rps 7k,远不如裸机跑 docker run 。




结论:使用 k8s 系可以拥有自动扩展,高可用等能力,而且可以直接对接多种 CI 平台。但是对于小成本又想要高 qps 的项目,不要使用 k8s 系,建议使用传统环境部署。当然很多人的项目永远都不会有 1k qps,所以这种业务情况上 k8s 系还是很香的。
12030 次点击
所在节点    Kubernetes
68 条回复
victor
2021-10-02 18:05:19 +08:00
生产环境我也遇到了类似的问题,结论一样,但不知道原因是啥。目前只能通过加机器的方式来增加 QPS,性价比极低。
插个眼,看看是否有大手子解答。
WispZhan
2021-10-02 18:16:10 +08:00
您就是传说中的标题党?

---

建议直接测 k8s 。控制变量,麻烦态度严谨一点。
Cooky
2021-10-02 18:27:48 +08:00
容器影响进程 /线程上下文切换效率?
liuxu
2021-10-02 18:37:06 +08:00
@victor 目前看是 ingress 和 apiserver 这一批占用了大量 cpu
JRyan
2021-10-02 18:39:56 +08:00
把资源限制调高看看 容器是有一点性能损耗 但不至于低这么多
liuxu
2021-10-02 18:40:30 +08:00
@WispZhan 我并发和 rps1k10k 逐步加量测了十几组数据,给出来的这 3 张图,别张口就来伙计
liuxu
2021-10-02 18:42:30 +08:00
@JRyan htop 看 node 是 cpu 爆了
liuxu
2021-10-02 18:45:25 +08:00
@JRyan 容器损耗并不高,单独 docker 和物理机直接 nginx 差别不大,主要是 k8s 系自身占用大量资源,用的话最好有大量 node,起码 5 台以上 4C8G 最好
JRyan
2021-10-02 18:46:13 +08:00
可能是本身集群占用的资源
johnsonqrr
2021-10-02 18:47:41 +08:00
测试:K3s
结论:K8s
UC 命令你马上来报道
liuxu
2021-10-02 18:50:47 +08:00
@johnsonqrr k8s 系,k3s 和 microk8s 都属于,k8s 需要的硬件基础更高
JRyan
2021-10-02 18:53:46 +08:00
你这可以在云上跑个集群测试就知道实际性能差异了
opengps
2021-10-02 18:54:11 +08:00
io 问题并非 k8s 独有,而是虚拟化的环节损失的,搭建的虚拟机同样也是性能损失大户
liuxu
2021-10-02 19:00:34 +08:00
@Cooky 对,开了 k3s 系统直接 200 多 thread,如果 runtime 改成 dockerd,300 多 thread,cpu 爆时,主要是 nginx 、ingress(traefik ) cpu 和 k3s 自身进程 cpu 占用高
WispZhan
2021-10-02 19:01:44 +08:00
@liuxu 自己 uc 风的标题,说我张开就来?

另外 1 没人是你伙计
liuxu
2021-10-02 19:03:26 +08:00
@JRyan k8s 系能上云的话会更好,主要是 ingress 用云的 LB,避免和业务 pod 在同一 node,下文切换导致性能衰减
wdlth
2021-10-02 19:06:38 +08:00
没看到安装 k8s 具体的配置和测试的方法,是否启用 IPVS,是否经过 ingress,是否优化 ingress 等等。
coolrc
2021-10-02 19:08:09 +08:00
态度严谨?那是不是还要查重呢
liuxu
2021-10-02 19:17:58 +08:00
@wdlth k3s 的官方命令默认安装,没有 IPVS,ingress 也是默认的 traefik v1 。主要是上次发了一个很详细的测试贴被人喷太多不想看,所以这次直接给图了。

实际上 k8s 优化起来,runtime 用 docker 或 containerd,网络用 fannel 或者 calico,ingress 是 traefik 1 或 2 或者 nginx,都对最终结果影响很大。

全部测这十一假期都测不完,万一某些没说清楚还要被楼上喷态度不严谨,或者喷你 UC 标题党
mengdodo
2021-10-02 19:23:20 +08:00
这个问题我看到了不止你一篇帖子,都是这个结论,小企业小应用不适用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/805677

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX