棘手的i/o密集型问题,导致死机
最近碰到了一个棘手的问题,需求是,程序需要拉取64路摄像头的视频流,对视频流进行目标检测、分类、分割等一系列算法分析,当视频流中出现违规信息时,要能及时将违规信息进行上传报警,除此之外最离谱的是还需要留存事件发生前后各10秒的MP4视频文件证据并且上传云。没有什么好的架构设计,那就从自己以往的经验来写吧。好家伙,机器直接内存干爆了,死机!
目前是内存320G swap219G 运行20个小时就挂。。
首先,程序我分为了三个大块,一块是主应用,获取了4个队列,for循环64个进程,负责算法以及产生预警信息,实时将视频帧和该帧所属摄像头ID([帧,ID])put到一个对应队列中(摄像头id除以4取余),当出现报警信息时,用事件uuid替代视频帧传入队列;
第二块,创建了上面4个队列,并且同时创建了4个进程用于往本地视频,从队列中get到视频帧,用一个字典(Map),key是镜头ID,将视频帧append进list,利用逻辑判断当某一位置不是视频帧且后面长度超过250时,取该位置前后250长度内容,放入一个新的字典,key是事件uuid,value就是视频帧序列,开多个线程,若新字典不为空,则将新字典当中的视频帧写成视频文件;第一个字典key对应的list设置了不定长清空,没有事件时只留250,当有事件时,则向后延长250;
第三块,判定文件夹中是否有文件且创建时间超过2分钟,满足则上传;
然后就是,遇到了让人头皮发麻的事情,当64路同时产生事件,并且每个一两秒就出现新的事件时,整个程序就会一直占用内存和swap去写视频,慢慢增大慢慢增大,直到爆炸;这个可能已经不单单叫高并发事件了吧 -- -- -_-
通过你的描述感觉问题出现在视频上传这个点上,如果你能确保前面两个部分不会造成死机,那么视频上传这个问题应该做队列上传,根据事件发生顺序,每次处理一个上传,不进行并发上传,并且检测内存占用情况,当处于安全空闲量可增加并发上传数量,若是一直处于高位就减少或者暂停上传,如果应上传而未上传的视频数量太多时,考虑用别的方案代替现有方案