问题描述
我创建了一个nodejs服务器应用程序,该应用程序使用了ssh2,child_process,puppeteer,ws,sqlite等一些模块,当该应用程序运行时,我看到一个带有消息+的“ dbus-daemon”进程,使用户的cpu使用率呈对数增长在几天到100%的时间内使整个服务器无响应。
有人知道为什么nodejs会使用此过程吗?
在应用程序中,我生成了一些子进程,这些子进程通过function reducer(state,action) {
switch (action.type) {
case "DIRECTION_CHANGE":
return { ...state,direction: action.payload };
default:
return state;
}
}
export default function Page({ direction }) {
const [state,dispatch] = useReducer(reducer,{ direction });
useEffect(() => {
dispatch({ type: "DIRECTION_CHANGE",payload: direction });
},[direction]);
return (
<div>
<input type="text" />
{JSON.stringify(state)}
</div>
);
}
事件相互通信。那可能是原因吗?因为dbus显然是一个消息传递系统
我的应用程序本身并不占用cpu,因为我正在使用PM2对其进行监视,并且它始终低于5%。但是由于某种原因,它使dbus消耗了cpu
解决方法
正如Ouroborus在问题注释中所述,dbus用于进程间通信。您最初的想法是应用程序中的某些东西正在激发这些可能性。在干净的linux环境(例如轻量级专用容器)中运行将排除源于系统;即系统范围的dbus守护程序实例。离开您的应用及其依赖项进行调查。
根据您使用的Linux环境,您可以监视dbus进程-但是从您的问题来看,我知道您已经检查过。如果那仅指向您的应用程序,那么我可以肯定您的依赖项/程序包之一引起了该问题。我遇到了类似的问题,由于我使用的是较旧的程序包(无法检查现有实例),因此一次又一次自动启动系统守护程序。
尝试更新您的所有程序包/依赖项,或者临时批量删除它们以查找造成麻烦的人。
有一个小的更改,您还可以通过指定DBUS_SESSION_BUS_ADDRESS
variabele(快速查找有关环境的方法)来解决该问题。如果未设置此变量,则进程可能会尝试使用dbus-launch
选项调用--autolaunch
来启动新的会话总线。而且,如果它继续跟踪开放会话总线,它将继续推出新的总线。