我当前的应用程序在数据库中拥有大约5000个网络节点的状态。每个节点应及时更新以提供当前状态。更新过程如下所示:
为此,我正在运行Laravel Horizon,它为我提供了一个基于Redis的简洁作业调度程序。 cron每分钟都会获取所有节点条目,并将每个UpdateNode(id)
任务推送到调度程序。
随着节点数量的增加,我也必须不断增加调度工人。当前,有60个PHP线程仅负责更新节点,以保持分钟更新循环的运行。
这个事实再次导致了一个巨大的资源问题(目前在40美元的DigitalOcean Droplet上有80%的RAM和70%的CPU),这又使我再次遇到了主要问题:
//对于所有对此感兴趣的人都是该项目:https://github.com/nknx-org/nknx-api 我们正在谈论的工作是https://github.com/nknx-org/nknx-api/blob/master/app/Jobs/UpdateNode.php
答案 0 :(得分:1)
如果计划的任务有任何瓶颈,您可以做的一件事就是将分配工作的工作分解为另一个工作。
您可以使记录分成ID块,而不是由单个计划任务负责为工人分配所有5000 UpdateNode
个工作。因此,您的计划任务会将5000条记录分成250个ID的块,并分派20个新的DispatchUpdateNodeJobs($ids)
作业,每个作业包含250个ID的数组。
这些作业进入您的普通队列系统,以供您的工作人员提取,并且每个捡起DispatchUpdateNodeJobs
工作的工作人员依次运行时分派其250 UpdateNode
个工作,然后这些工作像现在一样被工人接走。如果您的计划任务需要很长时间才能创建5000个作业,那么这可能会更轻松地扩展工作,具体取决于系统的设置方式,并且有可能更快地将全部5000个作业排入队列,以供工作人员使用。
但是,如果您说CPU使用率很高是因为您现有的所有60名工人都在同一台服务器上,那么我认为您只需要添加另一台服务器来分散工作。每个60个PHP进程使用1%的CPU和大约25mb的内存仍将占用60%的CPU和1.5gb的内存,而活动的进程如此之多,无法避免这种情况。
如果数据库在同一系统上并且还使用大量cpu,则您可能还需要针对用例优化查询,添加索引和其他性能调整。最快的数据库。是您无法访问的(利用您可以缓存的内容)。
最好的选择最终取决于您当前的瓶颈以及系统的设置方式。
答案 1 :(得分:0)
%user = 53% 一个任务= 1%* 4CPU = 4%大
拆分任务
_roomCollectionRef.document(documentId).snapshots().listen((onData) {
-仅将数据保存到文件夹或Redis
handle()
在一项任务中的每一分钟将所有json从文件夹推送到数据库。