gzip filter failed to use preallocated memory

Maxim Dounin mdounin на mdounin.ru
Пт Ноя 10 18:25:19 UTC 2017


Hello!

On Fri, Nov 10, 2017 at 09:35:02AM -0500, S.A.N wrote:

> > Есть смысл разобраться, что у вас используется вместо zlib,
> 
> Из коробки в ОС установлена пропатченная Intel библиотека zlib 
> https://software.intel.com/en-us/articles/how-to-use-zlib-with-intel-ipp-opertimization
> 
> Вот что у нас выдает ldd
> ldd /usr/lib64/libz.so
>         linux-vdso.so.1 (0x00007ffed8d7c000)
>         libc.so.6 => /usr/lib64/haswell/libc.so.6 (0x00007fe455d53000)
>         /usr/lib64/ld-linux-x86-64.so.2 (0x00007fe455f8b000)
> 
> 
> >  как  это что-то детектировать и аллоцировать под него память, и 
> > прислать патч.
> 
> Мне сложно сказать как правильно детектировать эту библиотеку, и патч
> написать я тоже не смогу (я не Си разработчик) но могу тестировать.
> Intel, сделали хорошую работу, их gzip работает почти в 2 раза быстрей, не
> хочется возвращаться на стандартную zlib.

Я не поленился и таки скачал то, что дают по ссылке выше, и в 
патче вижу такое:

--- zlib-1.2.8.orig/zlib.h      2017-05-29 16:04:42.703705000 +0300
+++ zlib-1.2.8/zlib.h   2017-05-29 16:09:45.779049000 +0300
@@ -187,6 +187,9 @@
 #define Z_BEST_SPEED             1
 #define Z_BEST_COMPRESSION       9
 #define Z_DEFAULT_COMPRESSION  (-1)
+#if defined(WITH_IPP)
+#define Z_IPP_FAST_COMPRESSION (-2)
+#endif
 /* compression levels */
 
 #define Z_FILTERED            1

То есть определяется новая константа, Z_IPP_FAST_COMPRESSION.  
Если это действительно так, то можно попробовать что-нибудь 
простое, вроде:

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
@@ -1025,9 +1025,11 @@ ngx_http_gzip_filter_alloc(void *opaque,
         return p;
     }
 
+#ifndef Z_IPP_FAST_COMPRESSION
     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);
+#endif
 
     p = ngx_palloc(ctx->request->pool, items * size);
 

Я, впрочем, подозреваю, что на самом деле там не это, а то, что 
лежит по адресу https://github.com/jtkukunas/zlib.  Название и 
содержимое пакета как бы намекает:

https://download.clearlinux.org/current/source/SRPMS/zlib-1.2.8.jtkv4-40.src.rpm

Я когда-то смотрел на это - и пришёл к выводу, что сделать с этим 
ничего разумного не получается, никаких способов узнать о наличии 
модификаций ребята не оставили.  При этом внесённые изменения 
очевидно противоречат документированным в zlib требованиям к 
памяти.  Так что я решил отложить дальнейшие разбирательства до 
того момента, когда ребята одумаются и как-то приведут в порядок 
свою поделку.

Но, похоже, лучше с тех пор не стало.

> Возможно будет достаточно если Nginx изменит уровень ошибки, сейчас уровень
> этой ошибки Alert, но это не правильно, потому что Nginx не падает и все
> работает, я думаю правильно выдавать Notice, тогда можно не логировать
> Notice уведомления и все будет норм?

Уровень логгирования alert означает ситуацию, которая не должна 
возникать при нормальной работе, и означает ошибку где-то.  В 
данном случае мы знаем причину - библиотека от Интел нарушает 
документированный интерфейс zlib в части требований к памяти - и 
этого достаточно для того, чтобы игнорировать и/или понизить 
уровень ошибки до менее значительного в случае использования 
этой библиотеки.  Однако я бы предпочёл не трогать уровень 
логгирования для всех остальных случаев.

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru