You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js流读写优化:解决高CPU占用与音视频卡顿问题

优化方案

1. 修正比特率参数(关键错误)

你当前设置的bitsPerSecond: 60明显不符合音视频录制的正常需求,过低的码率会导致编码器异常工作,反而徒增CPU负载。建议调整为合理值,比如60000(60kbps),或根据画质需求设置更高(如1Mbps对应1000000):

stream = await getStream(page, { 
  audio: true, 
  video: true, 
  bitsPerSecond: 60000 // 修正为合理码率
});

2. 优化文件写入的缓冲配置

Node.js默认的fs.createWriteStream高水位线(highWaterMark)为16KB,频繁的小批量写入会增加系统调用次数和CPU开销。调大高水位线,减少IO操作频率:

const fs = require('fs');
// 将高水位线设为1MB,可根据实例内存灵活调整
const file = fs.createWriteStream('output.mp4', { highWaterMark: 1024 * 1024 });
stream.pipe(file);

3. 使用stream.pipeline替代原生pipe

stream.pipeline比原生pipe更稳定,能自动处理流错误、完成资源清理,避免因流异常导致的CPU占用飙升:

const { pipeline } = require('stream/promises');

// 替换原有的stream.pipe(file)
await pipeline(stream, file);

4. 调整EC2实例的IO配置

t2.medium默认的EBS卷性能有限,可通过以下方式降低IO等待带来的CPU消耗:

  • 启用EBS优化实例(EC2控制台可直接开启),降低IO延迟
  • 将存储卷更换为gp3类型,并按需调整IOPS参数,提升写入性能

5. 优化Puppeteer录制的编码参数

通过getStream的配置项调整编码策略,减少CPU的编码压力:

stream = await getStream(page, {
  audio: true,
  video: true,
  bitsPerSecond: 60000,
  videoConstraints: {
    frameRate: 15, // 降低帧率,减少单帧编码次数
    width: 1280,   // 合理设置分辨率,避免不必要的高画质开销
    height: 720
  },
  audioConstraints: {
    sampleRate: 44100, // 采用标准采样率
    channelCount: 1    // 使用单声道,降低音频处理负载
  }
});

6. 修正录制后的资源清理顺序

当前代码先关闭文件再销毁流,可能导致未写完的流数据丢失,同时增加CPU处理异常的开销。正确顺序应为先销毁流,等待所有数据写入后再关闭文件:

// 先销毁流,确保所有待写入数据进入文件缓冲
await stream?.destroy();
// 等待文件写入完成后再关闭并执行上传
file?.end(() => {
  file.close();
  const fileName = 'filename', fileDir = 'filedir';
  awsService.uploadFileToS3(file, fileName, fileDir);
});

7. 拆分录制与S3上传任务

录制完成后立即启动S3上传会让CPU同时处理文件读取和网络传输,加重负载。建议:

  • 确保文件完全写入并关闭后,再启动上传任务
  • 用低优先级的异步进程或任务队列处理上传,避免抢占录制阶段的CPU资源

内容的提问来源于stack exchange,提问作者Shïvà Tömàr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:10:18