最近看了一遍 runtime ,去尝试了之前遗留的一个工作:调整 k8s 中容器的 GOMAXPROCS ,效果还不错。
在 11:35 左右, 我们将应用的 GOMAXPROCS 从默认的 32/64 主动设置为 4, 对比 14:30 和 11:30 的数据可以看到:
1 julyclyde 2023-01-18 16:48:13 +08:00 那就需要分析一下原因了 降低并发度之后反而提高了处理能力,说明并发的时候内耗比较大? |
![]() | 2 kiwi95 2023-01-18 16:51:41 +08:00 via Android 说明当前场景下并发调度开销比较大? |
![]() | 3 loveuer 2023-01-18 16:52:12 +08:00 可以细说一下主要啥类型的业务么 |
4 chenqh 2023-01-18 16:55:33 +08:00 你这是 k8s 吧,golang 这种不应该是一个进程吃满的吗,又不是 python 那种 |
5 GopherDaily OP @julyclyde go scheduler 调度的成本,和 os thread 上下文切换的成本 |
6 julyclyde 2023-01-18 17:13:52 +08:00 是容器运行吗? runtime.NumCPU()和容器的核数是否一致? |
![]() | 7 Maboroshii 2023-01-18 17:15:06 +08:00 k8s node 上还有其他 pod 吧,都想吃满机器 ,肯定有反效果 |
8 GopherDaily OP @loveuer 典型的 web 服务呗 |
9 GopherDaily OP @Maboroshii pod 是坑定有的,吃满不至于,我们一般是控制实际使用率在 40%以内,突然的情况下会到 60% |
![]() | 10 Aoang 2023-01-18 21:24:25 +08:00 via iPhone 要压榨单机性能最好就别用 k8s (: 个人实践,丢在 k8s 上的东西都是无状态的应用,开了自动扩缩容其他的就不需要操心了。 对于有状态或者需要压榨单机性能的,例如数据库都不在 k8s 内。 另,试着升下版本,GOGC 和 GOMEMLIMIT 还能对程序有进一步的提升。 |
11 Dreamacro 2023-01-18 22:47:31 +08:00 via iPad |
12 GopherDaily OP @Aoang 自然,但是资源能节约要节约,成本核算都是 OKR |
13 GopherDaily OP @Dreamacro CI/CD 里面直接注入环境变量也行,可控性更高 |
![]() | 14 hopingtop 2023-01-19 09:39:27 +08:00 针对 Docker 运行 Go 确实有取宿主机的 CPU 来设置 MAXPROCS. 当使用 Pod 限制资源的配置时,就不建议手动去调整 MAXPROCS , 这样做不好运维,所以可以选择 Uber 的一个库 |
![]() | 15 hopingtop 2023-01-19 09:43:21 +08:00 @hopingtop https://github.com/uber-go/automaxprocs 这库的原理就是取读取 容器里 /sys/fs/cgroup/cpu 里面的值,然后计算出一个合理的 MAXPROCS 在你 main 函数执行之前通过 import 这个过程去初始化 MAXPROCS |
16 GopherDaily OP @hopingtop 你是站在业务开发的角度来看 |
![]() | 17 liuxu 2023-01-19 12:07:03 +08:00 嗯,k8s 里面进程数是要手动设置下,除非单 pod ,不然 pod 自动扩展物理机进程数 X^n 上升 物理机和 k8s 还是有很多细微的差别要处理 |
18 GopherDaily OP @liuxu 一直还没去关注,k8s/vm 分配 cpu 时间片的时候会不会主动尽量将单个 pod 聚集到某个 物理 c 上 |
![]() | 19 liuxu 2023-01-19 14:24:47 +08:00 @GopherDaily 物理 C 是物理 node 还是物理 cpu core ,前者可以用 statefulset 、node selector 和 affility 处理,后者 k8s 没有这个能力也不应该有这个能力 |
20 GopherDaily OP @liuxu 真实的、物理的 CPU 情理上我也觉得 k8s 没有这个能力,但是 resources limit 也在 pod spec 中,所以可能还是可以揣测下 |
![]() | 21 eudore 2023-01-22 23:34:39 +08:00 没配置对,uber 有个库就可以根据 limit 去设置 maxprocs ,jvm 也有相识的内置参数。 |
22 paceewang1 2023-02-09 09:50:35 +08:00 op 这用的是什么监控呢? |
23 GopherDaily OP @paceewang1 prometheus+grafana |