mysql常驻内存_MySQL的内存和相关问题排查
我们都知道数据库是IO密集型一类应用,为了提高其性能大量使用内存代替文件(交换分区)的IO操作是保证数据库稳定、高效的基本原则。那么数据库是如何使用内存的,我们如何查看数据库内存的占用,如何通过通过数据库内存配置设置提高其性能?本文虫虫就以Mysql数据库(InnoDB引擎)为例和大家一起了解下Linux数据库和内存相关的主题。
读取内存数据非常快,为了提高性能我们要尽最大可能把数据集都放到内存中以保证高效。但是Swap交换分区作为一个救命的稻草,我们还必须要给mysql设置,防止突发情况下内存不够,mysql服务直接被OOM杀掉的情况。同时mysql交换分区占用也是我们衡量一个数据是否健康与否的手段,如果一个数据库频繁的使用了swap则说明,我们需要人工干预优化数据库了。
内存占用
在Linux下,我们可以通过使用一些shell命令来了解MySQL的内存使用情况。
首先使用ps命令来查看mysqld进程的内存使用情况:
ps -eo size,pid,user,command --sort -size|grep mysqld \
|awk '{hr=$1/1024;printf("%13.2f MB",hr)} {for (x=4;x<=NF;x++){printf("%s",$x)}print ""}'\
|cut -d "" -f2|cut -d "-" -f1
1990.88 MB/usr/local/mariadb/bin/mysqld
0.49 MB/bin/sh/usr/local/mariadb/bin/mysqld_safe
top命令也可以查看对应上面的结果也可以用top来得到:
top -b -o %MEM -n1 -p $(pidof mysqld) | grep PID -A
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
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检查是否有用到交换分区。
free -m
total used free shared buff/cache available
Mem: 7822 5091 178 83 2552 2290
Swap: 3999 2 3997
上面结果了,系统使用少量的交换分区(2M),那怎么判断是不是MySQL用的呢?我们来验证:
cat /proc/$(pidof gitlab)/status | grep Swap
VmSwap:0 kB
可见mysqld不没用用到交换区,说明我的mysqld在高效运行中。
这儿我们提供一个脚本,遍历每一个进程,找出那些进程使用了交换分区:
for i in $(ls -d /proc/[0-9]*)
do
out=$(grep Swap $i/status 2>/dev/null)
if [ "x$(echo $out | awk '{print $2}')" != "x0" ] && [ "x$(echo $out | awk '{print $2}')" != "x" ]
then
echo "$(ps -p $(echo $i | cut -d'/' -f3) \
| tail -n 1 | awk '{print $4'}): $(echo $out | awk '{print $2 $3}')"
fi
done
当然,交换中的页面可能已经存在很长时间了,自从使用一次后,后面就没有在用过。为了获取实时交换分区情况,我们可以用vmstat:
vmstat 1 10
在这个服务器上,我们可以看到mysqld没有使用交换,如果系统内存充足,但是mysqld还占用了部分交换分区,是怎么回事?怎么排查呢?
如果遇到这种情况,可能的直接原因有swappiness和Numa。
Swappiness
swappiness参数控制内核将进程移出物理内存并将其放入交换磁盘分区的趋势。我们之前也说过了磁盘IO操作要比RAM慢很多很多,因此如果进程过于频繁地从内存中置换出,这会导致系统和应用程序的响应时间变慢。高swappiness值意味着内核更容易取消内存页面。低swappiness相反,内核将不太容易取消内存页面。swappiness值越高,系统内存置换的越多。
linux下系统(CentOS、Red Hat、ubuntu)默认的swappiness值为60。如果内存较小则应适当调高这个值。对于内存足够的MySQL服务器,这个默认设置就有点太高了,应该减少。一般情况下,业界建议这个值可以设置到5.或者更小。设置swappiness方法是使用sysctl命令直接改变内核参数。
sysctl -w vn.swappinness = 1
NUMA设置
还有一个方面就是NUMA设置。对于具有多个NUMA核心的服务器,建议将NUMA模式设置为交错,以平衡所有节点的内存分配。 在最新的MySQL 8.0中支持为InnoDB设置NUMA。可以在配置通过启动:innodb_numa_interleave = 1
要检查是否有多个NUMA节点,可以使用numactl -H
这是两种不同的输出:
我们可以看到,当有多个NUMA节点(下)时,默认情况下,内存不会在所有节点之间平均分配。这可以导致更多内存置换。
文件系统缓存
默认情况下,Linux将使用文件系统会对所有的I/O操作进行缓存(这是不建议使用MyISAM的原因之一,MyISAM存储引擎依赖于FS缓存,并且可能导致丢失数据)。Mysql InnoDB引擎中使用O_DIRECT作为innodb_flush_method,MySQL将绕过文件系统缓存,不会将任何FS Cache Memory用于数据文件(* .ibd)。
当然在MySQL中使用的其他非数据文件仍会使用FS Cache。我们来看个例子:
dbsake fincore binlog.000017
binlog.000017: total_pages=120841 cached=50556 percent=41.84
ls -lh binlog.000017
-rw-r----- 1 mysql mysql 473M Sep 18 07:17 binlog.000017
free -m
total used free shared buffers cached
Mem: 5965 4608 1356 128 435 2456
-/+ buffers/cache: 1716 4249
Swap: 2045 30 2015
dbsake uncache binlog.000017
Uncached binlog.000017
# free -m
total used free shared buffers cached
Mem: 5965 4413 1552 128 435 2259
-/+ buffers/cache: 1718 4247
Swap: 2045 30 2015
开始检查文件系统缓存中存在多少二进制日志(使用dbsake fincore),我们可以看到473M中有42%使用RAM作为FS缓存。然后我强制取消在缓存中使用这些页面(使用fincore uncache),结果,我们释放了+/- 195MB的RAM。
mysql常驻内存_MySQL的内存和相关问题排查相关推荐
- mysql推荐内存_mysql大内存高性能优化方案
mysql优化是一个相对来说比较重要的事情了,特别像对mysql读写比较多的网站就显得非常重要了,下面我们来介绍mysql大内存高性能优化方案 8G内存下MySQL的优化 按照下面的设置试试看: ke ...
- mysql推荐内存_MySQL大内存配置方案 如my-medium.ini、my-huge.ini等
MySql noinstall-5.1.xx-win32 配置(原创) 1.解压mysql-noinstall-5.1.xx-win32.zip 到你喜欢的目录,例如:d:\php\mysql 2.在 ...
- mysql 启动 内存_mysql启动内存的疑问
mysql 启动的时候占用的内存是怎么算的 软件版本 mysql 5.6 网上查看了一下,影响mysql的内存的参数主要大概是 innodb_buffer_pool_size key_buffer_s ...
- mysql+io+参数_MySQL IO线程及相关参数调优
一.关于一个SQL的简单的工作过程 1.工作前提描述 1.启动MySQL,在内存中分配一个大空间innodb_buffer_pool(其中log_buffer) 2.多用户线程连接MySQL,从内存分 ...
- arch mysql日志位置_MySQL 日志文件与相关参数
1 .参数文件及mysql参数 查看mysql 的 my.cnf 配置文件位置命令:>./bin/mysql --help | grep my.cnf 查看mysql 的参数设置命令: mysq ...
- mysql myisam 缓存_MySQL - 储存引擎myisam相关参数
1.表变化修复排序缓冲区 myisam_sort_buffer_size = 64M MyISAM设置恢复表之时使用的缓冲区的尺寸,当在REPAIR TABLE或用CREATE INDEX创建索引或A ...
- mysql内存数据库性能_Mysql内存表配置及性能测试
centos7 mysql数据库安装和配可以参考一下文章,基本照做就可以了(我选的方法二): http://www.cnblogs.com/starof/p/4680083.html 说到内存表,首先 ...
- mysql怎么增加内存_MySQL内存不足怎么办
MySQL内存不足的解决方法:1.增加swap交换空间,代码为[dd if=/dev/zero of=/swapfile bs=1M count=1024]:2.增加自动挂载,在文件[/etc/fst ...
- mysql 自动管理内存_MySQL内存管理,内存分配器和操作系统
导读 作者:Sveta Smirnova 翻译:郑志江 校对:徐晨亮 原文 :MySQL Memory Management, Memory Allocators and Operating Syst ...
最新文章
- c语言logout_C++ 格式化日志输出实现代码
- Mybatis使用接口开发
- 【机器学习】 树的剪枝策略
- python rgb led控件_Raspberry Pi-用树莓派实现RGB LED的颜色控制——Python版本-电路城论坛 - 电子工程师学习交流园地...
- WeihanLi.Npoi 1.18.0 Released
- QT 网络编程(1)
- 啊哈C语言,c语言编程入门书籍及PPT(PDF版)下载网址
- 华为云社区·CSDN【寻找黑马程序员】有奖征文活动,邀你挥洒才情
- Sublime Text 4不显示未注册的方法
- java笔试完一般多久给通知_恭喜浙江,喜提浙江中烟招聘通知,一、二批共计招录130人左右...
- php 中文字符串长度_js或php获取字符串长度中文1个字符,英文0.5个字符
- office 打开wps乱_wps和office冲突怎么办
- 金蝶K3系统物料主数据后台表对应字段一览
- mysql运算符xor_MySql运算符
- PHP爆绝对路径方法总结帖
- DM数据库常用系统视图及数据字典查询部分汇总
- mysql压缩包安装教程_MySQL5.7压缩包安装教程
- java hasnext_java – hasNext() – 什么时候阻止,为什么?
- zData与持续优化 云和恩墨以创新获天安人寿供应商突出贡献奖
- matlab中计算标准差std函数
热门文章
- matlab晶闸管整流电路,采用Matlab/Simulink对三相桥式全控整流电路的仿真分析
- js 中转换成list集合_程序员:java集合介绍-List,具说很详细,你不来看看?
- 1到10选一个数字读心术_厉害了!quot;广东110“互联网报警满足您多场景报警需求!...
- STM32 HAL库 .c/.h 文件介绍
- vue openlayer单击地图事件循环多次执行_12道vue高频原理面试题,你能答出几道?
- 手写tomcat socket closed_【消费电子】:重在阅读,新增手写 BOOX Nova Pro 体验评测...
- 多线程设置操作时间间隔_听说,有位Java程序员学完这59道多线程面试题之后,直接面上阿里...
- 运用计算机计算包含排斥原理,离散数学包含及排斥原理.ppt
- resolv.conf
- macos xampp mysql 命令_MAC系统XAMPP 中 MySQL命令行client配置使用