Support for 3rd party zlib libraries

Yichun Zhang (agentzh) agentzh at gmail.com
Tue Jul 29 21:23:01 UTC 2014


Hello!

On Tue, Jul 29, 2014 at 1:46 PM, Richard Stanway wrote:
> I recently came across a modified version of zlib with code contributed by
> Intel [1] that makes use of modern CPU instructions to increase performance.
> In testing, the performance gains seemed substantial, however when I tried
> to use this version with nginx, the following alert types appeared in the
> error_log on gzip requests:
>
[...]
>
> Is there a chance this version could be supported by nginx, or a
> configuration option made available to control the allocation size?
>

Well, I used to write a patch to enable IPP zlib (8.0) support in
NGINX (enabled by ./configure --with-ipp-zlib), just for your
reference:

# HG changeset patch
# User Yichun Zhang <agentzh at gmail.com>
# Date 1406668777 25200
#      Tue Jul 29 14:19:37 2014 -0700
# Node ID 2a54efe7a747af2f70cb8af0cff62910d6b84a7f
# Parent  c038cc33739bbfab2ed50819191298471f22d233
Gzip: added support for IPP zlib 8.0.

This feature can now be enabled by ./configure --with-zlib-ipp.

diff -r c038cc33739b -r 2a54efe7a747 auto/lib/zlib/conf
--- a/auto/lib/zlib/conf Fri Jul 25 14:43:29 2014 -0700
+++ b/auto/lib/zlib/conf Tue Jul 29 14:19:37 2014 -0700
@@ -6,6 +6,15 @@
 if [ $ZLIB != NONE ]; then
     CORE_INCS="$CORE_INCS $ZLIB"

+    if [ "$ZLIB_IPP" = YES ]; then
+cat << END
+
+$0: error: option --with-zlib-ipp conflicts with --with-zlib=<path>.
+
+END
+        exit 1
+    fi
+
     case "$NGX_CC_NAME" in

         msvc* | owc* | bcc)
@@ -53,18 +62,26 @@ else
         ngx_feature_incs="#include <zlib.h>"
         ngx_feature_path=
         ngx_feature_libs="-lz"
+
         ngx_feature_test="z_stream z; deflate(&z, Z_NO_FLUSH)"
         . auto/feature


         if [ $ngx_found = yes ]; then
             CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
-            ZLIB=YES
+
+            if [ "$ZLIB_IPP" = YES ]; then
+                have=NGX_HAVE_ZLIB_IPP . auto/have
+                ZLIB=IPP
+            else
+                ZLIB=YES
+            fi
+
             ngx_found=no
         fi
     fi

-    if [ $ZLIB != YES ]; then
+    if [ $ZLIB != YES -a $ZLIB != IPP ]; then
 cat << END

 $0: error: the HTTP gzip module requires the zlib library.
diff -r c038cc33739b -r 2a54efe7a747 auto/options
--- a/auto/options Fri Jul 25 14:43:29 2014 -0700
+++ b/auto/options Tue Jul 29 14:19:37 2014 -0700
@@ -133,6 +133,7 @@ SHA1_OPT=
 SHA1_ASM=NO

 USE_ZLIB=NO
+ZLIB_IPP=NO
 ZLIB=NONE
 ZLIB_OPT=
 ZLIB_ASM=NO
@@ -299,6 +300,7 @@ use the \"--without-http_limit_conn_modu
         --with-sha1-opt=*)               SHA1_OPT="$value"          ;;
         --with-sha1-asm)                 SHA1_ASM=YES               ;;

+        --with-zlib-ipp)                 ZLIB_IPP=YES               ;;
         --with-zlib=*)                   ZLIB="$value"              ;;
         --with-zlib-opt=*)               ZLIB_OPT="$value"          ;;
         --with-zlib-asm=*)               ZLIB_ASM="$value"          ;;
diff -r c038cc33739b -r 2a54efe7a747 auto/summary
--- a/auto/summary Fri Jul 25 14:43:29 2014 -0700
+++ b/auto/summary Tue Jul 29 14:19:37 2014 -0700
@@ -65,6 +65,7 @@ esac

 case $ZLIB in
     YES)   echo "  + using system zlib library" ;;
+    IPP)   echo "  + using IPP zlib library" ;;
     NONE)  echo "  + zlib library is not used" ;;
     *)     echo "  + using zlib library: $ZLIB" ;;
 esac
diff -r c038cc33739b -r 2a54efe7a747
src/http/modules/ngx_http_gzip_filter_module.c
--- a/src/http/modules/ngx_http_gzip_filter_module.c Fri Jul 25
14:43:29 2014 -0700
+++ b/src/http/modules/ngx_http_gzip_filter_module.c Tue Jul 29
14:19:37 2014 -0700
@@ -521,7 +521,18 @@ ngx_http_gzip_filter_memory(ngx_http_req
      *  *) 5920 bytes on amd64 and sparc64
      */

+#if NGX_HAVE_ZLIB_IPP
+    /* Below is from deflate.c in ipp-samples.8.0.0.005 */
+
+    if (wbits == 8) {
+        wbits = 9;
+    }
+
+    ctx->allocated = 8192 + 5 * (1 << (memlevel + 6)) + (1 << (wbits + 1))
+                     + (1 << (wbits + 2)) + (1 << (memlevel + 9));
+#else
     ctx->allocated = 8192 + (1 << (wbits + 2)) + (1 << (memlevel + 9));
+#endif
 }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ipp-zlib.patch
Type: text/x-patch
Size: 3411 bytes
Desc: not available
URL: <http://mailman.nginx.org/pipermail/nginx/attachments/20140729/79433029/attachment.bin>


More information about the nginx mailing list