Commit 12e5606c authored by Tomas Krizek's avatar Tomas Krizek

lua: stop trying to tweak lua's GC

cherry-picked from f0ca89ac, original author Vlada Cunat

TL;DR: I believe all lua_gc() calls stemmed from misunderstanding lua
documentation, and the current settings seem potentially dangerous.

First, let me rely on lua 5.1 docs, as luajit 2 is documented to have
done only minor changes in the GC.

Commit 5a709411 claims to have increased the speed of GC to 400 % of
speed of allocation, but LUA_GCSETSTEPMUL is the parameter that
controls that, and that one was lowered to 99 % and later in
0ee2d1d7 even to 50 %.  Documentation explicitly says that setting
the value under 100 % may cause problems.

The default values seem perfectly sane to me and currently I can't see
any particular reason to change them.  It's 200 % relative GC speed,
and waiting for allocated size to double before starting another cycle.

I assume the resulting possibility of GC being too slow caused the need
to explicitly force a non-incremental GC cycle once in a while, but
that seems not useful anymore and not good for latency.
parent 9fa9df98
Pipeline #53924 failed with stages
in 72 minutes and 36 seconds
......@@ -482,7 +482,6 @@ static int init_state(struct engine *engine)
return kr_error(ENOMEM);
/* Initialize used libraries. */
lua_gc(engine->L, LUA_GCSTOP, 0);
/* Global functions */
lua_pushcfunction(engine->L, l_help);
......@@ -733,12 +732,8 @@ int engine_load_defaults(struct engine *engine)
int engine_start(struct engine *engine)
/* Clean up stack and restart GC */
/* Clean up stack */
lua_settop(engine->L, 0);
lua_gc(engine->L, LUA_GCCOLLECT, 0);
lua_gc(engine->L, LUA_GCSETSTEPMUL, 50);
lua_gc(engine->L, LUA_GCSETPAUSE, 400);
lua_gc(engine->L, LUA_GCRESTART, 0);
return kr_ok();
......@@ -399,15 +399,6 @@ static void request_free(struct request_ctx *ctx)
/* Return mempool to ring or free it if it's full */
pool_release(worker, ctx->req.pool.ctx);
/* @note The 'task' is invalidated from now on. */
/* Decommit memory every once in a while */
static int mp_delete_count = 0;
if (++mp_delete_count == 100000) {
lua_gc(worker->engine->L, LUA_GCCOLLECT, 0);
#if defined(__GLIBC__) && defined(_GNU_SOURCE)
mp_delete_count = 0;
worker->stats.rconcurrent -= 1;
......@@ -1754,7 +1745,7 @@ int worker_end_tcp(struct session *session)
uv_handle_t *handle = session_get_handle(session);
struct worker_ctx *worker = handle->loop->data;
struct sockaddr *peer = session_get_peer(session);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment