• E
    block: ignore flush requests when storage is clean · 3ff2f67a
    Evgeny Yakovlev 提交于
    Some guests (win2008 server for example) do a lot of unnecessary
    flushing when underlying media has not changed. This adds additional
    overhead on host when calling fsync/fdatasync.
    
    This change introduces a write generation scheme in BlockDriverState.
    Current write generation is checked against last flushed generation to
    avoid unnessesary flushes.
    
    The problem with excessive flushing was found by a performance test
    which does parallel directory tree creation (from 2 processes).
    Results improved from 0.424 loops/sec to 0.432 loops/sec.
    Each loop creates 10^3 directories with 10 files in each.
    
    This affected some blkdebug testcases that were expecting error logs from
    failure-injected flushes which are now skipped entirely
    (tests 026 071 089).
    
    This also affects the performance of block jobs and thus BLOCK_JOB_READY
    events for driver-mirror and active block-commit commands now arrives
    faster, before QMP send successfully returns to caller (tests 141 144).
    Signed-off-by: NEvgeny Yakovlev <eyakovlev@virtuozzo.com>
    Signed-off-by: NDenis V. Lunev <den@openvz.org>
    Reviewed-by: NPaolo Bonzini <pbonzini@redhat.com>
    Message-id: 1468870792-7411-5-git-send-email-den@openvz.org
    CC: Kevin Wolf <kwolf@redhat.com>
    CC: Max Reitz <mreitz@redhat.com>
    CC: Stefan Hajnoczi <stefanha@redhat.com>
    CC: Fam Zheng <famz@redhat.com>
    CC: John Snow <jsnow@redhat.com>
    Signed-off-by: NJohn Snow <jsnow@redhat.com>
    3ff2f67a
io.c 77.1 KB