Tarantool development patches archive
 help / color / mirror / Atom feed
From: Vladimir Davydov via Tarantool-patches <tarantool-patches@dev.tarantool.org>
To: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
Cc: tarantool-patches@dev.tarantool.org
Subject: Re: [Tarantool-patches] [PATCH 00/20] Rewrite performance critical parts of net.box in C
Date: Fri, 30 Jul 2021 13:04:12 +0300	[thread overview]
Message-ID: <20210730100412.r3m2hdqnhrzjmjpn@esperanza> (raw)
In-Reply-To: <6baa639d-8c94-000d-cd56-9189b3cc7dc9@tarantool.org>

On Fri, Jul 30, 2021 at 12:38:52AM +0200, Vladislav Shpilevoy wrote:
> >>>> Asynchronous calls don't show as much of an improvement as synchronous,
> >>>> because per each asynchronous call we still have to create a 'future'
> >>>> object in Lua. Still, the improvement is quite noticeable - 30% for
> >>>> REPLACE, 10% for UPDATE, 20% for SELECT, 25% for CALL.
> >>>
> >>> I didn't reach the end of the patchset yet, but did you try to create
> >>> the futures as cdata objects? They could be allocated on mempool, their
> >>> GC pressure might be optimized by doing similar to luaT_tuple_encode_table_ref
> >>> optimization (there was found a way to make __gc and other C functions
> >>> cheaper when it comes to amount of GC objects in Lua).
> >>>
> >>> The API would stay the same, they just would become C structs with
> >>> methods instead of Lua tables.
> >>
> >> Good call. Going to to try that. Thanks.
> > 
> > Quickly whipped up a patch that converts userdata and cdata. Applied on
> > top of the series. Surprisingly, it only made things worse:
> > 
> > With the patch (future is cdata):
> > 
> > ==== FUTURE ====
> >   REPLACE: WALL 221.182 PROC 343.368 KRPS
> >    UPDATE: WALL 178.918 PROC 291.504 KRPS
> >    SELECT: WALL 220.815 PROC 248.843 KRPS
> >      CALL: WALL 218.313 PROC 315.670 KRPS
> > 
> > 
> > Without the patch (future is userdata):
> > 
> > ==== FUTURE ====
> >   REPLACE: WALL 262.454 PROC 450.425 KRPS
> >    UPDATE: WALL 191.538 PROC 322.888 KRPS
> >    SELECT: WALL 288.498 PROC 333.393 KRPS
> >      CALL: WALL 247.463 PROC 375.180 KRPS
> > 
> > The patch is below. Note, it isn't entirely correct - future:pairs
> > doesn't work, because luaL_checkcdata doesn't seem to handle upvalues,
> > but it shouldn't affect the test.
> 
> Sorry, the patch can't be applied on top of the branch somewhy.
> 
> But I see now that you already had the futures as C objects even
> before my proposal on top of the branch, so perhaps this is expectable
> that not much improved.
> 
> However there is an idea which might make the perf gap smaller.
> 
> > @@ -1642,10 +1649,14 @@ netbox_perform_async_request_impl(struct lua_State *L, int idx,
> >  static int
> >  netbox_perform_async_request(struct lua_State *L)
> >  {
> > -	struct netbox_request *request = lua_newuserdata(L, sizeof(*request));
> > +	struct netbox_request *request = mempool_alloc(&netbox_request_pool);
> > +	if (request == NULL)
> > +		return luaL_error(L, "out of memory");
> >  	netbox_request_create(request);
> > -	luaL_getmetatable(L, netbox_request_typename);
> > -	lua_setmetatable(L, -2);
> > +	*(struct netbox_request **)
> > +		luaL_pushcdata(L, CTID_STRUCT_NETBOX_REQUEST_PTR) = request;
> > +	lua_pushcfunction(L, luaT_netbox_request_gc);
> 
> Here is the problem, which I mentioned in my email.
> 
> lua_pushcfunction() is an expensive thing because it pushes a new GC
> object on the stack every time. It was happening in a few hot places before,
> and there is now a solution that for such cfunctions we push them only once,
> remember their ref like luaT_tuple_encode_table_ref does, and then re-push
> the same finalizer for each cdata object.
> 
> See ec9a7fa7ebbb8fd6e15b9516875c3fd1a1f6dfee and
> e88c0d21ab765d4c53bed2437c49d77b3ffe4216.
> 
> You need to do
> 
> 	lua_pushcfunction(L, luaT_netbox_request_gc);
> 
> only once somewhere in netbox_init() or something. Then 
> 
> 	netbox_request_gc_ref = luaL_ref(L, LUA_REGISTRYINDEX);
> 
> Then in netbox_perform_async_request() you make
> 
> 	lua_rawgeti(L, LUA_REGISTRYINDEX, netbox_request_gc_ref);
> 	luaL_setcdatagc(L, -2);
> 
> I think this should help. But I doubt it will help too much
> though.

It does help, but the userdata implementation of the future object still
performs better:

* Userdata (original implementation)

  REPLACE: WALL 254.037 PROC 424.737 KRPS
   UPDATE: WALL 193.136 PROC 323.086 KRPS
   SELECT: WALL 354.040 PROC 428.211 KRPS
     CALL: WALL 275.215 PROC 449.326 KRPS

* Cdata; set gc function using lua_pushcfunction

  REPLACE: WALL 216.516 PROC 334.610 KRPS
   UPDATE: WALL 180.824 PROC 290.090 KRPS
   SELECT: WALL 261.858 PROC 301.944 KRPS
     CALL: WALL 244.465 PROC 372.902 KRPS

* Cdata; set gc function using lua_rawgeti

  REPLACE: WALL 237.665 PROC 381.624 KRPS
   UPDATE: WALL 184.152 PROC 298.147 KRPS
   SELECT: WALL 299.181 PROC 350.282 KRPS
     CALL: WALL 263.745 PROC 419.355 KRPS

The patches turning the future object into cdata are available on
the following branch:

https://github.com/tarantool/tarantool/tree/vdavydov/net-box-optimization-cdata-request

  reply	other threads:[~2021-07-30 10:04 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-23 11:07 Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 01/20] net.box: fix console connection breakage when request is discarded Vladimir Davydov via Tarantool-patches
2021-07-28 22:49   ` Vladislav Shpilevoy via Tarantool-patches
2021-07-29 10:40     ` Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 02/20] net.box: wake up wait_result callers " Vladimir Davydov via Tarantool-patches
2021-07-29 10:47   ` Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 03/20] net.box: do not check worker_fiber in request:result, is_ready Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 04/20] net.box: remove decode_push from method_decoder table Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 05/20] net.box: use decode_tuple instead of decode_get Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 06/20] net.box: rename request.ctx to request.format Vladimir Davydov via Tarantool-patches
2021-07-28 22:49   ` Vladislav Shpilevoy via Tarantool-patches
2021-07-29 10:54     ` Vladimir Davydov via Tarantool-patches
2021-07-29 22:39       ` Vladislav Shpilevoy via Tarantool-patches
2021-07-30  8:15         ` Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 07/20] net.box: use integer id instead of method name Vladimir Davydov via Tarantool-patches
2021-07-28 22:50   ` Vladislav Shpilevoy via Tarantool-patches
2021-07-29 11:30     ` Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 08/20] net.box: remove useless encode optimization Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 09/20] net.box: rewrite request encoder in C Vladimir Davydov via Tarantool-patches
2021-07-28 22:51   ` Vladislav Shpilevoy via Tarantool-patches
2021-07-29 14:08     ` Vladimir Davydov via Tarantool-patches
2021-07-29 14:10       ` Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 10/20] lua/utils: make char ptr Lua CTIDs public Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 11/20] net.box: rewrite response decoder in C Vladimir Davydov via Tarantool-patches
2021-07-27 14:07   ` Cyrill Gorcunov via Tarantool-patches
2021-07-27 14:14     ` Vladimir Davydov via Tarantool-patches
2021-07-29 22:39   ` Vladislav Shpilevoy via Tarantool-patches
2021-07-30  8:44     ` Vladimir Davydov via Tarantool-patches
2021-07-30 22:12       ` Vladislav Shpilevoy via Tarantool-patches
2021-08-02  7:36         ` Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 12/20] net.box: rewrite error " Vladimir Davydov via Tarantool-patches
2021-07-30 22:13   ` Vladislav Shpilevoy via Tarantool-patches
2021-08-02  8:00     ` Vladimir Davydov via Tarantool-patches
2021-08-02 21:47       ` Vladislav Shpilevoy via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 13/20] net.box: rewrite send_and_recv_{iproto, console} " Vladimir Davydov via Tarantool-patches
2021-08-02 21:49   ` Vladislav Shpilevoy via Tarantool-patches
2021-08-03 15:44     ` Vladimir Davydov via Tarantool-patches
2021-08-03 23:06       ` Vladislav Shpilevoy via Tarantool-patches
2021-08-04 13:56         ` Vladimir Davydov via Tarantool-patches
2021-08-04 21:18           ` Vladislav Shpilevoy via Tarantool-patches
2021-08-05  8:37             ` Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 14/20] net.box: rename netbox_{prepare, encode}_request to {begin, end} Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 15/20] net.box: rewrite request implementation in C Vladimir Davydov via Tarantool-patches
2021-08-02 21:54   ` Vladislav Shpilevoy via Tarantool-patches
2021-08-04 12:30     ` Vladimir Davydov via Tarantool-patches
2021-08-04 15:35       ` Vladimir Davydov via Tarantool-patches
2021-08-04 16:14         ` Vladimir Davydov via Tarantool-patches
2021-08-04 21:20       ` Vladislav Shpilevoy via Tarantool-patches
2021-08-05 12:46         ` Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 16/20] net.box: store next_request_id in C code Vladimir Davydov via Tarantool-patches
2021-08-03 23:06   ` Vladislav Shpilevoy via Tarantool-patches
2021-08-04 16:25     ` Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 17/20] net.box: rewrite console handlers in C Vladimir Davydov via Tarantool-patches
2021-08-03 23:07   ` Vladislav Shpilevoy via Tarantool-patches
2021-08-05 11:53     ` Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 18/20] net.box: rewrite iproto " Vladimir Davydov via Tarantool-patches
2021-08-03 23:08   ` Vladislav Shpilevoy via Tarantool-patches
2021-08-05 11:54     ` Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 19/20] net.box: merge new_id, new_request and encode_method Vladimir Davydov via Tarantool-patches
2021-08-03 23:08   ` Vladislav Shpilevoy via Tarantool-patches
2021-08-05 11:55     ` Vladimir Davydov via Tarantool-patches
2021-07-23 11:07 ` [Tarantool-patches] [PATCH 20/20] net.box: do not create request object in Lua for sync requests Vladimir Davydov via Tarantool-patches
2021-08-03 23:09   ` Vladislav Shpilevoy via Tarantool-patches
2021-08-05 12:23     ` Vladimir Davydov via Tarantool-patches
2021-07-23 12:48 ` [Tarantool-patches] [PATCH 00/20] Rewrite performance critical parts of net.box in C Vladimir Davydov via Tarantool-patches
2021-07-26  7:26 ` Kirill Yukhin via Tarantool-patches
2021-07-27  9:59   ` Vladimir Davydov via Tarantool-patches
2021-07-28 22:51 ` Vladislav Shpilevoy via Tarantool-patches
2021-07-29 11:33   ` Vladimir Davydov via Tarantool-patches
2021-07-29 15:23     ` Vladimir Davydov via Tarantool-patches
2021-07-29 22:38       ` Vladislav Shpilevoy via Tarantool-patches
2021-07-30 10:04         ` Vladimir Davydov via Tarantool-patches [this message]
2021-07-29 22:40 ` Vladislav Shpilevoy via Tarantool-patches
2021-07-30  8:16   ` Vladimir Davydov via Tarantool-patches
2021-08-03 23:05 ` Vladislav Shpilevoy via Tarantool-patches
2021-08-04 12:40   ` Vladimir Davydov via Tarantool-patches
2021-08-05 20:59 ` Vladislav Shpilevoy via Tarantool-patches
2021-08-09 11:22 ` Igor Munkin via Tarantool-patches
2021-08-09 11:48   ` Vitaliia Ioffe via Tarantool-patches
2021-08-09 13:56     ` Vladimir Davydov via Tarantool-patches

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=20210730100412.r3m2hdqnhrzjmjpn@esperanza \
    --to=tarantool-patches@dev.tarantool.org \
    --cc=v.shpilevoy@tarantool.org \
    --cc=vdavydov@tarantool.org \
    --subject='Re: [Tarantool-patches] [PATCH 00/20] Rewrite performance critical parts of net.box in C' \
    /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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox