设为首页 - 加入收藏 延安站长网 (http://www.0911zz.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: 数据中心 手机 技术 企业
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL的内存和相关问题排查

发布时间:2018-11-11 10:33 所属栏目:[MySql教程] 来源:虫虫安全
导读:我们都知道数据库是IO密集型一类应用,为了提高其性能大量使用内存代替文件(交换分区)的IO操作是保证数据库稳定、高效的基本原则。那么数据库是如何使用内存的,我们如何查看数据库内存的占用,如何通过通过数据库内存配置设置提高其性能?本文虫虫就以M

我们都知道数据库是IO密集型一类应用,为了提高其性能大量使用内存代替文件(交换分区)的IO操作是保证数据库稳定、高效的基本原则。那么数据库是如何使用内存的,我们如何查看数据库内存的占用,如何通过通过数据库内存配置设置提高其性能?本文虫虫就以Mysql数据库(InnoDB引擎)为例和大家一起了解下Linux数据库和内存相关的主题。

MySQL的内存和相关问题排查

读取内存数据非常快,为了提高性能我们要尽最大可能把数据集都放到内存中以保证高效。但是Swap交换分区作为一个救命的稻草,我们还必须要给mysql设置,防止突发情况下内存不够,mysql服务直接被OOM杀掉的情况。同时mysql交换分区占用也是我们衡量一个数据是否健康与否的手段,如果一个数据库频繁的使用了swap则说明,我们需要人工干预优化数据库了。

内存占用

在Linux下,我们可以通过使用一些shell命令来了解MySQL的内存使用情况。

首先使用ps命令来查看mysqld进程的内存使用情况:

  1. ps?-eo?size,pid,user,command?--sort?-size|grep?mysqld?
  2. |awk?'{hr=$1/1024;printf("%13.2f?MB",hr)}?{for?(x=4;x<=NF;x++){printf("%s",$x)}print?""}'?
  3. |cut?-d?""?-f2|cut?-d?"-"?-f1?

MySQL的内存和相关问题排查

  1. 1990.88?MB/usr/local/mariadb/bin/mysqld?
  2. 0.49?MB/bin/sh/usr/local/mariadb/bin/mysqld_safe?

top命令也可以查看对应上面的结果也可以用top来得到:

  1. top?-b?-o?%MEM?-n1?-p?$(pidof?mysqld)?|?grep?PID?-A?

MySQL的内存和相关问题排查

  1. PID?USER?PR?NI?VIRT?RES?SHR?S?%CPU?%MEM?TIME+?COMMAND?
  2. 2239?mysql?20?0?2108536?316836?7548?S?0.0?4.0?48:47.37?mysqld?

其中,VIRT(virtual memory usage)表示mysql使用的虚拟内存总量。它包括所有代码,数据和共享库以及最终要被置换出的页面。

RES(resident memory usage) 常驻内存,包括当前进程使用的内存,不包括置换出的内存。

SHR(shared memory) 共享内存,进程使用的的共享内存,也包括其他进程的共享内存。

交换分区

我们再来检查检查mysqld是否正在使用交换分区,首先用free -m检查是否有用到交换分区。

  1. free?-m?

MySQL的内存和相关问题排查

  1. total?used?free?shared?buff/cache?available?
  2. Mem:?7822?5091?178?83?2552?2290?
  3. Swap:?3999?2?3997?

上面结果了,系统使用少量的交换分区(2M),那怎么判断是不是MySQL用的呢?我们来验证:

  1. cat?/proc/$(pidof?gitlab)/status?|?grep?Swap?

MySQL的内存和相关问题排查

VmSwap:0 kB

可见mysqld不没用用到交换区,说明我的mysqld在高效运行中。

这儿我们提供一个脚本,遍历每一个进程,找出那些进程使用了交换分区:

  1. for?i?in?$(ls?-d?/proc/[0-9]*)?
  2. do?
  3. out=$(grep?Swap?$i/status?2>/dev/null)?
  4. if?[?"x$(echo?$out?|?awk?'{print?$2}')"?!=?"x0"?]?&&?[?"x$(echo?$out?|?awk?'{print?$2}')"?!=?"x"?]?
  5. then?
  6. echo?"$(ps?-p?$(echo?$i?|?cut?-d'/'?-f3)?
  7. |?tail?-n?1?|?awk?'{print?$4'}):?$(echo?$out?|?awk?'{print?$2?$3}')"?
  8. fi?
  9. done?

MySQL的内存和相关问题排查

当然,交换中的页面可能已经存在很长时间了,自从使用一次后,后面就没有在用过。为了获取实时交换分区情况,我们可以用vmstat:

  1. vmstat?1?10?

MySQL的内存和相关问题排查

在这个服务器上,我们可以看到mysqld没有使用交换,如果系统内存充足,但是mysqld还占用了部分交换分区,是怎么回事?怎么排查呢?

如果遇到这种情况,可能的直接原因有swappiness和Numa。

Swappiness

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章