免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3264 | 回复: 11

【请教】如何编程序时抢IO资源 [复制链接]

论坛徽章:
0
发表于 2007-02-08 15:54 |显示全部楼层
我的一个程序和另外一个程序都要大量的读写硬盘,这样导致我的程序很慢,但是另一个程序是线上服务程序,不能杀掉的,但可以慢一点。
所以,怎么才能编程的时候,控制系统调度IO时优先调度我的程序了?谢谢!~

论坛徽章:
0
发表于 2007-02-08 15:58 |显示全部楼层
--

renice - alter priority of running processes

注意:硬件中断总是拥有最高的优先权

--

论坛徽章:
0
发表于 2007-02-08 16:48 |显示全部楼层
还有别的方法吗?因为另一个程序也要正常的跑,我只是希望我的程序在IO时比他快点就可以了。

论坛徽章:
0
发表于 2007-02-08 16:53 |显示全部楼层
--

这个……I/O 快和慢,怎么个讲法?你说一说你的调度算法吧。

另一个程序总是要大量读写硬盘,是刻意的还是什么呢?是不是数据库后台?

--

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
发表于 2007-02-08 17:38 |显示全部楼层
sched_setscheduler设置为SCHED_FIFO会不会好些?

论坛徽章:
0
发表于 2007-02-08 17:57 |显示全部楼层

回复 4楼 langue 的帖子

我没有什么调度算法了,都是操作系统调度的。
就是我的这个程序跑完一趟要写差不多160G的内容要硬盘上,而且是写到128个文件里,这么多的内容肯定得分次写,我的缓冲区一个文件是1M,也就是1次写1M到一个文件里。串行的话I/0操作会浪费很多时间,所以我用多线程,将I/O专门用了个线程在做,2个线程间缓冲。我在一个只有我一个程序跑的机器上测试,基本上CPU操作和I/O操作已经并行了,这样速度就很快。但是我到另一个机器上测试,因为那个机器上还有其他的程序在跑,也要大量I/O,这样,2个进程就在抢I/O资源,导致我这边的I/O完成的慢,就有等待,但是我这边CPU操作线程和I/O线程的缓冲区有限,如果I/O那边等待了,缓冲区用完了,就又变成串行的了。
所以,我想的是,怎么让我的程序的I/O快点,就是最好一调用write,系统就调用我的程序去写硬盘,而不是等待。
不知道说明白了没有,谢谢。。

论坛徽章:
0
发表于 2007-02-08 18:33 |显示全部楼层
原帖由 wxp19831104 于 2007-2-8 17:57 发表
我没有什么调度算法了,都是操作系统调度的。
就是我的这个程序跑完一趟要写差不多160G的内容要硬盘上,而且是写到128个文件里,这么多的内容肯定得分次写,我的缓冲区一个文件是1M,也就是1次写1M到一个文件里。 ...


虽然多进程共享硬盘会导致物理I/O繁忙,但write函数将在数据拷贝到内核缓存后就返回,而不会等到数据实际写入到硬盘中。因此,速度下降可能由

1)内核缓存不足,导致write阻塞。不知道内核缓存是否可以tune,增大内核缓存可能会有帮助。
2)应用缓存不足,这样I/O线程因1)而阻塞后,计算线程耗光缓存阻塞。可以考虑增大应用缓存。

1),2)中解决任何一个都可以改善效率。

我想大概是这样的。

[ 本帖最后由 石油工人干IT 于 2007-2-8 18:36 编辑 ]

论坛徽章:
0
发表于 2007-02-08 21:12 |显示全部楼层
原帖由 石油工人干IT 于 2007-2-8 18:33 发表


虽然多进程共享硬盘会导致物理I/O繁忙,但write函数将在数据拷贝到内核缓存后就返回,而不会等到数据实际写入到硬盘中。因此,速度下降可能由

1)内核缓存不足,导致write阻塞。不知道内核缓存是否可以tun ...



谢谢您的回复,我的应用级的缓冲已经很大了,我用的二级缓冲,第一级是线程之间交换的,开了10000个4K的,实际上我最多只需要128个,一个文件用一个。第二级是IO线程写到硬盘的缓冲,我一个文件开的1M,第一级的一个buf(4k)写到第二级,第二级满了就写到硬盘的。我测试过,增大第一级buf的数量没有意义,开到100000个都没什么用。增大第二级倒是有用的,从4K到1M改善明显,但是从1M到2M就没什么效果了。我的内存可用于缓冲的也不多,还有别的地方用了很多。。
所以,您说的内核缓存怎么改,能介绍一下吗?
还有,我从线程写到硬盘用的是write,不是fwrite,我看了一下,write好像是同步的,fwrite是异步的。但是因为本身我自己就作了缓冲,觉得用fwrite其实也就多了一级缓冲,就是不知道fwrite的缓冲是开在哪?是开在内核的缓冲区,还是占用的我应用程序的内存,如果是应用程序的,我的内存不够用。。

论坛徽章:
0
发表于 2007-02-08 21:45 |显示全部楼层
因为瓶颈在硬盘IO, 建议你的程序用独立的硬盘.

另外, CPU 100% 忙吗? USR/SYS/IDL/WA 是怎么分的?

论坛徽章:
0
发表于 2007-02-09 10:17 |显示全部楼层
原帖由 Alligator27 于 2007-2-8 21:45 发表
因为瓶颈在硬盘IO, 建议你的程序用独立的硬盘.

另外, CPU 100% 忙吗? USR/SYS/IDL/WA 是怎么分的?



瓶颈是在硬盘IO那,但是没有独立硬盘可用了。。CPU不忙,所以,才想把CPU和IO并行,这样提高速度。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP