首页 > 代码库 > 【笔记】InnoDB内存分配

【笔记】InnoDB内存分配

原文:http://www.mysqlperformanceblog.com/2006/05/30/innodb-memory-usage/

    有很多问题是有关InnoDB如何分配内存的。这里我试图解释下启动时内存的分配情况。先列出重要的常量:

NBLOCKS=innoDB缓冲池的块数量= innodb_buffer_pool_size / 16384

OS_THREADS = if (innodb_buffer_pool_size >= 1000Mb) = 50000

else if (innodb_buffer_pool_size >= 8Mb) = 10000

else = 1000 (对于Linux这类系统是正确的,对于Windows则有另一个计算方式)

所以InnoDB使用的内存量:

l  innodb缓冲池内存

l  innodb额外内存池大小

l  innodb记录缓冲大小

l  自适应哈希索引, 大小= innodb缓冲池 / 64

l  系统目录哈希, 大小 = 6 * innodb缓冲池 / 512

l  同步数组(sync_array)使用的内存,为同步单元利用,大小 = OS_THREADS * 152

l  系统事件(os_events)的内存, 也为同步单元利用,大小= OS_THREADS * 216

l  系统锁定的内存, 大小=5 * 4 * NBLOCKS

 

所以,最后的innodb的公式:

缓冲池大小+缓冲记录大小+额外内存池大小+ 812 / 16384 * 缓冲池大小 + OS_THREADS * 368
为简单起见:812 / 16384 * 缓冲池大小 ~~ 缓冲池大小/ 20

和 OS_THREADS*368 = 17.5MB 如果缓冲池大小> 1000MB

= 3.5MB 如果 缓冲池大小> 8MB

举个例子,比如你的缓冲池大小=1500M,额外内存池大小=20M,记录缓冲大小=8M,那么InnoDB分配的内存= 1500M + 20M + 8M + 1500/20M + 17.5M = 1620.5M.

在你计划利用你的服务器内存时,你要考虑到额外内存的利用。