赞
踩
在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后,用压测工具进行压测,观察测试过程中的CP
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。