From 4732f7c4d6faee0e70e36f8b59cc763a11e0e1e7 Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Fri, 4 May 2007 07:34:10 +0000 Subject: [PATCH] config settings for rrset cache. git-svn-id: file:///svn/unbound/trunk@279 be551aaa-1e26-0410-a405-d3ace91eadb9 --- daemon/unbound.c | 12 ++++++++++++ doc/Changelog | 1 + doc/example.conf | 10 +++++++++- doc/unbound.conf.5 | 5 +++++ util/config_file.c | 17 +++++++++++------ util/config_file.h | 4 ++++ util/configlexer.lex | 2 ++ util/configparser.y | 30 ++++++++++++++++++++++++++++-- 8 files changed, 72 insertions(+), 9 deletions(-) diff --git a/daemon/unbound.c b/daemon/unbound.c index e03cf67c5..fa6fc8474 100644 --- a/daemon/unbound.c +++ b/daemon/unbound.c @@ -93,6 +93,18 @@ apply_dir(struct daemon* daemon, struct config_file* cfg, int cmdline_verbose) fatal_exit("malloc failure updating config settings"); } } + if(cfg->rrset_cache_size != slabhash_get_size(daemon->rrset_cache) || + cfg->rrset_cache_slabs != daemon->rrset_cache->size) { + slabhash_delete(daemon->rrset_cache); + daemon->rrset_cache = slabhash_create(cfg->rrset_cache_slabs, + HASH_DEFAULT_STARTARRAY, cfg->rrset_cache_size, + ub_rrset_sizefunc, ub_rrset_compare, + ub_rrset_key_delete, rrset_data_delete, + &daemon->superalloc); + if(!daemon->rrset_cache) { + fatal_exit("malloc failure updating config settings"); + } + } } /** Read existing pid from pidfile. */ diff --git a/doc/Changelog b/doc/Changelog index 5217cec4e..501d65ba5 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,5 +1,6 @@ 4 May 2007: Wouter - msgreply sizefunc is more accurate. + - config settings for rrset cache size and slabs. 3 May 2007: Wouter - fill refs. Use new parse and encode to answer queries. diff --git a/doc/example.conf b/doc/example.conf index 10e71087c..25bd71e42 100644 --- a/doc/example.conf +++ b/doc/example.conf @@ -49,9 +49,17 @@ server: # msg-cache-slabs: 4 # the number of queries that a thread gets to service. - # this must be a power of 2. # num-queries-per-thread: 1024 + # the amount of memory to use for the RRset cache. + # in bytes. default is 4 Mb + # rrset-cache-size: 4194304 + + # the number of slabs to use for the RRset cache. + # the number of slabs must be a power of 2. + # more slabs reduce lock contention, but fragment memory usage. + # rrset-cache-slabs: 4 + # Enable IPv4, "yes" or "no". # do-ip4: yes diff --git a/doc/unbound.conf.5 b/doc/unbound.conf.5 index 63f11995f..e6dd79c62 100644 --- a/doc/unbound.conf.5 +++ b/doc/unbound.conf.5 @@ -71,6 +71,11 @@ Must be set to a power of 2. Setting (close) to the number of cpus is a reasonable guess. .It \fBnum-queries-per-thread:\fR The number of queries that every thread will service simultaneously. +.It \fBrrset-cache-size:\fR +Number of bytes size of the RRset cache. Default is 4 megabytes. +.It \fBrrset-cache-slabs:\fR +Number of slabs in the RRset cache. Slabs reduce lock contention by threads. +Must be set to a power of 2. .It \fBdo-ip4:\fR Enable or disable whether ip4 queries are answered. Default is yes. .It \fBdo-ip6:\fR diff --git a/util/config_file.c b/util/config_file.c index b14785691..113f9abba 100644 --- a/util/config_file.c +++ b/util/config_file.c @@ -80,17 +80,22 @@ config_create() cfg->msg_cache_size = 4 * 1024 * 1024; cfg->msg_cache_slabs = 4; cfg->num_queries_per_thread = 1024; - if(!(cfg->fwd_address = strdup(""))) {config_delete(cfg); return NULL;} - if(!(cfg->username = strdup(""))) {config_delete(cfg); return NULL;} - if(!(cfg->chrootdir = strdup(""))) {config_delete(cfg); return NULL;} - if(!(cfg->directory = strdup("/etc/unbound"))) {config_delete(cfg); return NULL;} - if(!(cfg->logfile = strdup(""))) {config_delete(cfg); return NULL;} - if(!(cfg->pidfile = strdup("unbound.pid"))) {config_delete(cfg); return NULL;} + cfg->rrset_cache_size = 4 * 1024 * 1024; + cfg->rrset_cache_slabs = 4; + if(!(cfg->fwd_address = strdup(""))) goto error_exit; + if(!(cfg->username = strdup(""))) goto error_exit; + if(!(cfg->chrootdir = strdup(""))) goto error_exit; + if(!(cfg->directory = strdup("/etc/unbound"))) goto error_exit; + if(!(cfg->logfile = strdup(""))) goto error_exit; + if(!(cfg->pidfile = strdup("unbound.pid"))) goto error_exit; cfg->fwd_port = UNBOUND_DNS_PORT; cfg->do_daemonize = 1; cfg->num_ifs = 0; cfg->ifs = NULL; return cfg; +error_exit: + config_delete(cfg); + return NULL; } /** initialize the global cfg_parser object. */ diff --git a/util/config_file.h b/util/config_file.h index be722077e..f4837de40 100644 --- a/util/config_file.h +++ b/util/config_file.h @@ -75,6 +75,10 @@ struct config_file { size_t msg_cache_slabs; /** number of queries every thread can service */ size_t num_queries_per_thread; + /** size of the rrset cache */ + size_t rrset_cache_size; + /** slabs in the rrset cache */ + size_t rrset_cache_slabs; /** forwarder address. string. If not NULL fwder mode is enabled. */ char* fwd_address; diff --git a/util/configlexer.lex b/util/configlexer.lex index 93b562280..639ec7e03 100644 --- a/util/configlexer.lex +++ b/util/configlexer.lex @@ -116,6 +116,8 @@ logfile{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_LOGFILE;} pidfile{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_PIDFILE;} msg-cache-size{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_MSG_CACHE_SIZE;} msg-cache-slabs{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_MSG_CACHE_SLABS;} +rrset-cache-size{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_RRSET_CACHE_SIZE;} +rrset-cache-slabs{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_RRSET_CACHE_SLABS;} num-queries-per-thread{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_NUM_QUERIES_PER_THREAD;} {NEWLINE} { LEXOUT(("NL\n")); cfg_parser->line++;} diff --git a/util/configparser.y b/util/configparser.y index 1ef486d83..f483ecdac 100644 --- a/util/configparser.y +++ b/util/configparser.y @@ -73,6 +73,7 @@ extern struct config_parser_state* cfg_parser; %token VAR_FORWARD_TO VAR_FORWARD_TO_PORT VAR_CHROOT %token VAR_USERNAME VAR_DIRECTORY VAR_LOGFILE VAR_PIDFILE %token VAR_MSG_CACHE_SIZE VAR_MSG_CACHE_SLABS VAR_NUM_QUERIES_PER_THREAD +%token VAR_RRSET_CACHE_SIZE VAR_RRSET_CACHE_SLABS %% toplevelvars: /* empty */ | toplevelvars toplevelvar ; @@ -87,14 +88,17 @@ serverstart: VAR_SERVER cfg_parser->server_settings_seen = 1; } ; -contents_server: contents_server content_server | ; +contents_server: contents_server content_server + | ; content_server: server_num_threads | server_verbosity | server_port | server_outgoing_port | server_outgoing_range | server_do_ip4 | server_do_ip6 | server_do_udp | server_do_tcp | server_forward_to | server_forward_to_port | server_interface | server_chroot | server_username | server_directory | server_logfile | server_pidfile | server_msg_cache_size | server_msg_cache_slabs | - server_num_queries_per_thread; + server_num_queries_per_thread | server_rrset_cache_size | + server_rrset_cache_slabs + ; server_num_threads: VAR_NUM_THREADS STRING { OUTYY(("P(server_num_threads:%s)\n", $2)); @@ -271,6 +275,28 @@ server_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING free($2); } ; +server_rrset_cache_size: VAR_RRSET_CACHE_SIZE STRING + { + OUTYY(("P(server_rrset_cache_size:%s)\n", $2)); + if(atoi($2) == 0) + yyerror("number expected"); + else cfg_parser->cfg->rrset_cache_size = atoi($2); + free($2); + } + ; +server_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING + { + OUTYY(("P(server_rrset_cache_slabs:%s)\n", $2)); + if(atoi($2) == 0) + yyerror("number expected"); + else { + cfg_parser->cfg->rrset_cache_slabs = atoi($2); + if(!is_pow2(cfg_parser->cfg->rrset_cache_slabs)) + yyerror("must be a power of 2"); + } + free($2); + } + ; %% /* parse helper routines could be here */ -- 2.47.2