From: William Lallemand Date: Wed, 7 Nov 2012 15:54:34 +0000 (+0100) Subject: MINOR: compression: memlevel and windowsize X-Git-Tag: v1.5-dev13~78 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a509e4c33266f74e6f274e9cd4ad2471fe5bd520;p=thirdparty%2Fhaproxy.git MINOR: compression: memlevel and windowsize The window size and the memlevel of the zlib are now configurable using global options tune.zlib.memlevel and tune.zlib.windowsize. It affects the memory consumption of the zlib. --- diff --git a/doc/configuration.txt b/doc/configuration.txt index 225acb7238..eb249889b9 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -474,6 +474,8 @@ The following keywords are supported in the "global" section : - tune.rcvbuf.server - tune.sndbuf.client - tune.sndbuf.server + - tune.zlib.memlevel + - tune.zlib.windowsize * Debugging - debug @@ -816,6 +818,18 @@ tune.sndbuf.server to the kernel waiting for a large part of the buffer to be read before notifying haproxy again. +tune.zlib.memlevel + Sets the memLevel parameter in zlib initialization for each session. It + defines how much memory should be allocated for the intenal compression + state. A value of 1 uses minimum memory but is slow and reduces compression + ratio, a value of 9 uses maximum memory for optimal speed. Can be a value + between 1 and 9. The default value is 8. + +tune.zlib.windowsize + Sets the window size (the size of the history buffer) as a parameter of the + zlib initialization for each session. Larger values of this parameter result + in better compression at the expense of memory usage. Can be a value between + 8 and 15. The default value is 15. 3.3. Debugging -------------- diff --git a/include/types/compression.h b/include/types/compression.h index 6f418fa057..097c42c4a6 100644 --- a/include/types/compression.h +++ b/include/types/compression.h @@ -44,7 +44,7 @@ struct comp_ctx { struct comp_algo { char *name; int name_len; - int (*init)(struct comp_ctx *comp_ctx, int); + int (*init)(struct comp_ctx *comp_ctx, int level); int (*add_data)(struct comp_ctx *comp_ctx, const char *in_data, int in_len, char *out_data, int out_len); int (*flush)(struct comp_ctx *comp_ctx, struct buffer *out, int flag); int (*reset)(struct comp_ctx *comp_ctx); diff --git a/include/types/global.h b/include/types/global.h index 28632b7224..2f41be5589 100644 --- a/include/types/global.h +++ b/include/types/global.h @@ -111,6 +111,10 @@ struct global { int max_http_hdr; /* max number of HTTP headers, use MAX_HTTP_HDR if zero */ #ifdef USE_OPENSSL int sslcachesize; /* SSL cache size in session, defaults to 20000 */ +#endif +#ifdef USE_ZLIB + int zlibmemlevel; /* zlib memlevel */ + int zlibwindowsize; /* zlib window size */ #endif } tune; struct { diff --git a/src/cfgparse.c b/src/cfgparse.c index d1f18f7ab7..2b451225dc 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -662,6 +662,50 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm) } global.tune.max_http_hdr = atol(args[1]); } + else if (!strcmp(args[0], "tune.zlib.memlevel")) { +#ifdef USE_ZLIB + if (*args[1]) { + global.tune.zlibmemlevel = atoi(args[1]); + if (global.tune.zlibmemlevel < 1 || global.tune.zlibmemlevel > 9) { + Alert("parsing [%s:%d] : '%s' expects a numeric value between 1 and 9\n", + file, linenum, args[0]); + err_code |= ERR_ALERT | ERR_FATAL; + goto out; + } + } else { + Alert("parsing [%s:%d] : '%s' expects a numeric value between 1 and 9\n", + file, linenum, args[0]); + err_code |= ERR_ALERT | ERR_FATAL; + goto out; + } +#else + Alert("parsing [%s:%d] : '%s' is not implemented.\n", file, linenum, args[0]); + err_code |= ERR_ALERT | ERR_FATAL; + goto out; +#endif + } + else if (!strcmp(args[0], "tune.zlib.windowsize")) { +#ifdef USE_ZLIB + if (*args[1]) { + global.tune.zlibwindowsize = atoi(args[1]); + if (global.tune.zlibwindowsize < 8 || global.tune.zlibwindowsize > 15) { + Alert("parsing [%s:%d] : '%s' expects a numeric value between 8 and 15\n", + file, linenum, args[0]); + err_code |= ERR_ALERT | ERR_FATAL; + goto out; + } + } else { + Alert("parsing [%s:%d] : '%s' expects a numeric value between 8 and 15\n", + file, linenum, args[0]); + err_code |= ERR_ALERT | ERR_FATAL; + goto out; + } +#else + Alert("parsing [%s:%d] : '%s' is not implemented.\n", file, linenum, args[0]); + err_code |= ERR_ALERT | ERR_FATAL; + goto out; +#endif + } else if (!strcmp(args[0], "uid")) { if (global.uid != 0) { Alert("parsing [%s:%d] : user/uid already specified. Continuing.\n", file, linenum); diff --git a/src/compression.c b/src/compression.c index 1f12df9aec..c20a4495eb 100644 --- a/src/compression.c +++ b/src/compression.c @@ -329,7 +329,7 @@ int gzip_init(struct comp_ctx *comp_ctx, int level) strm->zfree = Z_NULL; strm->opaque = Z_NULL; - if (deflateInit2(&comp_ctx->strm, level, Z_DEFLATED, MAX_WBITS + 16, 8, Z_DEFAULT_STRATEGY) != Z_OK) + if (deflateInit2(&comp_ctx->strm, level, Z_DEFLATED, global.tune.zlibwindowsize + 16, global.tune.zlibmemlevel, Z_DEFAULT_STRATEGY) != Z_OK) return -1; return 0; diff --git a/src/haproxy.c b/src/haproxy.c index c6933c33d4..d85a46afee 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -126,6 +126,12 @@ struct global global = { #ifdef USE_OPENSSL .sslcachesize = 20000, #endif +#ifdef USE_ZLIB + .zlibmemlevel = 8, + .zlibwindowsize = MAX_WBITS, +#endif + + }, #ifdef USE_OPENSSL #ifdef DEFAULT_MAXSSLCONN