5.6 太多分区引起OOM

一个月之前,Scott和同事们发现公司有一个MySQL MHA集群的master(假设master机器名为hostA)每隔一周左右就会挂一次(指MySQL挂掉),在几周内,MHA来回切了好几次。

按照国际惯例,Scott按照如下顺序去查问题到底出在哪里:
(1)先翻MySQL error log,没有发现异常
(2)再翻Linux系统日志文件,果然,翻到了下面的内容:

Nov 26 13:05:38 hostA kernel: mysql invoked oom-killer: gfp_mask=0x280da, order=0, oom_adj=0, oom_score_adj=0
...此处内容省略N行...
Nov 26 13:05:38 hostA kernel: Out of memory: Kill process 32271 (mysqld) score 976 or sacrifice child
Nov 26 13:05:38 hostA kernel: Killed process 32271, UID 496, (mysqld) total-vm:83064212kB, anon-rss:64204132kB, file-rss:4544kB

该机器的物理内存大小为62G,从上面的日志看,MySQL确实已经把它用满了。该机器上MySQL的innodb_buffer_pool=31G,Scott认为这已经相当保守了,而且各种buffer_size我们都使用的是默认值,MySQL OOM时的用户连接数是100+,

这些目测都没有什么问题,但是居然还是发生了OOM,实在是不可思议。当时觉得就是内存不够用了呗,没有查出具体原因,后来62G的内存加到了125G(innodb_buffer_pool_size增大到64G,这值确实很保守),还是发生了OOM。(OOM指的是在系统物理内存被用完时,Linux内核为了保证系统的正常运行,根据一定的算法杀掉占用内存较大的进程,基本上可以认为是杀掉占用内存最大的进程以释放内存资源。)

其实一开始Scott就发现,这台机器上有一个更早的问题,就是因为系统最大文件打开数不够导致这台机器的xtrabackup备份总是不成功,具体是什么原因请等Scott去整理xtrabackup备份的更详细的过程。然后我去检查了该机器上面的*.ibd文件和*.frm文件数量,吓我一跳:

[[email protected] mysql]$ sudo find . -name ‘*.ibd‘ | wc -l
169577
[[email protected] mysql]$ sudo find . -name ‘*.frm‘ | wc -l
2534

也就是说,该机器上面竟然有17万个ibd文件,但是只有2534张表,很明显是分区表中的分区数量非常多。

[[email protected] mysql]$ sudo find . -name ‘*par*‘ | wc -l
1882

Scott仔细比较了这台机器和其他没有问题的机器的不同,发现这台机器上面分区数量太多是唯一的一个不同,这让Scott没有办法不怀疑是分区导致的问题。

Scott仍然按照国际惯例,第一时间去查MySQL 5.6的官方文档,无果。。。(官方文档虽然不是万能的,但是仍然是出现问题的第一参考资料)

去MySQL的bugs页面搜索关于partition的bug,无果。。。

去google了下,发现有的比较杂的网站上面写道MySQL分区数量太多引发内存耗尽的问题,但是文章讲的内容感觉不是很正确。

最后在姜老师的指点下,看了这篇文章:

http://mysqlserverteam.com/innodb-native-partitioning-early-access/

上面是MySQL开发团队写的关于InnoDB Native Partitioning的文章。文章中大概讲的内容是,在5.6里面,分区的信息是在MySQL Server层维护的(在.par文件里面),InnoDB引擎层是不知道有分区这个概念的,InnoDB引擎层把每一个分区都当成一张普通的InnoDB表。在打开一个分区表时,会打开很多个分区,打开这些分区表就相当于打开了同等数量的InnoDB表,这需要更多内存存放InnoDB表的元数据和各种与ibd文件打开相关的各种cache与handler的信息。在5.7里面,InnoDB引入了Native Partitioning,它把分区的信息从Server层移到了InnoDB层,打开一个分区表和打开一个InnoDB表的内存开销基本是一样的。

If we compare the amount of memory used when opening a single instance of this table, first using the old generic non-native partitioning, and then with InnoDB Native Partitioning we see the following:

One open instance of the table takes 49% less memory (111MB vs 218MB) with the current state of Native Partitioning support. With ten open instances of the table, we take up 90% less memory (113MB vs 1166MB)!

由于升级到5.7还需要一些时日,目前已经将分区数量减少到25000,125G剩余内存在20天里一直稳定在20G左右,这也表明确实是分区数量太多的原因。

时间: 2024-11-06 09:58:17

5.6 太多分区引起OOM的相关文章

Linux学习(CentOS-7)---磁盘分区(概念、分区方法、分区方案)

