加入收藏 | 设为首页 | 会员中心 | 我要投稿 财气旺网 - 财气网 (https://www.caiqiwang.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL的内存和相关问题排查

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

我们都知道数据库是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

(编辑:财气旺网 - 财气网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!