- 论坛徽章:
- 0
|
情况是这样的:有一个测试USB Disk SPeed的Shell,使用的方法是调用/bin下的hdparm命令,将会自动读取USB设备,并计算其读取速度,然后Show在屏幕上,核心代码如下
由于在测试USB Disk前有许多其它测试项目,导致测试到USB时,系统长时间不响应,虽然最终会有测试结果,但是delay时间过长(5-10分钟)。
用strace跟踪上述代码发现hdparm在执行到sync()时候被阻塞(没有返回),分析hdparm的原码,发现就是在如下的代码中被阻塞
- sync()
- sleep(3)//清除对设备的请求,并给其清除的时间
复制代码
sync为什么会在此处被阻塞呢?我想分析kernel source sync的原码,可是没有找到,哪个大虾知道路径麻烦告诉一声。。。
由man2 可知sync就是将在kernel缓存的东西都写到disk上,并且目前的Linux在数据真正被写好前都会一直等待。
那么什么情况会导致调用sync阻塞那么久的时间呢?应该不是sync在等待数据写完。
猜测是由于前几个测试项目中是不是有没有close的文件句柄?没有free的内存空间?内核缓冲中本来有写到某个device的数据,但是在系统sync前,设备被移除了,导致执行到这里sync时候阻塞?
补充:文件系统是放在NAND这种存储设备上的,有一个试验,写一个比较大的文件到nand以后,然后unlink操作,再立刻reboot -nf,关机再开机以后做sync,会有3/77 的比率存在sync调用时间>40s以上,都已经关机了,为什么开机再sync还会阻塞这么久呢?难道是unlink操作即使在关机后依然有效?
大小虾们有什么想法见解都来说说吧! 这个问题实在搞得我没有想法了。。。
这个帖子本来放在C,C++板块,可是没有什么响应,可能在内核板块会有很多高手知道原因...
[ 本帖最后由 lilianglinux 于 2007-7-9 08:22 编辑 ] |
|