14.8.4 Configuring the Memory Allocator for InnoDB
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 (
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. These new memory allocators perform better and are more scalable than they were in the past. Most workloads, especially those where memory is frequently allocated and released (such as multi-table joins), benefit from using a more highly tuned memory allocator as opposed to the internal,
InnoDB-specific memory allocator.
You can control whether
InnoDB uses its own memory allocator or an allocator of the operating system, by setting the value of the system configuration parameter
innodb_use_sys_malloc in the MySQL option file (
my.ini). If set to
1 (the default),
InnoDB uses the
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, set
InnoDB memory allocator is disabled,
InnoDB ignores 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 are fulfilled by the system memory allocator.
On Unix-like systems that use dynamic linking, replacing the memory allocator may be as easy as making the environment variable
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.
InnoDB cannot track all memory use when the system memory allocator is used (
ON), the section “BUFFER POOL AND MEMORY” in the output of the
SHOW ENGINE INNODB STATUS command only includes the buffer pool statistics in the “Total memory allocated”. Any memory allocated using the
mem subsystem or using
ut_malloc is excluded.
For more information about the performance implications of
InnoDB memory usage, see Section 8.10, “Buffering and Caching”.