From: Marko Kreen Date: Mon, 8 Oct 2007 07:06:41 +0000 (+0000) Subject: switch to toggle between LIFO and round-robin X-Git-Tag: pgbouncer_1_1~9 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5bcb2aa4b3848c6899ffa448f0e33ff34be15bf3;p=pgbouncer switch to toggle between LIFO and round-robin --- diff --git a/doc/pgbouncer.config.txt b/doc/pgbouncer.config.txt index fa8d6a7..ee37abe 100644 --- a/doc/pgbouncer.config.txt +++ b/doc/pgbouncer.config.txt @@ -128,6 +128,16 @@ per-database config. Default: 20 +==== server_round_robin ==== + +By default, pgbouncer reuses server connections in LIFO manner, so that few +connections get the most load. This gives best performance if you have single +server serving a database. But if there is TCP round-robin behind a database +IP then it's better if pgbouncer also uses connections in that manner, thus +achieving uniform load. + +Default: 0 + === Log settings === ==== log_connections ==== diff --git a/etc/pgbouncer.ini b/etc/pgbouncer.ini index a796f62..69bb173 100644 --- a/etc/pgbouncer.ini +++ b/etc/pgbouncer.ini @@ -93,6 +93,10 @@ log_disconnections = 1 ; log error messages pooler sends to clients log_pooler_errors = 1 + +; If off, then server connections are reused in LIFO manner +;server_round_robin = 0 + ;;; ;;; Timeouts ;;; diff --git a/src/bouncer.h b/src/bouncer.h index a1ebd51..2b487bb 100644 --- a/src/bouncer.h +++ b/src/bouncer.h @@ -277,6 +277,7 @@ extern usec_t cf_server_login_retry; extern usec_t cf_query_timeout; extern usec_t cf_client_idle_timeout; extern usec_t cf_client_login_timeout; +extern int cf_server_round_robin; extern int cf_auth_type; extern char *cf_auth_file; diff --git a/src/main.c b/src/main.c index cd00d1b..42b7511 100644 --- a/src/main.c +++ b/src/main.c @@ -81,6 +81,7 @@ int cf_default_pool_size = 20; char *cf_server_reset_query = ""; char *cf_server_check_query = "select 1"; usec_t cf_server_check_delay = 30 * USEC; +int cf_server_round_robin = 0; usec_t cf_server_lifetime = 60*60*USEC; usec_t cf_server_idle_timeout = 10*60*USEC; @@ -129,6 +130,7 @@ ConfElem bouncer_params[] = { {"server_idle_timeout", true, CF_TIME, &cf_server_idle_timeout}, {"server_connect_timeout",true, CF_TIME, &cf_server_connect_timeout}, {"server_login_retry", true, CF_TIME, &cf_server_login_retry}, +{"server_round_robin", true, CF_INT, &cf_server_round_robin}, {"pkt_buf", false, CF_INT, &cf_sbuf_len}, {"tcp_defer_accept", false, CF_INT, &cf_tcp_defer_accept}, diff --git a/src/objects.c b/src/objects.c index f6843b1..0a88787 100644 --- a/src/objects.c +++ b/src/objects.c @@ -257,7 +257,7 @@ void change_server_state(PgSocket *server, SocketState newstate) statlist_append(&server->head, &pool->tested_server_list); break; case SV_IDLE: - if (server->close_needed) + if (server->close_needed || cf_server_round_robin) /* try to avoid immediate usage then */ statlist_append(&server->head, &pool->idle_server_list); else