All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Sandeen <sandeen@redhat.com>
To: Greg Freemyer <greg.freemyer@gmail.com>
Cc: Lukas Czerner <lczerner@redhat.com>,
	linux-ext4@vger.kernel.org, Jeff Moyer <jmoyer@redhat.com>,
	Edward Shishkin <eshishki@redhat.com>,
	Eric Sandeen <esandeen@redhat.com>,
	Ric Wheeler <rwheeler@redhat.com>, Mark Lord <liml@rtr.ca>
Subject: Re: Ext4: batched discard support
Date: Mon, 19 Apr 2010 11:30:09 -0500	[thread overview]
Message-ID: <4BCC8511.2070402@redhat.com> (raw)
In-Reply-To: <h2o87f94c371004190920h5e793818x4113da75dd21da8b@mail.gmail.com>

Greg Freemyer wrote:
> Adding Mark Lord in cc.
> 
> He wrote a preliminary discard solution last summer.  I'm not sure how
> it has progressed.

The difference here is that Mark's stuff wasn't as tightly integrated
with the kernel, IIRC.  What I saw was more at a user level - make a big
file, map it, discard all the blocks, unlink the file.

It was a good first step, but I think we can do a lot better by using
fs-specific calls to be efficient & targeted about the discards.

Christoph has a similar approach for XFS, FWIW.

-Eric

