闲谈 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中使用内存检测来了解进程是如何使用已分配的内存,也可以尝试替换内存库来更好地处理内存分配与释放。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。