之前一段时间,现场报了个问题到开发,老大让我去分析下。现场在部署的产品是行人分析,即接入多个摄像机,实时分析监控视频中的行人。一般一台机器会启动多个行人分析的进程以对接多个摄像头。
远程过去,观察到的现象是所有分析进程占用的CPU资源几乎同步地从正常的80%左右以几分钟的速度飙到300%以上,持续一会儿后被强制重启。如此不断循环。
此产品发布前在公司内部经过充分测试,在其他多个实际环境中也能长时间稳定运行。单单这一个机器中有问题,而且是必现的,并且规律极其一致,初步怀疑是此机器系统层的问题,所以才会同时影响所有分析进程。
再继续分析是此程序中的哪些线程占用CPU异常的。使用top和pstack两个工具找出了3个异常线程,其他二十多个线程都正常。这3个线程中的一个是主线程,另外2个的主要工作则分别是取视频流解码,和图像分析。而这3个线程都会涉及到频繁的图像数据的拷贝。因此猜测问题出在内存这块。
结合以上的两处判断,推测是内存条的问题。就此询问现场同事内存容量的总大小,内存条数量等信息。了解到机器中就1根16GB的内存条。而公司内部测试的环境是2根8GB的内存条。由此推断是双通道改成单通道导致的CPU飙升。让现场同事改成双通道后,异常消失。
可能还有些人没明白双通道改成单通道后为啥为导致CPU的飙升。仔细分析下来是这样的:
- 处理的是视频数据,视频是25fps的帧图像;
- 要知道一帧1080p的图像解码后有6+MB的大小;
- 多个进程中都在频繁的对解码后的帧图像拷贝非常占用内存带宽;
- 而一般DDR3的内存条在系统运行中的频率也就800MHz,计算下64位系统下的内存带宽也就 64*800M/8=6.4GB而已,另外内存拷贝是区分读取和写入的,这样实际的带宽就是3.2GB;
- 一路视频流需要多少带宽呢?假设一帧图像前前后后总共拷贝4次,就是要占用256M4=600MB了;
- 一个机器上一般要开到6个分析进程,这就要3.6GB的带宽了,根本不够,更不用说其他进程也同样需要占用内存带宽了。
- 虽然1根16GB的内存和2根8GB的内存总容量一样,但2根8GB的内存带宽却是1根16GB内存的近2倍。
平时系统资源不到极限根本不会注意到其对进程运行的影响,而一到极限影响就非常大了,所以测试时要非常注意这点。
网友评论