日期:2014-05-16  浏览次数:20750 次

linux写文件时怎么降低对系统的开销
使用的是RHEL 6.1,程序运行时会从远程的NFS服务器上读取文件,然后写到本地磁盘上,但是这样做会严重影响到服务器其他程序的运行,有的服务需要精确计时,只要一拷贝文件,计时就会偏差很大,影响到程序的运行。
我试着把写文件的代码注释掉,单纯地读远程文件对其他程序影响不大,至少从观察的结果来看没有什么影响。只要涉及到写文件(fwrite),就会对其他程序产生很大的影响。

有没有什么办法,让写文件对系统的其他程序不会有太大影响,速度慢点没关系(10MB/s可以接受)。我已经做过一些实验:
1.每次读100K,然后写文件,sleep 100ms, 效率最低,影响较大
2.每次读20M,然后写文件,sleep 100ms, 效率最高,影响最小(但是还是影响到了别的程序)
3.每次读20M, 分批次每次写320*1024B, 每次fwrite 后sleep 50ms (影响大)
4.每次只读20M,不写文件,sleep 100ms, 对其他程序无影响

问题可能就出在写文件的时候系统开销太大,有啥方法可以既能保证系统的性能,又不至于拷贝文件太慢???

------解决方案--------------------
把每次写入的调大一点。I/O操作会减少。
------解决方案--------------------
文件总是要写的,缓冲区大一点,会减少系统调用的次数
其他方法不知道了
------解决方案--------------------
如果是简单点的方法,可以考虑调整内核参数,例如如下这些
sysctl -a | grep dirty
vm.dirty_expire_centisecs = 2999
vm.dirty_writeback_centisecs = 999
vm.dirty_ratio = 40
vm.dirty_background_ratio = 20


如果是复杂点的....可以尝试先将文件写入内存,比如memcached,然后由一个程序在后台异步的低速写入磁盘...之类的...


不过完善的解决方法,我想还是拆分业务吧....把会受到影响的业务拆分到其他机器上...
------解决方案--------------------
方法3每写完一点延时时间长一些看看有没有改善
------解决方案--------------------
可以采用缓存机制,一次大量写入取代多次读写
------解决方案--------------------
linux文件系统 会合并多次并延后写来优化

所以再优化差别不明显。