探讨Go环境变量-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参数的值来进一步对性能和资源占用进行有效的权衡呢?
GOMAXPROCS调整
核心思想:根据场景需求差异,动态差异化调整GOMAXPROCS参数来权衡资源占用与系统并发性能。
通过搜索一些文档发现,在CPU-bound场景中,适当地增加GOMAXPROCS的值可以提升性能,例如计算素数;另外在一些依赖性比较强的场景中,增加GOMAXPROCS的值反而会降低程序性能,例如互斥锁竞争场景。因此需要根据特定场景需求,最好细化到每个模块对于性能的需求差异,从而设置对应的GOMAXPROCS的值。
最直观的思路是为对性能敏感的模块适当增加GOMAXPROCS值来提升并发性能,为对性能不是十分敏感的模块适当减少GOMAXPROCS值来降低资源占用。
- 点赞
- 收藏
- 关注作者
评论(0)