Commit f0ca89ac authored by Vladimír Čunát's avatar Vladimír Čunát

lua: stop trying to tweak lua's GC

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 e806158a
Pipeline #1708 passed with stages
in 1 minute and 39 seconds
......@@ -523,7 +523,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);
......@@ -740,12 +739,8 @@ int engine_start(struct engine *engine, const char *config_path)
return ret;
/* 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);
/* Set up periodic update function */
uv_timer_t *timer = malloc(sizeof(*timer));
......@@ -313,15 +313,6 @@ static void qr_task_free(struct qr_task *task)
/* Return mempool to ring or free it if it's full */
pool_release(worker, task->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;
static int qr_task_start(struct qr_task *task, knot_pkt_t *query)
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