All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pavel Begunkov <asml.silence@gmail.com>
To: Jens Axboe <axboe@kernel.dk>, io-uring@vger.kernel.org
Subject: Re: [RFC 0/2] 3 cacheline io_kiocb
Date: Sat, 25 Jul 2020 23:14:23 +0300	[thread overview]
Message-ID: <8203a1c1-ecf4-1890-d1f0-6cb135cba8cf@gmail.com> (raw)
In-Reply-To: <b0ca655f-96ed-a249-6371-bea409b1f065@kernel.dk>

 On 25/07/2020 22:40, Jens Axboe wrote:
> On 7/25/20 12:24 PM, Pavel Begunkov wrote:
>> On 25/07/2020 18:45, Jens Axboe wrote:
>>> On 7/25/20 2:31 AM, Pavel Begunkov wrote:
>>>> That's not final for a several reasons, but good enough for discussion.
>>>> That brings io_kiocb down to 192B. I didn't try to benchmark it
>>>> properly, but quick nop test gave +5% throughput increase.
>>>> 7531 vs 7910 KIOPS with fio/t/io_uring
>>>>
>>>> The whole situation is obviously a bunch of tradeoffs. For instance,
>>>> instead of shrinking it, we can inline apoll to speed apoll path.
>>>>
>>>> [2/2] just for a reference, I'm thinking about other ways to shrink it.
>>>> e.g. ->link_list can be a single-linked list with linked tiemouts
>>>> storing a back-reference. This can turn out to be better, because
>>>> that would move ->fixed_file_refs to the 2nd cacheline, so we won't
>>>> ever touch 3rd cacheline in the submission path.
>>>> Any other ideas?
>>>
>>> Nothing noticeable for me, still about the same performance. But
>>> generally speaking, I don't necessarily think we need to go all in on
>>> making this as tiny as possible. It's much more important to chase the
>>> items where we only use 2 cachelines for the hot path, and then we have
>>> the extra space in there already for the semi hot paths like poll driven
>>> retry. Yes, we're still allocating from a pool that has slightly larger
>>> objects, but that doesn't really matter _that_ much. Avoiding an extra
>>> kmalloc+kfree for the semi hot paths are a bigger deal than making
>>> io_kiocb smaller and smaller.
>>>
>>> That said, for no-brainer changes, we absolutely should make it smaller.
>>> I just don't want to jump through convoluted hoops to get there.
>>
>> Agree, but that's not the end goal. The first point is to kill the union,
>> but it already has enough space for that.
> 
> Right
> 
>> The second is to see, whether we can use the space in a better way. From
>> the high level perspective ->apoll and ->work are alike and both serve to
>> provide asynchronous paths, hence the idea to swap them naturally comes to
>> mind.
> 
> Totally agree, which is why the union of those kind of makes sense.
> We're definitely NOT using them at the same time, but the fact that we
> had various mm/creds/whatnot in the work_struct made that a bit iffy.

Thinking of it, if combined with work de-init as you proposed before, it's
probably possible to make a layout similar to the one below

struct io_kiocb {
	...
	struct hlist_node	hash_node;
	struct callback_head	task_work;	
	union {
		struct io_wq_work	work;
		struct async_poll	apoll;
	};
};

Saves ->apoll kmalloc(), and the actual work de-init would be negligibly
rare. Worth to try


> 
>> TBH, I don't think it'd do much, because init of ->io would probably
>> hide any benefit.
> 
> There should be no ->io init/alloc for this test case.

I mean, before getting into io_arm_poll_handler(), it should get -EAGAIN
in io_{read,write}() and initialise ->io in io_setup_async_rw(), at least
for READV, WRITEV.

-- 
Pavel Begunkov

  reply	other threads:[~2020-07-25 20:16 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-25  8:31 [RFC 0/2] 3 cacheline io_kiocb Pavel Begunkov
2020-07-25  8:31 ` [PATCH 1/2] io_uring: allocate req->work dynamically Pavel Begunkov
2020-07-25  8:31 ` [PATCH 2/2] io_uring: unionise ->apoll and ->work Pavel Begunkov
2020-07-25 15:45 ` [RFC 0/2] 3 cacheline io_kiocb Jens Axboe
2020-07-25 18:24   ` Pavel Begunkov
2020-07-25 19:40     ` Jens Axboe
2020-07-25 20:14       ` Pavel Begunkov [this message]
2020-07-25 20:25         ` 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=8203a1c1-ecf4-1890-d1f0-6cb135cba8cf@gmail.com \
    --to=asml.silence@gmail.com \
    --cc=axboe@kernel.dk \
    --cc=io-uring@vger.kernel.org \
    /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.