Chinaunix

标题: 【请教】如何编程序时抢IO资源 [打印本页]

作者: wxp19831104    时间: 2007-02-08 15:54
标题: 【请教】如何编程序时抢IO资源
我的一个程序和另外一个程序都要大量的读写硬盘,这样导致我的程序很慢,但是另一个程序是线上服务程序,不能杀掉的,但可以慢一点。
所以,怎么才能编程的时候,控制系统调度IO时优先调度我的程序了?谢谢!~
作者: langue    时间: 2007-02-08 15:58
--

renice - alter priority of running processes

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

--
作者: wxp19831104    时间: 2007-02-08 16:48
还有别的方法吗?因为另一个程序也要正常的跑,我只是希望我的程序在IO时比他快点就可以了。
作者: langue    时间: 2007-02-08 16:53
--

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

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

--
作者: 帅绝人寰    时间: 2007-02-08 17:38
sched_setscheduler设置为SCHED_FIFO会不会好些?
作者: wxp19831104    时间: 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,系统就调用我的程序去写硬盘,而不是等待。
不知道说明白了没有,谢谢。。
作者: 石油工人干IT    时间: 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 编辑 ]
作者: wxp19831104    时间: 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的缓冲是开在哪?是开在内核的缓冲区,还是占用的我应用程序的内存,如果是应用程序的,我的内存不够用。。
作者: Alligator27    时间: 2007-02-08 21:45
因为瓶颈在硬盘IO, 建议你的程序用独立的硬盘.

另外, CPU 100% 忙吗? USR/SYS/IDL/WA 是怎么分的?
作者: wxp19831104    时间: 2007-02-09 10:17
原帖由 Alligator27 于 2007-2-8 21:45 发表
因为瓶颈在硬盘IO, 建议你的程序用独立的硬盘.

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



瓶颈是在硬盘IO那,但是没有独立硬盘可用了。。CPU不忙,所以,才想把CPU和IO并行,这样提高速度。
作者: 石油工人干IT    时间: 2007-02-09 10:58
原帖由 wxp19831104 于 2007-2-8 21:12 发表



谢谢您的回复,我的应用级的缓冲已经很大了,我用的二级缓冲,第一级是线程之间交换的,开了10000个4K的,实际上我最多只需要128个,一个文件用一个。第二级是IO线程写到硬盘的缓冲,我一个文件开的1M,第一 ...


看起来你用到的缓冲设计很复杂,并且以文件为中心。可否考虑以线程为中心进行缓冲,这样就是典型的生产者-消费者问题。

另外,fwrite是库函数,具体实现我不清楚,如果它有自己的缓存,是在应用空间。关于内核缓冲tune,我也只是猜测,具体操作不清楚。
作者: wxp19831104    时间: 2007-02-09 15:35
原帖由 石油工人干IT 于 2007-2-9 10:58 发表


看起来你用到的缓冲设计很复杂,并且以文件为中心。可否考虑以线程为中心进行缓冲,这样就是典型的生产者-消费者问题。

另外,fwrite是库函数,具体实现我不清楚,如果它有自己的缓存,是在应用空间。关于 ...



谢谢回复。不过好像不行的,我的瓶颈在文件IO上,所以优化都是怎么想着让文件IO快点的。。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2