![如何确定在 Linux 上执行的寻道次数?](https://linux22.com/image/798424/%E5%A6%82%E4%BD%95%E7%A1%AE%E5%AE%9A%E5%9C%A8%20Linux%20%E4%B8%8A%E6%89%A7%E8%A1%8C%E7%9A%84%E5%AF%BB%E9%81%93%E6%AC%A1%E6%95%B0%EF%BC%9F.png)
我有两个程序可以写入我的服务器磁盘。
我编写的一个程序,它执行线性写入,数据写入速度很快。另一个程序我正在对其进行基准测试,它的数据写入速度只有后者的三分之一。它没有做太多其他事情,我相信问题是由第二个程序寻求更多(即它执行更多随机文件访问)引起的。
Linux 上是否有一个工具可以用来确定特定磁盘或特定进程执行的寻道次数?
答案1
此工具可能对你有帮助http://sourceforge.net/projects/hdparm/- 我过去曾使用过这个工具,取得了一些成功。另一个可以为您提供基准的工具是 iometer。Iostat 是另一个工具,但它可能不会显示进程,这个工具也可能有帮助http://www.atoptool.nl/。希望有帮助!
答案2
为了确定寻找您可以使用的每个进程的调用strace
并搜索每个有趣的系统调用(fseek(o),lseek(64),查找等等)。最好只grep
用于寻找查看该特定进程调用了哪些函数。
例子:
lseek(3, -1467, SEEK_CUR) = 842
通过文件描述符打开的文件3被设定为-1467字节来自当前的位置,从而得到新的位置842字节。
lseek(12, 40267, SEEK_SET) = 40267
通过文件描述符打开的文件12设置为全部的的位置40267字节导致的新位置40267字节(等于成功因为两个数字相同)。
答案3
观察存储系统的负载影响和行为也许会有所启发:
iostat -x 1
这里有几个有趣的价值观:
avgrq-sz
描述发送到磁盘的请求的大小(以扇区为单位)avgqu-sz
显示此队列的长度(考虑交易数量)await
显示等待设备访问的时间(直到设备开始处理请求)svctm
显示设备满足请求所花费的时间
在您的案例中,请求大小应该会随着您描述的线性写入而增加,而队列长度和设备利用率应该保持中低水平。在第二种情况下,即更多的随机访问模式,请求大小应该保持较低水平,但队列大小、访问等待和利用率应该会上升。
根据访问模式,调整/proc/sys/vm/dirty_writeback_centisecs
或可能是有意义/proc/sys/vm/dirty_background_ratio
的,但这取决于移动的数据量和模式(只是为了给你一个指针,让你知道页面缓存/写缓存的可调参数在哪里)。