linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jens Axboe <axboe@kernel.dk>
To: Christoph Hellwig <hch@lst.de>
Cc: Jeffle Xu <jefflexu@linux.alibaba.com>,
	Ming Lei <ming.lei@redhat.com>,
	Damien Le Moal <Damien.LeMoal@wdc.com>,
	linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: Re: switch block layer polling to a bio based model
Date: Mon, 26 Apr 2021 10:48:04 -0600	[thread overview]
Message-ID: <3c77394a-c6fc-8f58-302e-8e997adc8620@kernel.dk> (raw)
In-Reply-To: <20210426161503.GA30994@lst.de>

On 4/26/21 10:15 AM, Christoph Hellwig wrote:
> On Mon, Apr 26, 2021 at 09:12:09AM -0600, Jens Axboe wrote:
>> Here's the series. It's not super clean (yet), but basically allows
>> users like io_uring to setup a bio cache, and pass that in through
>> iocb->ki_bi_cache. With that, we can recycle them instead of going
>> through free+alloc continually. If you look at profiles for high iops,
>> we're spending more time than desired doing just that.
>>
>> https://git.kernel.dk/cgit/linux-block/log/?h=io_uring-bio-cache
> 
> So where do you spend the cycles?  The do not memset the whole bio
> optimization is pretty obvious and is someting we should do independent
> of the allocator.

memset is just a small optimization on top. If we look at current
profiles, the alloc+free looks something ala:

+    2.71%  io_uring  [kernel.vmlinux]  [k] bio_alloc_bioset
+    2.03%  io_uring  [kernel.vmlinux]  [k] kmem_cache_alloc

and

+    2.82%  io_uring  [kernel.vmlinux]  [k] __slab_free
+    1.73%  io_uring  [kernel.vmlinux]  [k] kmem_cache_free
     0.36%  io_uring  [kernel.vmlinux]  [k] mempool_free_slab
     0.27%  io_uring  [kernel.vmlinux]  [k] mempool_free

Which is a substantial amount of cycles that is needed just to
repeatedly use the same set of bios for doing IO. Using the caching
patchset, all of the above are completely eliminated, and the only thing
we dynamically allocate is a request which is a lot cheaper (ends up
being 1-2% for either kernel).

> The other thing that sucks is the mempool implementation, as it forces
> each allocation and free to do an indirect call.  I think it might be
> worth to try to frontend it with a normal slab cache and only fall back
> to the mempool if that fails.

Also minor I believe, but yes it'll eat cycles too. FWIW, the testing
above is done without RETPOLINE.

-- 
Jens Axboe


  reply	other threads:[~2021-04-26 16:48 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-26 13:48 switch block layer polling to a bio based model Christoph Hellwig
2021-04-26 13:48 ` [PATCH 01/12] direct-io: remove blk_poll support Christoph Hellwig
2021-04-26 13:48 ` [PATCH 02/12] block: don't try to poll multi-bio I/Os in __blkdev_direct_IO Christoph Hellwig
2021-04-26 13:48 ` [PATCH 03/12] iomap: don't try to poll multi-bio I/Os in __iomap_dio_rw Christoph Hellwig
2021-04-26 13:48 ` [PATCH 04/12] blk-mq: factor out a "classic" poll helper Christoph Hellwig
2021-04-26 13:48 ` [PATCH 05/12] blk-mq: factor out a blk_qc_to_hctx helper Christoph Hellwig
2021-04-26 13:48 ` [PATCH 06/12] blk-mq: refactor hybrid polling Christoph Hellwig
2021-04-26 13:48 ` [PATCH 07/12] blk-mq: remove blk_qc_t_to_tag and blk_qc_t_is_internal Christoph Hellwig
2021-04-26 13:48 ` [PATCH 08/12] blk-mq: remove blk_qc_t_valid Christoph Hellwig
2021-04-26 13:48 ` [PATCH 09/12] block: rename REQ_HIPRI to REQ_POLLED Christoph Hellwig
2021-04-26 13:48 ` [PATCH 10/12] block: RCU free polled bios Christoph Hellwig
2021-04-26 13:48 ` [PATCH 11/12] block: define 'struct bvec_iter' as packed Christoph Hellwig
2021-04-26 13:48 ` [PATCH 12/12] block: switch polling to be bio based Christoph Hellwig
2021-04-26 15:27   ` Ming Lei
2021-04-26 14:57 ` switch block layer polling to a bio based model Jens Axboe
2021-04-26 15:06   ` Christoph Hellwig
2021-04-26 15:12     ` Jens Axboe
2021-04-26 16:15       ` Christoph Hellwig
2021-04-26 16:48         ` Jens Axboe [this message]
2021-04-26 17:05   ` Christoph Hellwig
2021-04-26 17:18     ` Jens Axboe

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=3c77394a-c6fc-8f58-302e-8e997adc8620@kernel.dk \
    --to=axboe@kernel.dk \
    --cc=Damien.LeMoal@wdc.com \
    --cc=hch@lst.de \
    --cc=jefflexu@linux.alibaba.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=ming.lei@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).