读书人

[MySQL生产环境] Innodb存储引擎内存报

发布时间: 2013-10-29 12:07:57 作者: rapoo

[MySQL生产环境] Innodb存储引擎内存报警问题处理过程
1 不停的收到email报警,内存值超过阀值80%了。


2 top下,mysqld进程确实占据了77.5%,再加上一些其他的辅助进程,内存usage到了81%也可以理解。

[xxx@00903 5.5.25a]$ top
top - 03:48:55 up 51 days, 17:11, 2 users, load average: 0.09, 0.09, 0.11
Tasks: 202 total, 1 running, 201 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2%us, 0.1%sy, 0.0%ni, 98.8%id, 0.8%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 28743468k total, 28452540k used, 290928k free, 467048k buffers
Swap: 4194296k total, 0k used, 4194296k free, 4589332k cached


PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
23956 mysql 20 0 24.1g 21g 5408 S 1.0 77.5 390:56.59 mysqld
9 root 20 0 0 0 0 S 0.3 0.0 203:16.51 ksoftirqd/1
23971 mmmd 20 0 687m 64m 1960 S 0.3 0.2 73:53.23 perl
1 root 20 0 21444 1232 928 S 0.0 0.0 1:29.37 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.44 kthreadd


3 看看free -m吧
[xxx@00903 ~]$ free -m
total used free shared buffers cached
Mem: 28069 27828 240 0 440
-/+ buffers/cache: 22820 5249
Swap: 4095 0 4095
[xxx@00903 ~]$


4 简要分析理解free -m参数值意义
total: 28069,总内存大小。
used: 27828,已经使用过的内存大小。
free:240,剩余的内存大小。
total值是used+free的值总合:

mysql> SELECT 22820+5249;+------------+| 22820+5249 |+------------+|      28069 |+------------+1 row in set (0.00 sec)


目前没有找到问题所在,去查阅一些基础文档,有很多东西时间一长不用,都快要遗忘了

5 buffers与cached的分析

对操作系统来讲是Mem的参数buffers和cached 都是属于被使用,它认为free只有752M。
对应用程序来讲是(-/+ buffers/cach),buffers和cached 是等同可用的,buffer和cached是为了提高程序执行的性能,当程序使用内存时,buffer和cached会很快地被使用。
以应用来看看,以(-/+ buffers/cache)的free和used为主.我们看这个就好了.Linux为了提高磁盘和内存存取效率, 开发人员做了很多精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache.前者针对磁盘块的读写,后者针对文件inode的读写.这些Cache能有效缩短了 I/O系统调用(比如read,write,getdents)的时间.


6 innodb_buffer_pool_size(global)

当我们使用InnoDB存储引擎的时候,innodb_buffer_pool_size 参数可能是影响我们性能的最为关键的一个参数了,他用来设置用于缓存 InnoDB 索引及数据块的内存区域大小,类似于 MyISAM 存储引擎的 key_buffer_size 参数,当然,可能更像是 Oracle 的 db_cache_size。简单来说,当我们操作一个 InnoDB 表的时候,返回的所有数据或者去数据过程中用到的任何一个索引块,都会在这个内存区域中走一遭。

和key_buffer_size 对于 MyISAM 引擎一样,innodb_buffer_pool_size 设置了 InnoDB 存储引擎需求最大的一块内存区域的大小,直接关系到 InnoDB存储引擎的性能,所以如果我们有足够的内存,尽可将该参数设置到足够打,将尽可能多的 InnoDB 的索引及数据都放入到该缓存区域中,直至全部。

我们可以通过 (Innodb_buffer_pool_read_requests Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100% 计算缓存命中率,并根据命中率来调整 innodb_buffer_pool_size 参数大小进行优化。


7 MySQL Query Cache

在大部分的 MySQL 分发版本中,Query Cache 功能默认都是打开的,我们可以通过调整 MySQL Server 的参数选项打开该功能。主要由以下5个参数构成:

读书人网 >其他数据库

热点推荐