MySQL占用内存和SWAP问题解决
背景
发现公司的项目部署上,经常出现数据库占用内存很高(接近6G)的情况,而且还出现了SWAP使用到90%左右的水平。所以需要排查数据库使用内存的情况,看数据库为什么使用了这么多内存,而且会不会频繁使用交换空间。
要解决的问题:
-
数据库使用高内存
-
数据库使用SWAP
解决
SWAP空间
在内存不够的时候,磁盘空间当做内存
系统默认已经分配了SWAP空间大小,可以通过指令 “cat /proc/swaps”、“swapon -s”、“free”等命令查看Swap分区的情况
系统关于SWAP的设置
vm.swappiness,这个一般需要设置成小于等于10。
设置方式:

查看是否发生内存泄露
通过free -gt 查看内存使用情况,如果cached 和 used 相差特别大的话,基本可确定系统发生内存泄露。
数据库使用NUMA对SWAP的影响
首先,NUMA到底是什么?
它表示给CPU动态分配内存,可能会导致当某个CPU需要占用大量内存的时候,会分配不了,然后就去占用SWAP的空间了。
解决方式:5.6.27之后的版本,修改mysql里面的innodb_numa_interleave配置。
如果版本比较低,则可以在mysql_safe的启动脚本中加上numactl –interleave all 来解决。
其他调整方式
修改innodb_flush_method为O_DIRECT,这样InnoDB会绕过Cache来访问磁盘。
参考网站:
NUMA架构的CPU -- 你真的用好了么?

浙公网安备 33010602011771号