在云原生时代,Go语言由于在部署时只需要一个二进制文件就能够运行起来而备受青睐。但有一个细节问题,如果不妥善处理,则很可能导致Go程序出现明显的性能下降和延迟。

1 问题描述

在Go语言中,Go scheduler的P数量非常重要,因为它会极大地影响Go在运行时的表现。在目前的Go语言中,P的数量默认是系统的CPU核数。在容器化的环境中,Go程序所获取的CPU核数是错误的,它所获取的是宿主机的CPU核数。即使容器和宿主机的CPU核数是共享的,但在集群中我们会针对每个Pod分配指定的核数,因此实际上我们需要的是Pod的核数,而不是宿主机的CPU核数。

2 会造成什么后果

前文曾提到Go的M: N调度模型,其要求M必须与P进行绑定,然后才能不断地在M上循环寻找可运行的G来执行相应的任务。注意,M必须与P进行绑定,其绑定的这个P,要求必须是空闲状态。但在容器化的部署环境中,P的数量由于被“错误”设置,因此拥有大量空闲的P。可以这样理解,只要有足够多的M,那么P就可以都被绑定。这时又产生了另外一个问题,M的数量是否会不断增加呢?答案是会的。在程序运行过程中,由于产生了网络I/O阻塞,导致M会随着程序的不断执行而不断增加,,即能够达到前面假设的情况。最终导致Go程序的延迟加大,程序响应缓慢。

3 解决方法

产生这个问题的本质原因是Go程序没有正确地获得我们所期望的CPU核数(应当获取具体分配给Pod的配额),因此解决方案有两种:

  • 结合部署情况,主动设置正确的GOMAXPROCS核数。

  • 通过cgroup信息,读取容器内的正确GOMAXPROCS核数。

目前,Go尚没有非常完美的办法来解决这个问题,因此这里推荐使用Uber公司推出的uber-go/automaxprocs开源库,它会在Go程序运行时根据cgroup的挂载信息来修改 GOMAXPROCS核数,并基于一定规则选择一个最合适的数值。使用方式如下:

import _ "go.uber.org/automaxprocs"

我们只需在Go程序启动时进行引用即可,如果有特殊的需求,那么主动设置GOMAXPROCS也是可以的。本文授权转载于:《Go语言编程之旅:一起用Go做项目》

关于本书

《Go语言编程之旅:一起用Go做项目》

陈剑煜 徐新华 著

  • 包含5个大的Go项目实践及重点源码分析

  • 针对Go语言的分析工具及常见问题进行了全面讲解

本书对项目开发、细节分析、运行时分析等核心内容进行了较为深入的剖析,提供了相对完整的项目实践经验。在项目迭代过程中,难免会遇到问题,因此本书针对Go语言的大杀器(分析工具)及常见问题进行了全面讲解,帮助读者对各类问题进行排查。

(扫码了解本书详情)


更多科技资讯请见微信公众号:博文视点Broadview(微信号:bvbooks)

