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.
http://www.lua.org/manual/5.1/manual.html#lua_gc
http://wiki.luajit.org/New-Garbage-Collector#rationale
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.
return kr_error(ENOMEM);
}
/* Initialize used libraries. */
- lua_gc(engine->L, LUA_GCSTOP, 0);
luaL_openlibs(engine->L);
/* Global functions */
lua_pushcfunction(engine->L, l_help);
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();
}
/* 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)
- malloc_trim(0);
-#endif
- mp_delete_count = 0;
- }
worker->stats.rconcurrent -= 1;
}
}
session_timer_stop(session);
-
+
uv_handle_t *handle = session_get_handle(session);
struct worker_ctx *worker = handle->loop->data;
struct sockaddr *peer = session_get_peer(session);