前段时间给后端几个服务配证书,试着用了一下 Cert-Manager 项目。Github 几千 Star 的项目使用起来的确很方便,秒配域名免费证书。但是,运行了三天,机器CPU报警:

赶紧去项目 issues 里搜,果真遇到类似不止我一个, 问题竟然没修复,直接流汗了。不过还好,第二天这个问题就修复了。这里贴一下修复者的代码:

从修复的代码不难看出Cert-Manager项目CPU泄露的原因,就是因为在循环中,不停的创建新的计时器,而每个计时器都会开启内部协程。再看看计时器的函数的官方注释:

// Tick is a convenience wrapper for NewTicker providing access to the ticking// channel only. While Tick is useful for clients that have no need to shut down// the Ticker, be aware that without a way to shut it down the underlying// Ticker cannot be recovered by the garbage collector; it "leaks".// Unlike NewTicker, Tick will return nil if d <= 0.func Tick(d Duration) chan Time {    if d <= 0 {       return nil    }    return NewTicker(d).C}

官方直接说了,需要谨慎使用,会有泄漏风险。不过很少有人会真正关注这一段注释的。CPU 资源为什么会发生泄露,直接原因通常都是:在一个“死循环”里,不停开启永不关闭的协程或线程。

用代码解释就是这样:

for {go never_die()}

当然没人会真正写出这样的代码,但是如果程序CPU泄露了,其本质是这样。同样计时器的另一个函数time.After存在类似误用的风险。

如何真正的规避资源泄露的问题呢?

除了对第三方库的实现有必要的了解以外,真正解决的办法还是:技术问题技术解决。那就是可以通过程序性能调试工具 go tool pprof 辅助调试,网上参考资料非常多,不赘述了。

判断资源泄露通常可以通过一定时间运行或大量模拟请求监测程序资源的使用情况,是否发生图示情况:线性增长。如果类似情形一直得不到缓解的话就可以判定程序发生了资源泄露。

为了尽量保证文字的正确性,专门去官方Go语言项目上查了下,计时器问题貌似一直是一个问题,看评论说是会在1.14中更新,拭目以待吧。

https://github.com/golang/go/issues/27707

鉴于文章篇幅过短,加个彩蛋:

在 Mac 系统上如何从容器内部访问本机网络?

如果你第一反应是,修改 Docker 容器启动时的网络模式,可能要失望了。因为在 Mac 系统上 Docker 的运行方式是在虚拟机上运行的。所以即使采用 --net host 模式,你也无法访问 Mac 系统本身的网络,访问只是 Docker 服务运行的虚拟机网络。

谜底就是:host.docker.internal, 在 Mac OS/Windows 系统上可以通过该 hostname 的方式直接访问本机网络。

推荐阅读

  • 利用 CPU cache 特性优化 Go 程序

  • 用图说话:Go语言的协程,系统线程以及CPU管理


喜欢本文的朋友,欢迎关注“Go语言中文网”:

Go语言中文网启用微信学习交流群,欢迎加微信:274768166

go 判断是否域名_Go编程:对不起,你的 CPU 泄露了相关推荐

  1. 我有一个方法判断你有没有编程天赋

    我有一个方法判断你有没有编程天赋 一 前言 基于知识的诅咒的原理 做一个敲击者很难.问题在于敲击者已拥有的知识(歌曲题目)让 他们想象不到缺乏这种知识会是什么情形.当他们敲击的时候,他 们不能想象听众 ...

  2. js 判断是域名还是ip并获取当前url中指定部分

    **一.判断是域名还是ip checkdomain=()=>{//验证是否是域名let doname = /^([\w-]+\.)+((com)|(net)|(org)|(gov\.cn)|(i ...

  3. php 判断是否是域名,用PHP判断顶级域名

    在写电商圈排名系统时,其中一个重要的想法就是要判断顶级 二级域名:q.eb.cn 内页:http://yun.im/yunseo/621.html 其它等等. 而在统计排名时,只计算顶级域名的.其它非 ...

  4. CUDA编程: GPU与CPU之间使用全局统一内存的完整代码及编译

    CUDA编程: GPU与CPU之间使用全局统一内存的完整代码及编译 最近碰到一个应用场景,需要从GPU访问host上创建的,一个很大的布隆过滤器(准确说是改进后的布谷鸟过滤器).由于GPU卡上的显存有 ...

  5. java输入星期几的字母_输入字母判断星期几java编程答案

    你知道如何用java编程来实现输入第一个字母判断星期几吗?下面的编程题目就是解决的这个问题,一起来具体的看一下题目和答案吧. 一.题目 请输入星期几的第一个字母,来判断一下是星期几. 假如,第一个字母 ...

  6. shell 判断字符串相等_编程小短文:Bash子字符串还在用==?试试=~性能瞬间飙升100倍...

    引言 Bash 是 Linux 系统下钦定的 shell.你可以通过 cat /etc/shells 查看当前系统支持的 shell 种类. Bash 不但是系统管理员与内核交互的利器,且是一种语言, ...

  7. java判断所有域名后缀_使用Java的IO操作,提取全世界所有的三位域名后缀

    一.  前言 最近又想注册域名,便从TLD List 中下载了已经收录的全世界所有的域名后缀,然后使用Java的IO相关操作,将所有的三位域名后缀提取了出来.先给出下载文件: 所有域名后缀 二.  代 ...

  8. 如何判断是否适合学编程?

    能问出这个问题的人,肯定是心里有点想学习编程,但是又担心自己不适合学习编程,学不会反而浪费时间,那么,如何判断自己是否适合学习编程呢?可以从如下几个方面入手: 1.明确自己为什么要学编程,因为不同的编 ...

  9. 不要使用PeekChar()判断EOF_.net framework编程

    这两天使用.net framework编程,其中有个任务是将一个二进制文件格式转换成mpeg4码流的媒体文件.其中需要使用System.IO.BinaryReader类,按照MSDN和我自己使用的SD ...

最新文章

  1. TF-A代码阅读: 双系统切换时是如何保存寄存器的(cpu_context介绍)
  2. 深入分析JVM逃逸分析对性能的影响
  3. sony z2 android 5.0,索尼Xperia Z2 5.0 root教程_索尼Z2获取5.0系统的root
  4. java常用类需要记吗_java 常用类
  5. 上项线体表位置_体表定位
  6. (转)Openlayers 2.X加载天地图
  7. 使用 python 处理 nc 数据
  8. 2008服务器网站设置密码,win2008服务器设置密码
  9. yuv转opencv中的IplImage
  10. Windows下用C语言连接Mysql注意问题
  11. 视频直播产业的下半场,谁会走谁会留?
  12. 线程中常用的锁,有哪几种?
  13. macOS 安装 brew步骤
  14. php之Twitter第三方登录
  15. CocosCreator之Spine系列(一):spine动画回调
  16. CAJViewer显示乱码的解决方法
  17. 界面(1):对话框和菜单 打印和按钮等杂项
  18. Spring Boot 注解原理
  19. 你的年终总结写了吗?先和百格活动一起康康这些参考总结吧!
  20. R语言计算logistic回归C指数,最详细的基于R语言的Logistic Regression(Logistic回归)源码,包括拟合优度,Recall,Precision的计算...

热门文章

  1. android关于window
  2. 更新导致Svchost CPU100%(转)
  3. 130. 被围绕的区域
  4. redis的IM的聊天工具
  5. 9-5 一致性哈希分区
  6. linux rsync 目录同步,linux下使用rsync同步目录
  7. 集成产品开发(IPD)初探
  8. php语法基础考试,我的php学习第二十六天——PHP基础语法
  9. MaxCompute 图计算用户手册(下)
  10. 《机器学习实战》KNN算法实现