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
相关产品推荐
相关产品推荐

