MySQL的内存和相关问题排查
副标题[/!--empirenews.page--]
我们都知道数据库是IO密集型一类应用,为了提高其性能大量使用内存代替文件(交换分区)的IO操作是保证数据库稳定、高效的基本原则。那么数据库是如何使用内存的,我们如何查看数据库内存的占用,如何通过通过数据库内存配置设置提高其性能?本文虫虫就以Mysql数据库(InnoDB引擎)为例和大家一起了解下Linux数据库和内存相关的主题。 读取内存数据非常快,为了提高性能我们要尽最大可能把数据集都放到内存中以保证高效。但是Swap交换分区作为一个救命的稻草,我们还必须要给mysql设置,防止突发情况下内存不够,mysql服务直接被OOM杀掉的情况。同时mysql交换分区占用也是我们衡量一个数据是否健康与否的手段,如果一个数据库频繁的使用了swap则说明,我们需要人工干预优化数据库了。 内存占用 在Linux下,我们可以通过使用一些shell命令来了解MySQL的内存使用情况。 首先使用ps命令来查看mysqld进程的内存使用情况:
top命令也可以查看对应上面的结果也可以用top来得到:
其中,VIRT(virtual memory usage)表示mysql使用的虚拟内存总量。它包括所有代码,数据和共享库以及最终要被置换出的页面。 RES(resident memory usage) 常驻内存,包括当前进程使用的内存,不包括置换出的内存。 SHR(shared memory) 共享内存,进程使用的的共享内存,也包括其他进程的共享内存。 交换分区 我们再来检查检查mysqld是否正在使用交换分区,首先用free -m检查是否有用到交换分区。
上面结果了,系统使用少量的交换分区(2M),那怎么判断是不是MySQL用的呢?我们来验证:
VmSwap:0 kB 可见mysqld不没用用到交换区,说明我的mysqld在高效运行中。 这儿我们提供一个脚本,遍历每一个进程,找出那些进程使用了交换分区:
当然,交换中的页面可能已经存在很长时间了,自从使用一次后,后面就没有在用过。为了获取实时交换分区情况,我们可以用vmstat:
在这个服务器上,我们可以看到mysqld没有使用交换,如果系统内存充足,但是mysqld还占用了部分交换分区,是怎么回事?怎么排查呢? 如果遇到这种情况,可能的直接原因有swappiness和Numa。 Swappiness (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |