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