7.3. Using Operating System Memory Allocators

When InnoDB was developed, the memory allocators supplied with
operating systems and run-time libraries were often lacking in
performance and scalability. At that time, there were no memory
allocator libraries tuned for multi-core CPUs. Therefore, InnoDB
implemented its own memory allocator in the mem
subsystem. This allocator is guarded by a single mutex, which may
become a bottleneck. InnoDB also implements a wrapper interface
around the system allocator (malloc and
free) that is likewise guarded by a single
mutex.

Today, as multi-core systems have become more widely available,
and as operating systems have matured, significant improvements
have been made in the memory allocators provided with operating
systems. New memory allocators perform better and are more
scalable than they were in the past. The leading high-performance
memory allocators include Hoard,
libumem, mtmalloc,
ptmalloc, tbbmalloc, and
TCMalloc. Most workloads, especially those
where memory is frequently allocated and released (such as
multi-table joins) will benefit from using a more highly tuned
memory allocator as opposed to the internal, InnoDB-specific
memory allocator.

Beginning with InnoDB Plugin 1.0.3, you control whether InnoDB
uses its own memory allocator or an allocator of the operating
system, by setting the value of the new system configuration
parameter innodb_use_sys_malloc in the MySQL option file
(my.cnf or my.ini). If set
to ON or 1 (the default),
InnoDB will use the malloc and
free functions of the underlying system rather
than manage memory pools itself. This parameter is not dynamic,
and takes effect only when the system is started. To continue to
use the InnoDB memory allocator in InnoDB Plugin, you will
have to set innodb_use_sys_malloc to 0.

Note that when the InnoDB memory allocator is disabled, InnoDB
will ignore the value of the parameter
innodb_additional_mem_pool_size. The InnoDB memory allocator
uses an additional memory pool for satisfying allocation requests
without having to fall back to the system memory allocator. When
the InnoDB memory allocator is disabled, all such allocation
requests will be fulfilled by the system memory allocator.

Furthermore, since InnoDB cannot track all memory use when the
system memory allocator is used (innodb_use_sys_malloc is
ON), the section “BUFFER POOL AND
MEMORY” in the output of the SHOW ENGINE INNODB STATUS command
will only include the buffer pool statistics in the “Total
memory allocated”. Any memory allocated using the
mem subsystem or using
ut_malloc will be excluded.

On Unix-like systems that use dynamic linking, replacing the
memory allocator may be as easy as making the environment variable
LD_PRELOAD or
LD_LIBRARY_PATH point to the dynamic library
that implements the allocator. On other systems, some relinking
may be necessary. Please refer to the documentation of the memory
allocator library of your choice.