我如何确定在Linux上执行的search次数?

我有两个程序写入我的服务器磁盘。

我写的一个是线性写入,它快速写入数据。 另一个我是基准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的可调参数是)。