Chinaunix首页 | 论坛 | 博客
  • 博客访问: 168730
  • 博文数量: 35
  • 博客积分: 2067
  • 博客等级: 大尉
  • 技术积分: 282
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-31 10:29
文章分类

全部博文(35)

文章存档

2014年(3)

2011年(2)

2010年(20)

2009年(10)

我的朋友

分类: LINUX

2009-10-31 14:27:48

本人做流媒体开发的,工作中需要将mpg文件转化成一定格式发送到网络,由于文件太大,程序用mmap()来实现文件的读取,但在实测过程中发现一个大问题,如下:

服务器配置:
CPU:两颗至强3.0
内存:2G
磁盘:3个SATA硬盘组成磁盘阵列

测试时同时运行30个播放程序读取30个不同的mpg文件,程序起初运行画面播放非常流畅,几分钟过后,内存剩下15MB左右时,mmap()就开始不停 的进行页面置换,将新的数据读入内存,老的数据置换出去,这时的磁盘利用率不到1%,但CPU耗在iowait上的时间却有90%多

各位大侠我该怎么办,如果不用内存映射还有没有其他的办法处理大文件???


开个4G的swap分区挂上去试试看
或者,把文件分段mmap(),如100M的文件做10次mmap(),并且要求在播放1段完前做好下段准备工作

你挂mmap不释放怎么行.
你mmap一个大文件, 要在这个大文件播放完后才能释放.
要把大文件分小

你可以分段映射试试看,比如一次映射2M,并跟踪程序在这个映射内的使用情况,如果这此映射的数据快用完时,就提前映射下一段.在上一段用完后,就释放掉其映射.

今天又做了一下测试,先映射整个文件,在使用过程中一段一段释放,还是阻塞在IOWait,另外挂载4G交换分区的方法也试了,效果更差
      在国外论坛上看了些IOWait的东东,有很多都说红帽企业版+Xeons处理器+磁盘阵列容易发生IOWait,和我现在的配置一模一样,用单独的大文件拷贝就能测得出来,明天下个新内核编译一下试试看

问题已解决,好高兴^_^

问题原因:
    调用mmap()时内核只是建立了逻辑地址到物理地址的映射表,并没有映射任何数据到内存。
    在你要访问数据时内核会检查数据所在分页是否在内存,如果不在,则发出一次缺页中断,linux默认分页为4K,可以想象读一个将近2G的电影文件要发生多少次中断,I can't bear it!!!

解决办法:
    将madvise()和mmap()搭配起来使用,在使用数据前告诉内核这一段数据我要用,将其一次读入内存,现在程序可以并发150个数据流了,每秒最高可读70MB数据
 

感谢大家的支持,另外还要特别感谢老兵哥在“timer frequency”问题上的支持,那个问题还有待研究,周末了,祝大家愉快。

阅读(2335) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-05-25 10:03:19

请问你是怎么做的呢?我不知道具体怎么用madvise(),看手册没怎么看懂。 我的博客:miracle.cublog.cn Email:freesupper_fangren@yahoo.com.cn

chinaunix网友2010-05-25 10:03:19

请问你是怎么做的呢?我不知道具体怎么用madvise(),看手册没怎么看懂。 我的博客:miracle.cublog.cn Email:freesupper_fangren@yahoo.com.cn