1磁盘分区相关的概念 1.1什么是磁盘 磁盘就是计算机的外部存储器设备,即将圆形的磁性盘片装在一个方的密封盒子里,这样做的目的是为了防止磁盘表面划伤,导致数据丢失.简单地讲,就是一种计算机信息载体,也可以反复地被改写.磁盘有软盘和硬盘之分: 1.1.1软盘(Floppy Disk) 软盘是个人计算机(PC)中最早使用的可移介质.软盘的读写是通过软盘驱动器完成的.软盘驱动器设计能接收可移动式软盘,目前常用的就是容量为1.44MB的3.5英寸软盘.软盘存取速度慢,容量也小,但可装可卸.携带方便.作为

大数据存储的秘密之分区

分区,又称为分片,是解决大数据存储的常见解决方案,大数据存储量超过了单节点的存储上限,因此需要进行分区操作将数据分散存储在不同节点上,通常每个单个分区可以理解成一个小型的数据库,尽管数据库能同时支持多个分区操作:分区引入多分区概念,可以同时对外服务提高性能. 常常和分区一并提及的概念是复制,分区通常与复制结合使?,使得每个分区的副本存储在多个节点上. 这意味着,即使每条记录属于?个分区,它仍然可以存储在多个不同的节点上以获得容错能?.分区在许多技术或框架中都有体现,例如MQ中topic下的分区消

[转] - Spark排错与优化

Spark排错与优化 http://blog.csdn.net/lsshlsw/article/details/49155087 一. 运维 1. Master挂掉,standby重启也失效 Master默认使用512M内存,当集群中运行的任务特别多时,就会挂掉,原因是master会读取每个task的event log日志去生成Sparkui,内存不足自然会OOM,可以在master的运行日志中看到,通过HA启动的master自然也会因为这个原因失败. 解决 增加Master的内存占用,在Mas

Docker容器CPU、memory资源限制

背景 在使用 docker 运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU.内存和磁盘资源.如果不对容器使用的资源进行限制,那么容器之间会互相影响,小的来说会导致容器资源使用不公平:大的来说,可能会导致主机和集群资源耗尽,服务完全不可用. docker 作为容器的管理者,自然提供了控制容器资源的功能.正如使用内核的 namespace 来做容器之间的隔离,docker 也是通过内核的 cgrou

Spark内存模型详解

1 堆内和堆外内存规划 Spark执行器(Executor)的内存管理建立在 JVM 的内存管理之上,Spark 对 JVM 的空间(OnHeap+Off-heap)进行了更为详细的分配,以充分利用内存.同时,Spark 引入了Off-heap 内存模式,使之可以直接在工作节点的系统内存中开辟空间,进一步优化了内存的使用(可以理解为是独立于JVM托管的Heap之外利用c-style的malloc从os分配到的memory.由于不再由JVM托管,通过高效的内存管理,可以避免JVM object o

王家林谈Spark性能优化第一季!(DT大数据梦工厂)

内容: 1.Spark性能优化需要思考的基本问题: 2.CPU和Memory: 3.并行度和Task: 4.网络: ==========王家林每日大数据语录============ 王家林每日大数据语录Spark篇0080(2016.1.26于深圳):如果Spark中CPU的使用率不够高,可以考虑为当前的程序分配更多的Executor,或者增加更多的Worker实例来充分的使用多核的潜能. 王家林每日大数据语录Spark篇0079(2016.1.26于深圳):适当设置Partition分片数是非

xml数据解析和生成

java中xml的解析方式有许多,有java自带的DOM.SAX,android中的PULL,其它的还有DOM4J.JDOM等. 本文简要讲述DOM.SAX.PULL三种方式. 1.DOM方法 缺点:此方法会将所有数据都读取到内存中,内存消耗大,数据量太大容易造成OOM,而且此方法的效率较低,所以不建议在移动开发中使用. 优点:以树形的结构访问,容易理解,编码简单,可随机访问所需要的内容. 2.SAX方法: 从开头顺序读取直至结尾,读取和处理同步. 缺点:编码难度较大 优点:解析快,占用内存小,

把ubuntu安装到移动u盘(移动硬盘)随插随用 移动电脑

各种自己使用过程中小的问题 持续更新中 http://jingyan.baidu.com/article/624e74598306c334e8ba5a00.html按照这个弄好的,但这个比较老了 我写点附加的东西,不一样的地方我会说 写成F/Q吧 1.说的l制作ubuntu ivecd或者u盘启动(注意:u盘启动 需要一个u盘,一个移动硬盘 u盘相当于安装程序,移动硬盘相当于安装完成的程序存放地 也就是你以后的“移动电脑”) ubuntu最好下载最新的16.04.iso ubuntu kylin

LVM的创建、扩展、收缩及快照功能的介绍

LVM技术说明: LVM是logical Volume Manager(逻辑卷管理)的简称. LVM机制使得我们安装系统时候不用太担心分区大小对后期扩展带来的不便. LVM是在物理卷(Physical Volume)上再建立了一层逻辑层.可以将多块磁盘组成卷组,再划分为多个逻辑卷. 首先,说下几个名词: PV     # 物理卷Physical Volume VG     # 卷组Volume Group LV     # 逻辑卷Logical Volume PE     # 物理块Physic