首页 > 其他分享 >视频回调的空转陷阱

视频回调的空转陷阱

时间:2023-02-20 09:57:27浏览次数:30  
标签:空转 视频 平台 memcpy 线程 陷阱 回调 cpu

最近一直在做视频项目的外围事情,工作中发现了一个比较奇怪的问题。在接入某一家平台厂商的视频流时,使用4核2.33G机器对16路cif视频进行解码居然要占用了50%的cpu。这真是个非常不可思议的数据。在和厂商沟通过程中,对方告诉我,他们的解码可以做到2核2G的机器上跑到40路cif。这和我的测试结果差别也太大了,无法接受,于是乎单独为对方的sdk写了测试用例,4核机器上跑16路cif只用了15%-18%cpu,这个结果和对方的陈述还是比较的吻合。


看来问题确实出在后端,可是后端的设计对于所有平台都是一样的,为什么只有这家平台会出问题呢。仔细研究了代码,后端做了一个内存池,用来缓存视频数据,在这过程中也就是使用了memcpy函数。实在看不出什么东西了,只能一段一段代码注释掉,在注释掉所有memcpy后,奇迹出现了,cpu居然下来了。当时真是非常的吃惊,从来没有想过memcpy会占cpu,闻所未闻。但是疑点又出现了,为什么别的平台没有这种问题呢。


在使用windebug仔细研究线程后,cpu确实是被平台的视频回调所占用,非常的纳闷。没办法,在视频回调中设置了sleep函数,观测结果,cpu也下来了。这下问题明白了,一般视频的桢率是25桢/秒。平台在接受时,启用线程接受码流,为了不阻塞上层应用,平台在其内部一定做了丢桢机制,当接受buf大于缓存时,主动丢桢来减轻内存消耗。于是一个在其内部必然维护了2个线程,同上层应用的接口是一个视频回调线程,而在这个线程中毫无疑问没有做信号量的等待,而是采用了一种轮训的机制,不停的回调。于是就出现了最初的情况,cpu空转。

但是这里还有一个疑问,为什么注释掉memcpy也会出现cpu降低的情况呢。这个应该和memcpy消耗无关,和机器及操作系统相关,在注释掉memcpy后,操作系统应该采取了某种优化措施,控制了回调线程的工作,这个也真是在多核系统中,虽然线程空转,却不会出现单核系统cpu100%的原因。在随后的测试中,也确实验证了这一点,不同的平台和硬件配置确实在其中发生了某些影响。
山高月小,水落石出。真相往往隐藏在从从迷雾之后。

标签:空转,视频,平台,memcpy,线程,陷阱,回调,cpu
From: https://www.cnblogs.com/kn-zheng/p/17136318.html

相关文章

  • 记一次hooks陷阱
    今天写一个hook,正想发挥hooks这种高级复用方式来缩短我的开发时间,就出现了一个新bug。我编写的这个hook用于管理数据列表状态。除了导出内部的状态外,还导出一些方法供外部......
  • 2023年软考网络规划设计师视频教程
    很多考生准备参加2023年软考网络规划设计师考试,为帮助考生顺利通过考试,课课家软考学院为考生推荐网络规划设计师学习视频、串讲视频、真题讲解视频等内容,帮助考生掌握......
  • Qt音视频开发14-音视频文件保存基类的设计
    一、前言视频综合应用示例,包括了多种内核,在保存文件这个功能上,需要一个通用的文件保存基类AbstractSaveThread,这个基类定义了是否打印线程消息标志位、直接写入还是排队写......
  • 2023年软考数据库系统工程师视频教程
    很多考生准备参加2023年软考数据库系统工程师考试,为帮助考生顺利通过考试,课课家软考学院为考生推荐数据库系统工程师学习视频、串讲视频、真题讲解视频等内容,帮助考生......
  • 摄像头视频云台控制PTZ前端html css原生样式源码分享
        ​<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0">......
  • i.MX8M开发板Yocto系统使用Gstarwmra视频转换
    iTOP-iMX8MM提供了一个视频转换组件:imxvideoconvert_g2d,输入以下命令查看具体的信息。gst-inspect-1.0imxvideoconvert_g2d​​​​更多内容:可以了解IMX8M开发板......
  • #yyds干货盘点#Electron 开发音视频
    创建Electron项目前提条件在使用Electron进行开发之前,需要安装Node.js。要检查Node.js是否正确安装,请在您的终端输入以下命令:node-vnpm-v脚手架创建electron应用程......
  • opencv二:视频读取与保存
    1.打开摄像头#打开摄像头importcv2cap=cv2.VideoCapture(0)while(True):ret,frame=cap.read()#返回两个值,第一个为bool类型,如果读到帧返回True,如果没读到帧返回Fa......
  • 腾讯云视频点播示例
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge,chrome=1"><metaname="viewport"content="wi......
  • Hive 刷题——视频热度问题
    需求描述现有用户视频播放记录表(user_video_log)如下。uid(球队名称)video_id(视频id)start_time(开始时间)end_time(结束时间)if_like(是否点赞)if_retweet(是否喜欢)c......