Hello! On Fri, Mar 26, 2021 at 01:32:48PM +0300, Sergey Kandaurov wrote:
> > On 26 Mar 2021, at 13:14, raven...@megaline.kg wrote: > > > > После смены нативной zlib-1.2.7 на zlib-ng 2.0.1 (собрана в режиме > > совместимости с zlib) лог буквально завален ошибками: > > > > "gzip filter failed to use preallocated memory: 65536 of 0 while sending to > > client" > > > > Хотя, насколько я припоминаю, обход ошибок такого рода упоминался в анонсе > > к какой-то из версий 1.13. > > > > Попробуйте патч, при сборке с zlib-ng: > > diff --git a/src/http/modules/ngx_http_gzip_filter_module.c > b/src/http/modules/ngx_http_gzip_filter_module.c > --- a/src/http/modules/ngx_http_gzip_filter_module.c > +++ b/src/http/modules/ngx_http_gzip_filter_module.c > @@ -516,7 +516,7 @@ ngx_http_gzip_filter_memory(ngx_http_req > */ > > if (conf->level == 1) { > - wbits = ngx_max(wbits, 13); > + wbits = ngx_max(wbits, 15); Насколько я вижу, в zlib-ng используюся те же 13, что и в варианте от Intel: https://github.com/jtkukunas/zlib/blob/master/deflate.c#L296 https://github.com/zlib-ng/zlib-ng/blob/develop/deflate.c#L304 А вот аллокация под hash стала 2x64k. (В интеловском варианте, кстати, за последнее время и hash подужался, и windowBits в 13 ставится только для значений, больших 13. Возможно, на него стоит ещё разок взглянуть и урезать осетра.) # HG changeset patch # User Maxim Dounin <mdou...@mdounin.ru> # Date 1616784418 -10800 # Fri Mar 26 21:46:58 2021 +0300 # Node ID cc67b7253d6c19fa172c8412111568398a5e7b5b # Parent 2ed5d03c2d902efef969e24be6bb4d3f98a49efa Gzip: support for zlib-ng. diff --git a/src/http/modules/ngx_http_gzip_filter_module.c b/src/http/modules/ngx_http_gzip_filter_module.c --- a/src/http/modules/ngx_http_gzip_filter_module.c +++ b/src/http/modules/ngx_http_gzip_filter_module.c @@ -57,6 +57,7 @@ typedef struct { unsigned nomem:1; unsigned buffering:1; unsigned intel:1; + unsigned zlib_ng:1; size_t zin; size_t zout; @@ -214,6 +215,7 @@ static ngx_http_output_header_filter_pt static ngx_http_output_body_filter_pt ngx_http_next_body_filter; static ngx_uint_t ngx_http_gzip_assume_intel; +static ngx_uint_t ngx_http_gzip_assume_zlib_ng; static ngx_int_t @@ -506,7 +508,7 @@ ngx_http_gzip_filter_memory(ngx_http_req if (!ngx_http_gzip_assume_intel) { ctx->allocated = 8192 + (1 << (wbits + 2)) + (1 << (memlevel + 9)); - } else { + } else if (!ngx_http_gzip_assume_zlib_ng) { /* * A zlib variant from Intel, https://github.com/jtkukunas/zlib. * It can force window bits to 13 for fast compression level, @@ -523,6 +525,20 @@ ngx_http_gzip_filter_memory(ngx_http_req + (1 << (ngx_max(memlevel, 8) + 8)) + (1 << (memlevel + 8)); ctx->intel = 1; + + } else { + /* + * Another zlib variant, https://github.com/zlib-ng/zlib-ng. + * Similar to Intel's variant, though uses 128K hash. + */ + + if (conf->level == 1) { + wbits = ngx_max(wbits, 13); + } + + ctx->allocated = 8192 + 16 + (1 << (wbits + 2)) + + (1 << 17) + (1 << (memlevel + 8)); + ctx->zlib_ng = 1; } } @@ -945,11 +961,14 @@ ngx_http_gzip_filter_alloc(void *opaque, return p; } - if (ctx->intel) { + if (ctx->zlib_ng) { ngx_log_error(NGX_LOG_ALERT, ctx->request->connection->log, 0, "gzip filter failed to use preallocated memory: " "%ud of %ui", items * size, ctx->allocated); + } else if (ctx->intel) { + ngx_http_gzip_assume_zlib_ng = 1; + } else { ngx_http_gzip_assume_intel = 1; } -- Maxim Dounin http://mdounin.ru/ _______________________________________________ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru