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.
This commit is contained in:
William Lallemand 2012-11-07 16:54:34 +01:00 committed by Willy Tarreau
parent 08289f12f9
commit a509e4c332
6 changed files with 70 additions and 2 deletions

View File

@ -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 <number>
to the kernel waiting for a large part of the buffer to be read before
notifying haproxy again.
tune.zlib.memlevel <number>
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 <number>
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
--------------

View File

@ -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);

View File

@ -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 {

View File

@ -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);

View File

@ -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;

View File

@ -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