探讨Go环境变量-GOMAXPROCS

举报
小表弟 发表于 2020/02/24 18:45:46 2020/02/24
【摘要】 介绍GOMAXPROCS环境变量,并探讨其影响和设置方法

GOMAXPROCS介绍

Go语言的runtime包提供了很多操作来对接Go程序的实时运行系统,其中也包含很多环境变量来对Go程序运行环境加以约束,runtime包见链接Package runtime

其中有一个环境变量对Go程序的性能和资源占用影响十分明显 - GOMAXPROCS。

官网上对GOMAXPROCS的介绍如下:

The GOMAXPROCS variable limits the number of operating system threads that can execute user-level Go code simultaneously. There is no limit to the number of threads that can be blocked in system calls on behalf of Go code; those do not count against the GOMAXPROCS limit. This package's GOMAXPROCS function queries and changes the limit.

大意就是GOMAXPROCS参数限制了Go程序在用户态可执行的线程数目,那么怎么来限制呢?为Go程序设置可用的逻辑CPU数目,即GOMAXPROCS的值!

在Go 1.5版本之前,GOMAXPROCS参数的值默认是1,即Go程序最多只能使用一个逻辑CPU来执行并发操作;随着硬件的发展以及对程序性能的需求,从Go 1.5版本开始,GOMAXPROCS参数的默认值是机器全部CPU的数目,即默认Go程序使用系统所有CPU资源进行并发;随着GOMAXPROCS参数的增加,进程数目也相应的增加,因此并发性能越好。

GOMAXPROCS影响

通过对GOMAXPROCS进行修改可以调整程序可用逻辑CPU数目,从而调整线程数目和程序并发性能。例如增加GOMAXPROCS参数,进程数目增加,并发访问性能提升,但是线程数目的增加必然引起对CPU资源和内存资源的需求增加,从而增加程序对CPU和内存资源的占用;而减少GOMAXPROCS参数,则可以降低程序并发度,但是随着线程数目的减少,程序的并发性能也进一步受限。因此GOMAXPROCS参数对程序并发性能和资源占用两者的影响都比较大,那么如何调整GOMAXPROCS参数的值来进一步对性能和资源占用进行有效的权衡呢?


image.png


GOMAXPROCS调整

核心思想:根据场景需求差异,动态差异化调整GOMAXPROCS参数来权衡资源占用与系统并发性能。

通过搜索一些文档发现,在CPU-bound场景中,适当地增加GOMAXPROCS的值可以提升性能,例如计算素数;另外在一些依赖性比较强的场景中,增加GOMAXPROCS的值反而会降低程序性能,例如互斥锁竞争场景。因此需要根据特定场景需求,最好细化到每个模块对于性能的需求差异,从而设置对应的GOMAXPROCS的值。

最直观的思路是为对性能敏感的模块适当增加GOMAXPROCS值来提升并发性能,为对性能不是十分敏感的模块适当减少GOMAXPROCS值来降低资源占用

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。