我是否需要生成多个Go Web服务器实例以充分利用我的CPU?

时间:2018-02-22 23:50:24

标签: go go-gin

我不确定如何提出这个问题,但根据我对NodeJS的经验,NodeJS有一个线程和一个进程队列来管理异步函数,你需要在每个单独的进程上运行一个Web服务器实例CPU线程 - 然后在每个实例之间进行负载平衡。

最终可以运行相同软件的4个实例,在4个独立端口上提供服务,通过负载均衡器在一个端口上公开。

通常,您可以使用PM2之类的服务来管理此过程。

从我的(基本)理解来看,goroutines不是线程所以我的自然思维想知道这是否意味着Go需要以相同的方式运行,多个进程跨越每个CPU线程。

是这样的吗?或者,如果我使用像Gin之类的东西编写REST API,那么随着需求的增加,Go会自动扩展到CPU线程吗?

1 个答案:

答案 0 :(得分:4)

几乎每个Go网络服务器都基于net/http,并在http.Server上调用(最终)http.ListenAndServe()。 (在杜松子酒中,router.Run()包含了这个内容。)http.Server的文档解释了它:

  

调用Serve来处理传入连接上的请求。

http.Serve()完成了接受连接的真正工作,

  

为每个人创建一个新的服务goroutine。

Goroutines比OS线程更轻;每个线程可以运行很多goroutine。那么,您的应用可能会服务数十个(或数百个或更多?) 单个进程的同时连接。

默认情况下,Go将使用所有可用的处理器内核;如果您迫切需要使用所有处理器核心,则可以设置GOMAXPROCS environment variable

  

GOMAXPROCS变量限制了可以同时执行用户级Go代码的操作系统线程数。代表Go代码在系统调用中可以阻塞的线程数没有限制;那些不计入GOMAXPROCS限制。该软件包的GOMAXPROCS函数查询并更改限制。

因此,您不需要像PM2或主管那样混乱奇怪的流程管理员;你可以从普通的systemd单元启动你的服务器,或者在Docker容器中作为PID 1启动你的服务器,并享受(但收获你的孩子)。