Go在容器运行时要注意的细节相关推荐

  1. 课时 30:理解 RuntimeClass 与使用多容器运行时(贾之光)

    本文将主要分享以下三方面的内容: RuntimeClass 需求来源 RuntimeClass 功能介绍 多容器运行时示例 RuntimeClass 需求来源 容器运行时的演进过程 我们首先了解一下容 ...

  2. 课时 28:理解容器运行时接口 CRI(知谨)

    CRI 是 Kubernetes 体系中跟容器打交道的一个非常重要的部分.本文将主要分享以下三方面的内容: CRI 介绍 CRI 实现 相关工具 CRI 介绍 在 CRI 出现之前(也就是 Kuber ...

  3. 从零开始入门 K8s | 理解容器运行时接口 CRI

    作者 | 知谨 阿里云工程师 本文整理自<CNCF x Alibaba 云原生技术公开课>第 28 讲,点击直达课程页面. 关注"阿里巴巴云原生"公众号,回复关键词** ...

  4. Docker的容器运行时组件Containerd

    不久前,Docker宣布开源他们的容器运行时组件Containerd(发音是container-D).目前的Containerd版本是0.2.4,Docker计划在2017年第二季度基于Open Co ...

  5. 什么是Kubernetes的CRI - 容器运行时接口

    我们都知道Kubernetes不会直接和容器打交道,Kubernetes的使用者能接触到的概念只有pod,而pod里包含了多个容器.当我们在Kubernetes里用kubectl执行各种命令时,Kub ...

  6. Colima:MacOS 上的极简容器运行时和 Kubernetes

    作者 | Addo Zhang 来源 | 云原生指北 Colima 是一个以最小化设置来在MacOS上运行容器运行时和 Kubernetes 的工具.支持 m1,同样也支持 Linux. Colima ...

  7. 关于容器和容器运行时的那些事

    转载本文需注明出处:微信公众号EAWorld,违者必究. 前言: 容器,容器编排,微服务,云原生,这些无疑都是当下软件开发领域里面最热门的术语.容器技术的出现并迅速的广泛应用于软件开发的各个领域里,主 ...

  8. 1.Containerd容器运行时初识与尝试

    0x00 前言简述 1.基础介绍 2.专业术语 3.架构简述 0x01 安装配置 1.Ubuntu安装Containerd.io流程 0x02 简单使用 1.镜像拉取与运行 2.创建和使用网络 3.与 ...

  9. 3.Containerd容器运行时的配置浅析与知识扩充实践

    公众号关注「WeiyiGeek」 设为「特别关注」,每天带你玩转网络安全运维.应用开发.物联网IOT学习! 本章目录: 0x00 Containerd 容器运行时配置指南 如何配置 Container ...

  10. 浅析容器运行时奥秘——OCI标准

    导语 容器技术火起来了以后,Docker的容器镜像和容器运行时已然成为行业的标准.此后,为了推进容器生态的健康发展.在Linux基金会的主导下,Docker和各大云厂商Google, Amazon, ...

最新文章

  1. Error Code: 1175. You are using safe update mode and you tried to ......
  2. 室外声音信标可行性分析
  3. Linux基础(文件权限续篇)
  4. service network restart重启失败_NodeManager 启动失败问题处理
  5. I will have to learn more skills now , now
  6. 5.TCP/IP 详解卷1 ---RARP:逆地址解析协议
  7. hadoop包含哪些技术?
  8. Unity3D 代码优化
  9. foxmail邮箱pop3服务器,Foxmail设置POP3邮箱的操作流程
  10. 苍井空老师的Twitter
  11. 模拟调制解调matlab仿真实验报告,基于MATLAB调制解调仿真
  12. “网红蜥蜴”背后的创业路,他潜心于宠物蜥蜴的研发与产业化_汇新云
  13. python画五角星代码_如何用python画一个五角星_python绘制五角形教程
  14. ORACLE RAC 一节点出现Suspending MMON slave action kewrmrfsa_ for 82800 seconds
  15. 医疗机构如何成功实施CRM?如下几点是关键因素
  16. 上映半个月,微博热搜近10次,长歌行的魅力到底在哪 ?
  17. 计算机组成原理---第二章运算器和运算方法
  18. 2020最新版前端学习路线图--微信小程序制作原来如此简单
  19. 2022河南联赛第(二)场:河南理工大学 ---复盘
  20. 转:技术牛人画技术配图的经验分享

热门文章

  1. java day38【Servlet 、HTTP协议 、Request】
  2. FTP服务器windows配置
  3. 线性代数的本质与几何意义 01. 向量是什么?(3blue1brown 咪博士 图文注解版)
  4. java.toString(),(String),String.valueOf的区别
  5. 在eclipse中使用Github进行单元测试
  6. 对项目和产品中坎坎坷坷的一些感悟
  7. 《java数据结构与算法》系列之“开篇”
  8. 错误提示之:SQL—无法在服务器上访问指定的路径或文件。请确保您具有必需的安全权限且该路径或文件存在。...
  9. 使用ISAPI_Rewrite3规范化目录语法
  10. python学习笔记 day33 ftp大作业(未完成)