Most Linux distributions use zlib
without any optimizations. For the Arm architecture this means that CRC (cyclic redundancy check) instructions are not utilized for best performance. Installing and using a zlib
which has been optimized may provide performance improvement for applications doing data compression.
Cloudflare zlib
is one version which has optimizations included. There are other zlib
versions which have been optimized. The process to use them should be similar.
All recent Arm servers and most Armv8.0-A and above processors have support for CRC instructions.
To check if a Linux system has support use the lscpu
command and look for crc32
in the listed flags.
lscpu | grep crc32
If the machine is confirmed to include crc32
it may benefit from zlib-cloudflare
.
Some Linux system may already make use of crc32
with the default library. If the default zlib
is already optimized, then using zlib-cloudflare
may not have any impact on performance.
If zlib
is not installed, you can install it with the following command on Ubuntu, as well as additional packages for this Learning Path.
sudo apt install -y libzstd1 build-essential git
Ubuntu and Debian Linux distributions put zlib
in /usr/lib/aarch64-linux-gnu
To check if there are any CRC instructions in a library use objdump
to disassemble and look for crc32
instructions.
objdump -d /usr/lib/aarch64-linux-gnu/libz.so.1 | awk -F" " '{print $3}' | grep crc32 | wc -l
If the result is 0 then there are no crc32
instructions used in the library.
If there are no crc32
instructions in zlib
then zlib-cloudflare
may increase application performance.
To build and install zlib-cloudflare
navigate to an empty directory and use these commands.
mkdir tmp ; pushd tmp
git clone https://github.com/cloudflare/zlib.git
cd zlib && ./configure
make && sudo make install
popd
rm -rf tmp
If successful, zlib-cloudflare
is installed in /usr/local/lib
To install zlib
somewhere else which does not require sudo
to install it, use the prefix argument to configure to select another location such as
./configure --prefix=$HOME/zlib
This results in zlib
being installed in $HOME/zlib
instead and the sudo
is not needed for the make install
.
Since zlib
is a shared library there are different ways to configure its usage.
Below is a simple C program to demonstrate zlib
configuration.
Use a text editor to save the code below in a file named test.c
#include <stdio.h>
#include <stdlib.h>
#include "zlib.h"
int main()
{
gzFile myfile;
printf("%s\n", zlibVersion());
myfile = gzopen("testfile.gz", "wb");
gzprintf(myfile,"Hello gzipped file!\n");
gzclose(myfile);
exit(0);
}
Compile the example program:
gcc test.c -o test -lz
Run the program and see the version.
./test
The printed version will be something like:
1.2.11
Use ldd
to see the location of the shared library.
ldd ./test
The output will show the shared libraries used by test.
linux-vdso.so.1 (0x0000ffffababe000)
libz.so.1 => /lib/aarch64-linux-gnu/libz.so.1 (0x0000ffffaba52000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffffab8df000)
/lib/ld-linux-aarch64.so.1 (0x0000ffffaba8e000)
To run test
with zlib-cloudflare
instead of the default.
LD_PRELOAD=/usr/local/lib/libz.so ./test
The LD_PRELOAD
variable informs the linker to use these libraries before the default libraries.
The version of zlib-cloudflare
will print. It may be older than the default, but you are interested in crc32
not using the latest.
In the next section you will explore how to use zlib-cloudflare
in an application doing data compression.