如何解决调整gRPC线程池
我正在处理一台运行时间长达一分钟的旧式同步服务器,并公开了3个端口来克服此问题。有“轻请求”端口,“重但重要”请求端口和“重”端口。
它们都公开相同的服务,但是由于它们在单独的端口上运行,因此它们最终具有专用的线程池。
现在,这种方法在负载平衡方面遇到了问题,因为Envoy无法处理单个服务,因此无法在3个不同的端口上公开相同的协议。
我试图提出一个可行的单一线程池配置(可能是一个过度配置的配置),但是我找不到任何有关线程池设置实际作用的文档。
NUM_CQS
Number of completion queues.
MIN_POLLERS
Minimum number of polling threads.
MAX_POLLERS
Maximum number of polling threads.
CQ_TIMEOUT_MSEC
Completion queue timeout in milliseconds.
解决方法
您是否出于某些原因需要将请求分为三个不同的线程池?默认情况下,对请求处理程序线程的数量没有限制。同步服务器将为每个请求生成一个新线程,因此线程数将由并发请求数决定-唯一的实际限制是服务器计算机可以处理的数量。 (如果您实际上想限制线程数,我认为您可以通过ResourceQuota::SetMaxThreads()
来限制,尽管这是一个全局限制,而不是每个请求类别一个。)
请注意,请求处理程序线程与通过MIN_POLLERS
和MAX_POLLERS
设置的轮询线程的数量无关,因此这些设置可能与此处无关。
更新:实际上,我只是了解到,尽管上面的描述在实际意义上是正确的,但其中的一些内部细节是错误的。实际上,轮询和请求处理程序只有一个线程池。当请求进入时,现有的轮询线程基本上成为请求处理程序线程,而当请求处理程序完成时,该线程可再次用作轮询线程。 MIN_POLLERS
和MAX_POLLERS
选项允许调整用于轮询的线程数:当轮询线程成为请求处理程序线程时,如果没有足够的轮询线程,将产生一个新的轮询线程。 ,当请求处理程序完成时,如果轮询线程过多,则该线程将终止。但是,这都不影响用于请求处理程序的线程数-默认情况下仍不受限制。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。