> Mark, you can find the 2 patches at:
> 
> http://patchwork.ozlabs.org/patch/50441/
> http://patchwork.ozlabs.org/patch/50442/
> 
> Greg
> 
> On Mon, Apr 19, 2010 at 6:55 AM, Lukas Czerner <lczerner@redhat.com> wrote:
>> Hi all,
>>
>> I would like to present a new way to deal with TRIM in ext4 file system.
>> The current solution is not ideal because of its bad performance impact.
>> So basic idea to improve things is to avoid discarding every time some
>> blocks are freed. and instead batching is together into bigger trims,
>> which tends to be more effective.
>>
>> The basic idea behind my discard support is to create an ioctl which
>> walks through all the free extents in each allocating group and discard
>> those extents. As an addition to improve its performance one can specify
>> minimum free extent length, so ioctl will not bother with shorter extents.
>>
>> This of course means, that with each invocation the ioctl must walk
>> through whole file system, checking and discarding free extents, which
>> is not very efficient. The best way to avoid this is to keep track of
>> deleted (freed) blocks. Then the ioctl have to trim just those free
>> extents which were recently freed.
>>
>> In order to implement this I have added new bitmap into ext4_group_info
>> (bb_bitmap_deleted) which stores recently freed blocks. The ioctl then
>> walk through bb_bitmap_deleted, compare deleted extents with free
>> extents trim them and then removes it from the bb_bitmap_deleted.
>>
>> But you may notice, that there is one problem. bb_bitmap_deleted does
>> not survive umount. To bypass the problem the first ioctl call have to
>> walk through whole file system trimming all free extents. But there is a
>> better solution to this problem. The bb_bitmap_deleted can be stored on
>> disk an can be restored in mount time along with other bitmaps, but I
>> think it is a quite big change and should be discussed further.
>>
>> I have also benchmarked it a little. You can find results here:
>>
>> people.redhat.com/jmoyer/discard/ext4_batched_discard/
>>
>> comparison with current solution included. Keep in mind that ideal ioctl
>> invocation interval is yet to be determined, so in benchmark I have used
>> the performance-worst scenario - without any sleep between execution.
>>
>>
>> There are two patches for this. The first one just creates file system
>> independent ioctl for this and the second one it the batched discard
>> support itself.
>>
>> I will very much appreciate any comment on this, your opinions, ideas to
>> make this better etc. Thanks.
>>
>> If you want to try it, just create EXT4 file system mount it and invoke
>> ioctl on the mount point. You can use following code for this (I have
>> taken this from xfs patch for the same thing). You can also see some
>> debugging messages, but you may want to set EXT4FS_DEBUG for this.
>>
>> #include <errno.h>
>> #include <fcntl.h>
>> #include <stdio.h>
>> #include <stdint.h>
>> #include <sys/ioctl.h>
>>
>> #define FITRIM          _IOWR('X', 121, int)
>>
>> int main(int argc, char **argv)
>> {
>>        int minsize = 4096;
>>        int fd;
>>
>>        if (argc != 2) {
>>                fprintf(stderr, "usage: %s mountpoint\n", argv[0]);
>>                return 1;
>>        }
>>
>>        fd = open(argv[1], O_RDONLY);
>>        if (fd < 0) {
>>                perror("open");
>>                return 1;
>>        }
>>
>>        if (ioctl(fd, FITRIM, &minsize)) {
>>                if (errno == EOPNOTSUPP)
>>                        fprintf(stderr, "TRIM not supported\n");
>>                else
>>                        perror("EXT4_IOC_TRIM");
>>                return 1;
>>        }
>>
>>        return 0;
>> }
>>
>>  fs/ioctl.c         |   31 +++++++++++++++++++++++++++++++
>>  include/linux/fs.h |    2 ++
>>  2 files changed, 33 insertions(+), 0 deletions(-)
>>
>>  fs/ext4/ext4.h    |    4 +
>>  fs/ext4/mballoc.c |  207 ++++++++++++++++++++++++++++++++++++++++++++++++++---
>>  fs/ext4/super.c   |    1 +
>>  3 files changed, 202 insertions(+), 10 deletions(-)
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>


  reply	other threads:[~2010-04-19 16:56 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-04-19 10:55 Ext4: batched discard support Lukas Czerner
2010-04-19 10:55 ` [PATCH 1/2] Add ioctl FITRIM Lukas Czerner
2010-04-19 10:55   ` [PATCH 2/2] Add batched discard support for ext4 Lukas Czerner
2010-04-20 21:21     ` Greg Freemyer
2010-04-21  2:26       ` Mark Lord
2010-04-21  2:45         ` Eric Sandeen
2010-04-21 18:59           ` Greg Freemyer
2010-04-21 19:04             ` Ric Wheeler
2010-04-21 19:22               ` Jeff Moyer
2010-04-21 20:44                 ` Greg Freemyer
2010-04-21 20:53                   ` Greg Freemyer
2010-04-21 21:01                   ` Eric Sandeen
2010-04-21 21:03                     ` Ric Wheeler
2010-04-21 21:47                       ` Greg Freemyer
2010-04-21 21:56                         ` James Bottomley
2010-04-21 21:59                         ` Mark Lord
2010-04-23  8:23                   ` Lukas Czerner
2010-04-24 13:24                     ` Greg Freemyer
2010-04-24 13:48                       ` Ric Wheeler
2010-04-24 14:30                         ` Greg Freemyer
2010-04-24 14:43                           ` Eric Sandeen
2010-04-24 15:03                             ` Greg Freemyer
2010-04-24 17:04                               ` Ric Wheeler
2010-04-24 18:30                                 ` Greg Freemyer
2010-04-24 18:41                                   ` Ric Wheeler
2010-04-26 14:00                                     ` Mark Lord
2010-04-26 14:42                                       ` Martin K. Petersen
2010-04-26 15:27                                         ` Greg Freemyer
2010-04-26 15:51                                           ` Lukas Czerner
2010-04-28  1:25                                           ` Mark Lord
2010-04-26 15:48                                         ` Ric Wheeler
2010-04-24 19:06                                   ` Martin K. Petersen
2010-04-26 14:03                                     ` Mark Lord
2010-04-24 18:39                       ` Martin K. Petersen
2010-04-26 16:55                     ` Jan Kara
2010-04-26 17:46                       ` Lukas Czerner
2010-04-26 17:52                         ` Ric Wheeler
2010-04-26 18:14                           ` Lukas Czerner
2010-04-26 18:28                             ` Jeff Moyer
2010-04-26 18:38                               ` [PATCH 2/2] Add batched discard support for ext4 - using rbtree Lukas Czerner
2010-04-26 18:42                                 ` Lukas Czerner
2010-04-27 15:29                                   ` Edward Shishkin
2010-04-21 20:52                 ` [PATCH 2/2] Add batched discard support for ext4 Greg Freemyer
2010-04-19 16:20 ` Ext4: batched discard support Greg Freemyer
2010-04-19 16:30   ` Eric Sandeen [this message]
2010-04-19 17:58     ` Greg Freemyer
2010-04-19 18:04       ` Ric Wheeler
2010-04-20 20:24   ` Mark Lord
2010-04-20 20:34     ` Mark Lord

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4BCC8511.2070402@redhat.com \
    --to=sandeen@redhat.com \
    --cc=esandeen@redhat.com \
    --cc=eshishki@redhat.com \
    --cc=greg.freemyer@gmail.com \
    --cc=jmoyer@redhat.com \
    --cc=lczerner@redhat.com \
    --cc=liml@rtr.ca \
    --cc=linux-ext4@vger.kernel.org \
    --cc=rwheeler@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.