我需要每15秒左右获取大约200个传感器的值。要获取值,我只需要使用基本身份验证进行HTTP调用并解析响应。问题是这些传感器的连接速度可能很慢,因此我需要至少等待5秒钟才能使用一个传感器(但通常它们的响应速度要快得多,但总有一些速度慢且超时)。 所以现在我有以下设置:
有一个NodeJS进程连接到我的数据库,并且了解所有有关传感器的信息。它会定期检查是否有新的或删除的。它为每个传感器生成一个子进程,如果该子进程死了,它将重新启动它。如果删除传感器,它也会杀死它。子进程使用5秒的超时值对其传感器进行HTTP调用,如果接收到该值,则将其保存到Redis。而且它处于15秒钟setTimeout的无限循环中。第三步将所有值从Redis复制到主MySQL数据库。 所以这已经是半年的工作解决方案,但是在进行了重大的系统升级(从Ubuntu 14.04到18.04,因此每个软件包都进行了升级)之后,它似乎泄漏了一些内存,而且我似乎无法弄清楚哪里。 开始后,汇总的过程大约需要1.5GB的内存。但是经过一天左右的时间,它会达到3GB,依此类推,在内存耗尽之前,我需要终止所有节点进程并重新启动整个过程。
所以现在我试图找出更有效的方法来实现相同的结果(每15秒查询2-300个URL并将结果存储在MySQL中)。目前,我正在考虑放弃Redis,子进程将与其主进程进行通信,并且主进程将直接写入MySQL。这样,我不需要将Redis库加载到每个子进程中,这可以节省一些时间。 因此,我需要有关如何减少该应用程序的内存使用的想法(主要由于我的知识,我仅限于PHP和NodeJS,因此编写本机守护程序可能是不可能的)
谢谢!
答案 0 :(得分:0)
解决方案比我想象的要容易。我不得不将子进程重写为本地bash脚本,这将内存使用率降低到几乎为零。