参考文献:
http://www.mysqlperformanceblog.com/2006/05/30/innodb-memory-usage/
关于InnoDB如何分配内存的问题有很多。在此,我会给出一些关于数据库启动时内存分配的解释。
下面是一些重要的常量:
1.
NBLOCKS:等于innodb_buffer_pool中的块总数,也就是innodb_buffer_pool_size / 16384
2.
OS_THREADS:如果innodb_buffer_pool_size >= 1000MB,那么等于50000;如果innodb_buffer_pool_size >= 8MB,那么等于10000;否则,等于1000(这种计算方法适用于Linux/Unix系统,Windows有另外一种计算OS_THREADS的方法)。
因此,InnoDB会使用:
1. innodb_buffer_pool
2. innodb_additional_mem_pool_size
3. innodb_log_buffer_size
4. 自适应的索引哈希,大小为innodb_buffer_pool / 64
5. 系统字典哈希,大小为6 * innodb_buffer_pool_size / 512
6. sync_array使用的内存,可用于同步原语,大小为OS_THREADS * 152
7. os_events使用的内存,同样可用于同步原语,大小为OS_THREADS * 216
8. 锁定系统使用的内存,大小为5 * 4 * NBLOCKS
因此,计算InnoDB使用内存的最终公式如下:
innodb_buffer_pool_size + innodb_log_buffer_size + innodb_additional_mem_pool_size + 812 / 16384 * innodb_buffer_pool_size + OS_THREADS * 368
为了简化上述公式,我们可以使用:
812 / 16384 * innodb_buffer_pool_size ~~ innodb_buffer_pool_size / 20
并且,如果innodb_buffer_pool > 1000MB,则OS_THREADS * 368 = 17.5MB;如果innodb_buffer_pool > 8MB,则OS_THREADS * 368 = 3.5MB。
例如,如果你设置的innodb_buffer_pool_size=1500M,innodb_additional_mem_pool_size = 20M,innodb_log_buffer_size = 8M,那么InnoDB将会分配的内存大小为1500M + 20M + 8M + 1500/20M + 17.5M,也就是1620.5M。
当你规划服务器的内存使用时,请慎重考虑额外使用的内存。