在大量成员聊天的群里部分mp4视频会导致MacOS下Chrome CPU占用100%
复现:
- 在千人大群里浏览未FastStart的mp4视频(moov头在文件末尾),观察cpu占用是否100%+
问题:
- Weibo对mp4视频的range请求返回的是200状态码,而不是标准206,导致chrome解析出错
- Chrome解析出错,会放弃Range分片,改为从头( bytes=0- )完整下载,并销毁资源
- 在销毁播放器并清理线程时,Chrome 的线程池(ThreadPool)需要创建临时通道(管道/Socket 对/Mach端口)来进行跨线程同步。但因为大群已经把系统的描述符/端口资源占满了,系统无法为这次清理分配新的句柄,返回了无效句柄(如 -1 或 EBADF )。
- 死循环爆发: 负责同步的子线程调用 macOS 的 kevent64 (或 WaitableEvent::WaitMany)去监听这些无效句柄。由于句柄无效,系统调用不会阻塞等待,而是立即带着错误返回。线程池以为有事件到达或试图重试,从而在零延迟的情况下疯狂循环调用,瞬间把 CPU 核心全部占满(100%+)
建议修复:
- range请求返回206
- MP4视频启用FastStart
