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 via the
mem
subsystem or via
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.
This is the User’s Guide for InnoDB Plugin 1.0.6 for MySQL 5.1, generated on March 4, 2010 (rev 673:680M).