我有两个程序写入我的服务器磁盘。
我写的一个是线性写入,它快速写入数据。 另一个我是基准testing,它以三分之一的速度写数据。 它没有什么别的,我相信这个问题是由第二个程序寻求更多的(即它更随机的文件访问)造成的。
在Linux上是否有一个工具可以用来确定在特定磁盘上执行的查找次数? 还是由一个特定的过程?
这个工具可能会帮助你http://sourceforge.net/projects/hdparm/ – 我以前用过这个,取得了一些成功。 可以给你一个基准的其他工具是iometer。 Iostat是另一个工具,但可能不会显示你的过程,这个工具也可能有助于http://www.atoptool.nl/ 。 希望有所帮助!
为了确定每个进程的查询调用次数,可以使用strace并search每个有趣的系统调用( fseek(o) , lseek(64) , llseek等)。 更好的办法就是寻求看看那个特定进程调用了哪些函数。
例子:
lseek(3, -1467, SEEK_CUR) = 842
通过文件描述符3打开的文件从当前位置设置为-1467字节,导致新的位置842字节。
lseek(12, 40267, SEEK_SET) = 40267
通过文件描述符12打开的文件被设置为40267字节的总位置,导致40267字节的新位置(由于两个数字相同,所以等于成功 )。
也许可以看出存储系统的负载影响和行为:
iostat -x 1
有几个值得关注的地方:
avgrq-sz描述发送到磁盘的请求的大小(以扇区为单位) avgqu-sz显示这个队列的长度(想想交易的数量) await显示等待设备访问所用的时间(直到设备开始处理请求) svctm显示设备用于满足请求的时间 在你的情况下,请求的大小应该是你的线性写入描述,而队列长度和设备利用率应该保持中等到低。 在第二种更随机访问模式的情况下,请求大小应该保持较低,但队列大小,访问等待和利用率应该上升。
根据访问模式,调整/proc/sys/vm/dirty_writeback_centisecs或/proc/sys/vm/dirty_background_ratio ,但这取决于移动的数据量和模式(只是给你一个指针,页caching/写caching的可调参数是)。