fsync: giving up on dirty on ufs partitions running vfs_write_suspend()

Gary Jennejohn gljennjohn at gmail.com
Thu Sep 21 10:59:03 UTC 2017


On Thu, 21 Sep 2017 10:58:46 +0200
Andreas Longwitz <longwitz at incore.de> wrote:

[snip]
> I have checked your proposal and found that indeed the
> mnt_secondary_writes counter goes to zero when the dirties have reached
> zero. During the loop the mnt_secondary_write counter is always equal to
> one, so there is not something like a countdown and thats Kirk wanted to
> see. A dtrace output (with DELAY of 1ms in the loop) for the biggest
> loop count on a three day test is this:
> 
>  18  32865      kern_unlinkat:entry    path=bigfile, tid=101201,
> tid=101201, execname=rm
>  18  12747         ufs_remove:entry    gj=mirror/gmbkp4p5.journal,
> inum=11155630, blocks=22301568, size=11415525660
>  18  12748        ufs_remove:return    returncode=0, inum=11155630,
> blocks=22301568
>  18  18902       ffs_truncate:entry    gj=mirror/gmbkp4p5.journal,
> inum=11155630, size=11415525660, mnt_flag=0x12001040,
> mnt_kern_flag=0x40006142, blocks=22301568
>   6  33304  vfs_write_suspend:entry    gj=mirror/gmbkp4p5.journal,
> mnt_kern_flag=0x40006142, tid=100181
>   6  22140       vop_stdfsync:entry    mounted on /home, waitfor=1,
> numoutput=0, clean=10, dirty=6, secondary_writes=1
>  10  28117      bufobj_wwait:return    calls to bufobj_wait = 1,
> dirtycnt=2, secondary_writes=1
>  10  28117      bufobj_wwait:return    calls to bufobj_wait = 2,
> dirtycnt=1, secondary_writes=1
>  10  28117      bufobj_wwait:return    calls to bufobj_wait = 3,
> dirtycnt=1, secondary_writes=1
>  10  28117      bufobj_wwait:return    calls to bufobj_wait = 4,
> dirtycnt=3, secondary_writes=1
>  10  28117      bufobj_wwait:return    calls to bufobj_wait = 5,
> dirtycnt=2, secondary_writes=1
>   6  28117      bufobj_wwait:return    calls to bufobj_wait = 6,
> dirtycnt=3, secondary_writes=1
>   6  28117      bufobj_wwait:return    calls to bufobj_wait = 7,
> dirtycnt=3, secondary_writes=1
>   6  28117      bufobj_wwait:return    calls to bufobj_wait = 8,
> dirtycnt=3, secondary_writes=1
>   6  28117      bufobj_wwait:return    calls to bufobj_wait = 9,
> dirtycnt=3, secondary_writes=1
>   6  28117      bufobj_wwait:return    calls to bufobj_wait = 10,
> dirtycnt=2, secondary_writes=1
>   6  28117      bufobj_wwait:return    calls to bufobj_wait = 11,
> dirtycnt=2, secondary_writes=1
>   6  28117      bufobj_wwait:return    calls to bufobj_wait = 12,
> dirtycnt=3, secondary_writes=1
>   6  28117      bufobj_wwait:return    calls to bufobj_wait = 13,
> dirtycnt=3, secondary_writes=1
>   6  28117      bufobj_wwait:return    calls to bufobj_wait = 14,
> dirtycnt=3, secondary_writes=1
>   6  28117      bufobj_wwait:return    calls to bufobj_wait = 15,
> dirtycnt=4, secondary_writes=1
>   6  28117      bufobj_wwait:return    calls to bufobj_wait = 16,
> dirtycnt=3, secondary_writes=1
>   6  28117      bufobj_wwait:return    calls to bufobj_wait = 17,
> dirtycnt=3, secondary_writes=1
>   2  18903      ffs_truncate:return    returncode=0, inum=11155630, blocks=0
>   2  32866     kern_unlinkat:return    returncode=0, errno=0, number
> io's: 791/791
>   6  28117      bufobj_wwait:return    calls to bufobj_wait = 18,
> dirtycnt=3, secondary_writes=0
>   6  28117      bufobj_wwait:return    calls to bufobj_wait = 19,
> dirtycnt=0, secondary_writes=0
>   6  22141      vop_stdfsync:return    returncode=0, pid=26, tid=100181,
> spent 240373850 nsecs
> 
> So the spent time in vop_stdfsync() is 0,24 sec in the worst case I
> found using DELAY with 1 ms. I would prefer this solution. My first
> appoach (simple bumping maxres from 1000 to 100000) is also ok, but max
> spend time will be raise up to 0,5 sec. Perhaps you like something like
> 
>    if( maxretry < 1000 && maxretry % 10 = 0)
                                                                    ^ ==
>           DELAY(waitns);
> 

The argument to DELAY is in micro-seconds.

-- 
Gary Jennejohn


More information about the freebsd-fs mailing list