免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4944 | 回复: 12
打印 上一主题 下一主题

[C] Linux 多个文件的异步IO问题,高手请进。。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-15 15:08 |只看该作者 |倒序浏览
要求是使用linux aio模型,实现同时写100个文件。  (数据库源从网络接收,这部分我已经用非阻塞模型,实现好了)。

已经调试通过 aio_write(),以及信号通知处理,或者线程回调。


现在碰到以下问题:
1,使用信号作为通知。 有部分文件会收不到信号,因为linux的信号并不会可靠排队。
2,使用线程回调。 也有部分文件总是写不出去,导致缓存队列太长。


请问高手如何处理多个文件的异步IO ???   
哪里有可供参考的开源项目? 或者经过封装的aio驱动库可以用。谢谢。

[ 本帖最后由 fm971 于 2009-5-15 15:32 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-05-15 15:31 |只看该作者
高手指点一下就好了!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2009-05-15 16:08 |只看该作者
第二个问题,你应该考虑设置一下队列长度,队列超过限制就不要再接收了,本身网络io就比磁盘io快,

论坛徽章:
0
4 [报告]
发表于 2009-05-15 16:32 |只看该作者
What Does Not Work?

    * AIO read and write on files opened without O_DIRECT (i.e. normal buffered filesystem AIO). On ext2, ext3, jfs, xfs and nfs, these do not return an explicit error, but quietly default to synchronous or rather non-AIO behaviour (i.e io_submit waits for I/O to complete in these cases). For most other filesystems, -EINVAL is reported.
    * AIO fsync (not supported for any filesystem)
    * AIO read and write on sockets (doesn't return an explicit error, but quietly defaults to synchronous or rather non-AIO behavior)
    * AIO read and write on pipes (reports -EINVAL)
    * Not all devices (including TTY) support AIO (typically return -EINVAL)


感觉AIO还不够成熟,能不用就不用吧。

论坛徽章:
0
5 [报告]
发表于 2009-05-15 16:50 |只看该作者
原帖由 cookis 于 2009-5-15 16:08 发表
第二个问题,你应该考虑设置一下队列长度,队列超过限制就不要再接收了,本身网络io就比磁盘io快,


队列长度我已经有限制了。  但我是从网络上接收视频流,所以不能停止。

我现在总的流量是: 2Mbps * 25个通道 =50Mbps.   这个速度应该是没超磁盘的IO能力。

论坛徽章:
0
6 [报告]
发表于 2009-05-15 17:00 |只看该作者
原帖由 wwwsq 于 2009-5-15 16:32 发表
What Does Not Work?

    * AIO read and write on files opened without O_DIRECT (i.e. normal buffered filesystem AIO). On ext2, ext3, jfs, xfs and nfs, these do not return an explicit error, but ...


多谢指点!   按这里说的是只有用 O_DIRECT标志,才能支持AIO的特性? 否则是同步。 请问这个资料是在哪里找的?


要处理这么多文件的写入,不知道除了AIO还有什么好办法。 我的网络模块是单线程非阻塞,可以实现大并发量。如果写文件再用多线程,开销也比较大。
AIO的两种通知方式,感觉都不太好。  信号方式会中断其它系统调用;线程回调方式,又有创建线程的开销,在gdb里面显示每次通知都会创建线程。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2009-05-15 17:10 |只看该作者
en. 流量确实很小,
1。你看看你的iowait 大不?
2。如果你的总流量不是很高,没必要使用aio, 自己写一个写文件的线程同步地写,简单

论坛徽章:
0
8 [报告]
发表于 2009-05-15 17:26 |只看该作者
原帖由 cookis 于 2009-5-15 17:10 发表
en. 流量确实很小,
1。你看看你的iowait 大不?
2。如果你的总流量不是很高,没必要使用aio, 自己写一个写文件的线程同步地写,简单


我本来是打算姘弃多线程的方式, 不知还有没别的办法........
据了解 web服务器lighttpd 是用的aio, 但不知道是怎么用的.....

论坛徽章:
0
9 [报告]
发表于 2009-05-15 17:59 |只看该作者
看看libevent的架构或许对你有帮助, 里面有对IO/信号/timer的封装, 当某种事件发生变化时, 会将事件从事件监视队列(定时器min-heap堆)移到活跃队列里, 按事件发生顺序依次调度执行事件发生回调函数.

论坛徽章:
0
10 [报告]
发表于 2009-05-15 18:52 |只看该作者
原帖由 fm971 于 2009-5-15 17:00 发表


多谢指点!   按这里说的是只有用 O_DIRECT标志,才能支持AIO的特性? 否则是同步。 请问这个资料是在哪里找的?


要处理这么多文件的写入,不知道除了AIO还有什么好办法。 我的网络模块是单线程非阻塞 ...



内存缓存,然后批量写入。
硬盘连续读写的速度是大大高于随机读写的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP