GOMAXPROCS 是 Go 提供的非常重要的一个环境变量。通过设定 GOMAXPROCS,用户可以调整调度器中 Processor(简称P)的数量。由于每个系统线程必须要绑定 P ,P 才能把 G 交给 M 执行。如下图所示

所以 P 的数量会很大程度上影响 Go Runtime 的并发表现。GOMAXPROCS 在 Go 1.5 版本后的默认值是机器的 CPU 核数 (runtime.NumCPU)。通过下面的代码片段可以获取当前机器的核心数和给 GOMAXPROCS 设置的值。

package mainimport ("fmt""runtime"
)func getGOMAXPROCS() int {_ :=  runtime.NumCPU() // 获取机器的CPU核心数return runtime.GOMAXPROCS(0) // 参数为零时用于获取给GOMAXPROCS设置的值
}func main() {fmt.Printf("GOMAXPROCS: %d\n", getGOMAXPROCS())
}

而以 Docker 为代表的容器虚拟化技术,会通过 cgroup 等技术对 CPU 资源进行隔离。以 Kubernetes 为代表的基于容器虚拟化实现的资源管理系统,也支持这样的特性,比如下面这个 PodTemplate 的容器的定义里 limits.cpu = 1000m 就代表给这个容器分配1个核心的使用时间。

这类技术对 CPU 的隔离限制,导致 runtime.NumCPU() 无法正确获取到容器被分配的 CPU 资源数。runtime.NumCPU()获取的是宿主机的核心数。

设置 GOMAXPROCS 高于真正可使用的核心数后会导致Go调度器不停地进行OS线程切换,从而给调度器增加很多不必要的工作。

目前 Go 官方并无好的方式来规避在容器里获取不到真正可使用的核心数这一问题,而 Uber 提出了一种 Workaround 方法,利用  uber-go/automaxprocs 这一个包,可以在运行时根据 cgroup 为容器分配的CPU资源限制数来修改 GOMAXPROCS。

import _ "go.uber.org/automaxprocs"func main() {// Your application logic here.
}

参考资料:

https://gaocegege.com/Blog/maxprocs-cpu

https://stackoverflow.com/questions/36492356/parallel-programming-in-go-using-gomaxprocs/36492517#36492517

GMP调度器

在容器里设置GOMAXPROCS的正确姿势相关推荐

  1. Loki告警的正确姿势

    小白之前有通过Grafana设置Loki数据源的骚操作来做日志告警,虽然能直接在Grafana面板上配置告警,当它们还是没办法集中维护和管理.小白前面介绍了那么多关于Loki的文章,那么它有没有像Pr ...

  2. 若依 vue前端 动态设置路由path不同参数 在页面容器里打开新页面(新路由),面包屑和标签页标题根据参数动态改变,面包屑多级标题,侧边栏对应菜单亮起

    前言 因为是在vue源码的基础上进行修改,所以,就没有复制代码在文章上,采取的是截图对比源码和我修改的代码片段.要麻烦你们自己手敲了. 先来看看效果: 场景:在费用配置列表中,点击每一项的配置,都会在 ...

  3. 老司机实战Windows Server Docker:2 docker化现有iis应用的正确姿势

    前言 上一篇老司机实战Windows Server Docker:1 初体验之各种填坑介绍了安装docker服务过程中的一些小坑.这一篇,我们来填一些稍大一些的坑:如何docker化一个现有的iis应 ...

  4. 再见虚拟机!聊聊 PC 端运行 Docker 的正确姿势!

    点击上方"AirPython",选择"加为星标" 第一时间关注 Python 原创干货! 1. 前言 大家好,我是安果! 在相当长的一段时间里,PC 端要使用 ...

  5. 如何自学python数据分析-良心整理!学习Python数据分析的正确姿势

    学习 Python 数据分析的正确姿势 如果你是通过学习给程序员设计的 Python 课程来学习 Python 数据分析,那就大错特错了.很多数据分析师在开始学习 Python 数据分析之前就被引导学 ...

  6. 开发函数计算的正确姿势——轻松解决大依赖部署

    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算 ...

  7. 使用代码片段的正确姿势,打造高效的vscode开发环境

    全文3928字,阅读时间 10分钟,未来节约时间 15分钟/每天 代码片段(code snippet) 相信大家都或多或少有接触过. 在完成一个项目以后,往往都会写出许多有价值的代码,或是绞尽脑汁解决 ...

  8. word图片嵌入式为何只能看到一部分_Word排版的正确姿势!(Word论文排版教学)...

    Hello,最近正值着手写毕业论文的初期,趁着这个时间点,我做了一个简易的,简单的,0基础的Word论文排版教学,帮助你在撰写论文的时候不再花费大量的时间浪费在调整格式里. 初次做视频,难免有错误,欢 ...

  9. 这样才是代码管理和 Commit 的正确姿势 | 研发效能提升36计

    简介:效能提升从小习惯开始,这样才是代码管理和 Commit 的正确姿势! 专栏策划|雅纯 志愿编辑|张晟 软件交付是以代码为中心的交付过程,其中代码的作用有几点:第一,最终的制品要交付成什么样,需要 ...

最新文章

  1. Windows 64位机上C/C++代码静态检查工具Logiscope RuleChecker的安装和使用
  2. ubuntu中解决无法调节屏幕亮度的问题
  3. 删除microsoft_如何从您的Microsoft帐户中删除设备
  4. [react] React中怎么检验props?
  5. 原型对象prototype与继承
  6. 移植UE4的Spline与SplineMesh组件到Unity5
  7. 操作系统中进程的同步、互斥、通信的区别,进程与线程同步知识
  8. 高通三频802.11ac平台:家庭WiFi新体验?
  9. wincemobile的GPS开发
  10. 整人网页html语言网站,html愚人节整人一直弹的网页窗口怎么做?
  11. 单链表学生管理系统(0723-林雪阵)
  12. ipv4 pxe 联想start_start pxe over ipv4 和start pxe over ipv6 开机出现问题
  13. 山重水复疑无路,柳暗花明又一村。---找工作感想
  14. 国耀明医院互联网医院:儿童医保门诊不报销???你错啦!
  15. Oracle数据库中,deprecate和desupport的区别,以及Oracle 12.2中的deprecate 的参数
  16. 菜鸟的数学建模之路(三):线性与非线性拟合
  17. Photoshop CS6 实例之用快速选择工具扣取美女
  18. 7-20 | 打印九九口诀表
  19. React.js学习(一):设计并实现一个“任务清单列表”
  20. 走进JavaWeb技术世界7:Tomcat和其他WEB容器的区别

热门文章

  1. [洛谷P3521][POI2011]ROT-Tree Rotations
  2. language support图标在哪里?怎么消失了?
  3. 艾媒:ofo活跃用户规模为摩拜近2倍 每10辆共享单车7辆小黄车
  4. Verizon部署美国最大小型基站系统
  5. BCGSoft Demo示例展示:对话框示例
  6. LNMT/LAMT实现动静分离、负载均衡和会话保持
  7. Linux apache编译安装
  8. Calypso - Android和Evolution下的CalDAV/CardDAV/Web...
  9. MPLS/×××江湖恩仇录笔记
  10. 一篇文章入门Flask