100% cpu 使用配置文件输出,根据我们的配置文件日志,这可能是啥原因造成的?
Posted
技术标签:
【中文标题】100% cpu 使用配置文件输出,根据我们的配置文件日志,这可能是啥原因造成的?【英文标题】:100% cpu usage profile output, what could cause this based on our profile log?100% cpu 使用配置文件输出,根据我们的配置文件日志,这可能是什么原因造成的? 【发布时间】:2019-06-27 20:30:27 【问题描述】:我们有一个大规模的 nodejs 项目(大约 100 万+用户),它突然对我们的 CPU 造成了巨大的冲击。 (Epyc 24c 2ghz)
我们一直在尝试使用分析器来调试正在使用我们所有 CPU 的东西,(我可以在下面向您展示输出)并且无论它是什么,它的行为都非常奇怪。
我们有一个产生 48 个集群的主进程,在它们全部加载后,cpu 使用率慢慢增长到最大值。杀死一个集群后,洛杉矶根本没有下降。但是在杀死主进程后,一切都恢复正常了。
主进程显然没有最大化所有线程,杀死一个集群真的可以解决问题吗?
我们甚至完全停止了应用程序和集群的用户输入,它根本没有减少 CPU 使用率。
如果您需要,我们可以发送大量日志文件。
【问题讨论】:
【参考方案1】:根据配置文件,代码似乎花费大量时间从系统获取当前时间。你可能有Date.now()
(或老派,效率极低的+new Date()
)围绕一堆常用的、相对快速的操作调用?尝试删除这些,您应该会看到加速(或 CPU 利用率分别下降)。
至于停止用户输入而不减少 CPU 负载:您可能会安排回调吗?或承诺,或其他异步请求?编写一个只需要启动然后让 CPU 永远忙于自己的程序并不难。
除了这些粗略的猜测之外,这里没有足够的信息来深入挖掘。个人资料上除了与时间相关的内容之外还有其他内容吗?特别是您自己的任何代码?自下而上的简介说明了什么?
【讨论】:
初始配置文件是使用 node-tick-processor 获取的,但是当我们使用 node 的内置 --prof-process 功能重新分析配置文件时,大部分情况都指向 epoll_pwait 占用滴答声。这是一个完整的报告:aeth.dev/AWb 我们确实有一些事件侦听器回调和 setIntervals,但我们取消注册这些回调并清除了间隔。我们相当肯定该进程几乎完全空闲(我们仍然有运行时执行的连接)。 AFAIKepoll_pwait
表示进程正在等待某些东西(例如文件系统或网络)。从自下而上的配置文件中,您可以看到 /home/melmsie/dank-memer/node_modules/eris-sharder/node_modules/eris/lib/gateway/Shard.js:211:12
中的函数 wsEvent
非常繁忙——也许这有助于缩小范围?以上是关于100% cpu 使用配置文件输出,根据我们的配置文件日志,这可能是啥原因造成的?的主要内容,如果未能解决你的问题,请参考以下文章
Node API 占用 100% CPU,node-tick-processor 输出看起来很神秘