闲谈 MySQL内存管理,内存分配器和操作系统
文 / @WordPress主题
MySQL内存管理、内存分配器和操作系统是一个开发人员经常遇到的话题。当用户使用MySQL时,可能会遇到内存问题,如内存泄漏等。然而,并不总是内存泄漏问题。本文将围绕一个关于内存的bug展开,讲述该bug的原因以及解决方案。
该bug是关于访问InnoDB全文索引时导致内存使用量增长的问题。在InnoDB解析全文查询时,它会在fts_query_phrase_search函数中创建一个内存堆。这个堆可能增长到80MB,并且还会产生大量非连续块(mem_block_t),从而导致内存碎片。然而,在函数结束时,这些内存堆会被释放,每个块都会进行相应的操作。尽管如此,在释放内存时,操作系统并不一定会立即将该内存返回给系统。如果内存分配器发现这些内存块马上还需要被用到,则会将他们保留住继续用于mysqld进程。这就可能解释了为什么mysqld在完成工作及释放内存都结束后还会占用大量内存。
解决这个问题的方法有两种。第一种方法是修改InnoDB全文索引的实现,但这可能会导致软件与上游不兼容。其次,是使用自定义内存库,例如jemalloc,但这种方法可能会命中一些jemalloc库中专门为性能设计但不是最安全的内存分配的bug。因此,我们不得不在这两个并不完美的方法中选择一个。鉴于方法一可能导致percona服务与上游的不兼容,我们更倾向于用方法二来解决问题,并期待着上游修复这个bug。
总之,本文阐述的问题提示我们,在MySQL中遇到内存问题,不一定总是内存泄漏问题,我们可以在PerformanceSchema中使用内存检测来了解进程是如何使用已分配的内存,也可以尝试替换内存库来更好地处理内存分配与释放。

相关文章
-
MySQL Workbench怎么建立数据库(附:sql语句创建数据库方法) 2023-07-20 12:22:29
-
MySQL Workbench是什么?(附:如何设置中文教程) 2023-07-20 11:42:31
-
一起聊聊MySQL主从延时的处理方案 2023-05-14 07:00:03
-
mysql怎么将查询结果赋给变量 2023-05-14 07:00:03
-
mysql驱动是什么 2023-05-14 07:00:03
-
qt5.8如何连接mysql 2023-05-14 07:00:03
-
MySQL 语法整理介绍 2023-05-14 07:00:03
-
mysql修改表结构的语句是什么 2023-05-14 07:00:03
-
mysql乐观锁和悲观锁的区别是什么 2023-05-14 07:00:03
-
mysql查询怎么区分大小写 2023-05-14 07:00:02