我正在运行一个以 Starman (v0.4014) 和 ngynx 作为前端代理的 Dancer (v1.3202) 应用程序。我注意到负载均衡器每隔几个小时就会出现一个巨大的延迟峰值,我想知道是否是工作人员达到了他们的请求限制并重新启动。延迟从平均 30 毫秒到 1000 毫秒或更多。我检查了 MongoDB,没有长时间运行的查询。--max-requests 实际上对工人做了什么,当工人达到这个限制时会发生什么?
1 回答
设置有什么作用--max-requests
?
来自starman --help
:
--max-requests 每个工作进程要处理的请求数。默认为 1000。
这意味着每个工作人员在处理了这么多请求后都会退出。然后主进程将为每个退出的工作人员启动一个全新的工作人员,并根据--workers
设置保持工作人员的数量。
使用--max-requests
通常是一件好事,特别是如果您的应用程序不是唯一在盒子上运行的东西,因为perl
(众所周知)不会返还它使用的内存。这种工作进程的回收是starman
可以将内存返回给其他进程使用的方式。如果您的应用程序确实泄漏了内存,这也可以帮助您的应用程序以良好的性能运行,而不是您的应用程序最终会消耗所有内存并需要被操作系统杀死。
设置的最佳值是--max-requests
多少?
1,000
除非您有充分的理由更改它,否则您应该将其保留为默认值。如果你的应用程序是唯一在盒子上运行的东西,并且你确定它没有泄漏,你可以尝试使用更高的值来减少回收工人的频率。如果您知道您的应用程序存在漏洞,您可能希望使用较低的值来更频繁地回收工作人员。但是,通常此设置实际上对性能的影响应该很小。
也就是说,如果您的工作人员将内容缓存在内存中,回收工作人员可能会导致虚假的缓慢请求,因为新工作人员需要花费一些时间重建这些缓存,但可能还有许多其他可能的解释。您需要进行一些分析,以找出真正导致您所看到的特定缓慢的原因。