文件写入函数write和fwrite对SRS的DVR性能影响的比较

本文对比了SRS DVR在使用write和fwrite进行文件写入到SSD和内存盘时的性能表现。结果显示,fwrite在减少系统调用和CPU消耗方面优于write,尤其在SSD上效果显著。内存盘情况下,两者差距减小。测试还提出,io_uring可能成为解决磁盘I/O性能瓶颈的未来方案。
摘要由CSDN通过智能技术生成

概述

     在linux环境中,对于文件进行读写操作的时候,我们可以采用libc提供的fread/fwrite系列的一套函数,也可以采用操作系统提供的read/write系列的一套系统api函数。

     对于libc提供的文件读写函数,首先它可移植性比较好,因为libc为我们屏蔽了操作系统的底层差异,在linux、windows等不同的操作系统环境下面都有标准的接口实现,因此不需要我们为不同的操作系统进行适配。其次,libc提供了带缓冲功能的读写能力,而操作系统底层文件读写API却不提供这种能力,缓冲能力在大多数情况下能够为我们带来文件i/o性能的提升。

      当然libc的文件读写api函数也存在不足之处,缺少了writev/readv之类的函数。不过readv/writev的功能无非就是将多个缓冲区的内容合并成一次批量读写操作,而不需要进行多次API调用,从而减少实际物理I/O的次数,我想libc没有提供这类函数主要也是因为其缓冲功能已经能够将本来需要多次的小块物理I/O操作合并成了一次更大块的物理i/o操作,所以就没有必要再提供readv/writev了。

      在应用SRS的视频DVR录存功能进行压力测试的时候,我就碰到了原生SRS在进行录存的时候大并发量文件写入导致CPU消耗过大的问题。究其原因,是因为SRS进行录存文件写入操作的SrsFileWriter类采用了操作系统提供的系统文件写入函数write,它没有缓冲功能,导致DVR录制的时候大量音视频碎片数据写入引起大量的系统调用,可能引起系统在内核态和用户态进行大量迁移,从而引起CPU消耗过高的问题。

     下面就测试的原理和方法、测试的环境、测试的结果和相关的结论和大家进行分享。

测试的原理和方法

        压测工具,用srs_bench套件中的sb_rtmp_publish模拟推流客户端进行大并发量推流模拟,一台机器压测能力不够可以开启多台机器进行压测。

在srs上面开启DVR录存功能,在srs的配置文件中添加如下代码:

 vhost __defaultVhost__ {
 •    dvr {
 •        enabled      on;
 •        dvr_path     /data/ssd/[app]/[stream].[timestamp].ts;
 •        dvr_plan     session;
 •    }
 }

       启动srs后,用压测工具进行压测,观察测试过程中的CPU、网络IO、磁盘IO相关数据,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农心语

您的鼓励是我写作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值