Go gomaxprocs 调高引起调度性能损耗

本文讨论了Go语言中golang runtime的gomaxprocs设置过高可能带来的调度性能损耗,特别是在docker环境下。内容涉及Go的并发模型,处理器数量与CPU核心的关系,以及在docker中如何正确校对gomaxprocs以避免问题。增加processor数量可能导致findrunnable时的损耗和上下文切换增加,影响性能。解决方案包括设置合适的cpu限制环境变量或使用自动化库进行校对。建议通常保持gomaxprocs为CPU核心数即可。
摘要由CSDN通过智能技术生成

先前在社区里分享了关于 golang 行情推送[1]的分享,有人针对 ppt 的内容问了我两个问题,一个是在 docker 下 golang 的 gomaxprocs 初始化混乱问题,另一个是 golang runtime.gomaxprocs 配置多少为合适?

golang runtime

Golang 的 runtime 调度是依赖 pmg 的角色抽象,p 为逻辑处理器,m 为执行体(线程),g 为协程。p 的 runq 队列中放着可执行的 goroutine 结构。golang 默认 p 的数量为 cpu core 数目,比如物理核心为 8 cpu core,那么 go processor 的数量就为 8。另外,同一时间一个 p 只能绑定一个 m 线程,pm 绑定后自然就找 g 和运行 g。

那么增加 processor 的数量,是否可以用来加大 runtime 对于协程的调度吞吐?

大多 golang 的项目偏重网络 io,network io 在 netpoll 设计下都是非阻塞的,所涉及到的 syscall 不会阻塞。如果是 cpu 密集的业务,增加多个 processor 也没用,毕竟 cpu 计算资源就这些,居然还想着来回的切换????? 所以,多数场景下单纯增加 processor 是没什么用的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值