summaryrefslogtreecommitdiffstats
path: root/src/libserver
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2019-05-10 17:40:39 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2019-05-10 17:40:39 +0100
commitb218ec15bdae237f5ec9f23821239c29e2d3757d (patch)
tree8c4ccd4c745c7590497e44cc3b16832b2a4657cb /src/libserver
parentbc8a0fe1d5f55e6ec47200028a027d1843d6306d (diff)
downloadrspamd-b218ec15bdae237f5ec9f23821239c29e2d3757d.tar.gz
rspamd-b218ec15bdae237f5ec9f23821239c29e2d3757d.zip
[Minor] Allow to tune GC related options
Diffstat (limited to 'src/libserver')
-rw-r--r--src/libserver/cfg_file.h3
-rw-r--r--src/libserver/cfg_rcl.c18
-rw-r--r--src/libserver/cfg_utils.c8
-rw-r--r--src/libserver/task.c6
4 files changed, 32 insertions, 3 deletions
diff --git a/src/libserver/cfg_file.h b/src/libserver/cfg_file.h
index 8a1798b97..eccab1217 100644
--- a/src/libserver/cfg_file.h
+++ b/src/libserver/cfg_file.h
@@ -432,6 +432,9 @@ struct rspamd_config {
guint words_decay; /**< limit for words for starting adaptive ignoring */
guint history_rows; /**< number of history rows stored */
guint max_sessions_cache; /**< maximum number of sessions cache elts */
+ guint lua_gc_step; /**< lua gc step */
+ guint lua_gc_pause; /**< lua gc pause */
+ guint full_gc_iters; /**< iterations between full gc cycle */
GList *classify_headers; /**< list of headers using for statistics */
struct module_s **compiled_modules; /**< list of compiled C modules */
diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c
index 20bf7a7c6..9df9e4aa1 100644
--- a/src/libserver/cfg_rcl.c
+++ b/src/libserver/cfg_rcl.c
@@ -2127,6 +2127,24 @@ rspamd_rcl_config_init (struct rspamd_config *cfg, GHashTable *skip_sections)
G_STRUCT_OFFSET (struct rspamd_config, task_timeout),
RSPAMD_CL_FLAG_TIME_FLOAT,
"Maximum time for checking a message (alias for task_timeout)");
+ rspamd_rcl_add_default_handler (sub,
+ "lua_gc_step",
+ rspamd_rcl_parse_struct_integer,
+ G_STRUCT_OFFSET (struct rspamd_config, lua_gc_step),
+ RSPAMD_CL_FLAG_UINT,
+ "Lua garbage-collector step (default: 200)");
+ rspamd_rcl_add_default_handler (sub,
+ "lua_gc_pause",
+ rspamd_rcl_parse_struct_integer,
+ G_STRUCT_OFFSET (struct rspamd_config, lua_gc_pause),
+ RSPAMD_CL_FLAG_UINT,
+ "Lua garbage-collector pause (default: 200)");
+ rspamd_rcl_add_default_handler (sub,
+ "full_gc_iters",
+ rspamd_rcl_parse_struct_integer,
+ G_STRUCT_OFFSET (struct rspamd_config, full_gc_iters),
+ RSPAMD_CL_FLAG_UINT,
+ "Task scanned before memory gc is performed (default: 0 - disabled)");
/* Neighbours configuration */
rspamd_rcl_add_section_doc (&sub->subsections, "neighbours", "name",
diff --git a/src/libserver/cfg_utils.c b/src/libserver/cfg_utils.c
index 308fb654e..265e575a7 100644
--- a/src/libserver/cfg_utils.c
+++ b/src/libserver/cfg_utils.c
@@ -49,6 +49,9 @@
#define DEFAULT_MAX_WORKERS 4
/* Timeout for task processing */
#define DEFAULT_TASK_TIMEOUT 8.0
+#define DEFAULT_LUA_GC_STEP 200
+#define DEFAULT_LUA_GC_PAUSE 200
+#define DEFAULT_GC_MAXITERS 0
struct rspamd_ucl_map_cbdata {
struct rspamd_config *cfg;
@@ -200,6 +203,11 @@ rspamd_config_new (enum rspamd_config_init_flags flags)
cfg->min_word_len = DEFAULT_MIN_WORD;
cfg->max_word_len = DEFAULT_MAX_WORD;
+ /* GC limits */
+ cfg->lua_gc_pause = DEFAULT_LUA_GC_PAUSE;
+ cfg->lua_gc_step = DEFAULT_LUA_GC_STEP;
+ cfg->full_gc_iters = DEFAULT_GC_MAXITERS;
+
if (!(flags & RSPAMD_CONFIG_INIT_SKIP_LUA)) {
cfg->lua_state = rspamd_lua_init (flags & RSPAMD_CONFIG_INIT_WIPE_LUA_MEM);
cfg->own_lua_state = TRUE;
diff --git a/src/libserver/task.c b/src/libserver/task.c
index abe8143bc..a7c1bc478 100644
--- a/src/libserver/task.c
+++ b/src/libserver/task.c
@@ -242,7 +242,6 @@ rspamd_task_free (struct rspamd_task *task)
struct rspamd_email_address *addr;
struct rspamd_lua_cached_entry *entry;
static guint free_iters = 0;
- const guint free_iters_limit = 5000;
GHashTableIter it;
gpointer k, v;
guint i;
@@ -351,7 +350,7 @@ rspamd_task_free (struct rspamd_task *task)
g_hash_table_unref (task->lua_cache);
}
- if (++free_iters > free_iters_limit) {
+ if (task->cfg->full_gc_iters && (++free_iters > task->cfg->full_gc_iters)) {
/* Perform more expensive cleanup cycle */
gsize allocated = 0, active = 0, metadata = 0,
resident = 0, mapped = 0, old_lua_mem = 0;
@@ -381,7 +380,8 @@ rspamd_task_free (struct rspamd_task *task)
allocated, active, metadata, resident, mapped,
old_lua_mem, lua_gc (task->cfg->lua_state, LUA_GCCOUNT, 0),
(t2 - t1) * 1000.0);
- free_iters = rspamd_time_jitter (0, (gdouble)free_iters_limit / 2);
+ free_iters = rspamd_time_jitter (0,
+ (gdouble)task->cfg->full_gc_iters / 2);
}
REF_RELEASE (task->cfg);