Message ID | 1395655091-5318-1-git-send-email-wangsl.fnst@cn.fujitsu.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
On Mon, Mar 24, 2014 at 05:58:10PM +0800, Wang Shilong wrote: > To compress a small write(<=blocksize) dosen't save us > disk space at all, skip it can save us some compression time. The compressibility depends on the data, a block full of zeros can compress pretty well, so your patch is too limiting IMO. > This patch can also fix wrong setting nocompression flag for > inode, say a case when @total_in is 4096, and then we get > @total_compressed 52,because we do aligment to page cache size > firstly, and then we get into conclusion @total_in=@total_compressed > thus we will clear this inode's compression flag. This is a bug but can be fixed without disabling compression of small blocks. I have a similar patch as part of the large compression update, the logic that decides if the small extent should be compressed or not depends on the compression algo and some typical data samples. for zlib it's around ~100 B and lzo at ~200 B. That's a boundary where compressed size == uncompressed, so there's no benefit, only additional overhead. -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Not really, you just miss inline part, say we compress a page to 50B, but this inode's data can not be inlined(see inline check), we still have to allocate 'blocksize'(min allocating unit) disk space and then write data and zero filled datas into disk. This patch only skips data can not be inlined, so i think this make senses. Thanks, Wang On 03/27/2014 02:10 AM, David Sterba wrote: > On Mon, Mar 24, 2014 at 05:58:10PM +0800, Wang Shilong wrote: >> To compress a small write(<=blocksize) dosen't save us >> disk space at all, skip it can save us some compression time. > The compressibility depends on the data, a block full of zeros can > compress pretty well, so your patch is too limiting IMO. > >> This patch can also fix wrong setting nocompression flag for >> inode, say a case when @total_in is 4096, and then we get >> @total_compressed 52,because we do aligment to page cache size >> firstly, and then we get into conclusion @total_in=@total_compressed >> thus we will clear this inode's compression flag. > This is a bug but can be fixed without disabling compression of small > blocks. > > I have a similar patch as part of the large compression update, the > logic that decides if the small extent should be compressed or not > depends on the compression algo and some typical data samples. for zlib > it's around ~100 B and lzo at ~200 B. That's a boundary where compressed > size == uncompressed, so there's no benefit, only additional overhead. > -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 03/24/2014 05:58 AM, Wang Shilong wrote: > To compress a small write(<=blocksize) dosen't save us > disk space at all, skip it can save us some compression time. > > This patch can also fix wrong setting nocompression flag for > inode, say a case when @total_in is 4096, and then we get > @total_compressed 52,because we do aligment to page cache size > firstly, and then we get into conclusion @total_in=@total_compressed > thus we will clear this inode's compression flag. > > An exception comes from inserting inline extent failure but we > still have @total_compressed < @total_in,so we will still reset > inode's flag, this is ok, because we don't have good compression > effect. > So your check for start > 0 || end + 1 < disk_i_size means we're only skipping compression for a small file range that isn't in an inline extent. Could you please update the patch description and comments in the code to reflect this? Thanks! -chris -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
2014-03-31 20:31 GMT+08:00 Chris Mason <clm@fb.com>: > > > On 03/24/2014 05:58 AM, Wang Shilong wrote: >> >> To compress a small write(<=blocksize) dosen't save us >> disk space at all, skip it can save us some compression time. >> >> This patch can also fix wrong setting nocompression flag for >> inode, say a case when @total_in is 4096, and then we get >> @total_compressed 52,because we do aligment to page cache size >> firstly, and then we get into conclusion @total_in=@total_compressed >> thus we will clear this inode's compression flag. >> >> An exception comes from inserting inline extent failure but we >> still have @total_compressed < @total_in,so we will still reset >> inode's flag, this is ok, because we don't have good compression >> effect. >> > > So your check for start > 0 || end + 1 < disk_i_size means we're only > skipping compression for a small file range that isn't in an inline extent. > Could you please update the patch description and comments in the code to > reflect this? No problem, i will update this patch.~_~ > > Thanks! > > -chris > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 0ec8766..d3eccd6 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -394,6 +394,15 @@ static noinline int compress_file_range(struct inode *inode, (start > 0 || end + 1 < BTRFS_I(inode)->disk_i_size)) btrfs_add_inode_defrag(NULL, inode); + /* + * if this is a small write(<=blocksize), we don't save + * disk space at all, don't compress which can save us some + * compression time. + */ + if ((end - start + 1) <= blocksize && + (start > 0 || end + 1 < BTRFS_I(inode)->disk_i_size)) + goto cleanup_and_bail_uncompressed; + actual_end = min_t(u64, isize, end + 1); again: will_compress = 0;
To compress a small write(<=blocksize) dosen't save us disk space at all, skip it can save us some compression time. This patch can also fix wrong setting nocompression flag for inode, say a case when @total_in is 4096, and then we get @total_compressed 52,because we do aligment to page cache size firstly, and then we get into conclusion @total_in=@total_compressed thus we will clear this inode's compression flag. An exception comes from inserting inline extent failure but we still have @total_compressed < @total_in,so we will still reset inode's flag, this is ok, because we don't have good compression effect. Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com> --- fs/btrfs/inode.c | 9 +++++++++ 1 file changed, 9 insertions(+)