percona-mysql内存使用异常问题
时间:2014-05-04 06:05:02 作者:beebol 标签: 分类: Mysql
这个是同事遇到的一个mysql如何吃掉所有内存后,导致mysql无法写入数问题。问题比较好,分享下。。。
【问题描述】
Mysql占用内存异常,mysql每运行45小时左右,就会把16G的物理内存和12G的SWAP空间(最大值是16G,4G系统预留)全都占用掉,进而导致无内存分配给新的请求,IOWATI激增,程序shm无法往mysql写入数据,出现回档。
【导致内存占用异常的原因】
目前排查出来是由于/etc/hosts中配置的游戏服务器的主机名长度超过了16个字符导致的,在percona mysql中有一张动态视图information_schema.CLIENT_STATISTICS,它会统计客户端访问mysql的信息:
我们注意到在percona mysql 5.0.67版本中,CLIENT字段的长度是16字节(是不是跟最大长度的IP地址字符数一致?),但是在/etc/hosts中配置的主机名长度却超过了16个字符:
gs_9017_my_tlbb_10.120.104.59
这样就导致mysql5.0.67在往information_schema.CLIENT_STATISTICS里面统计客户端信息的时候,遇到BUG,这时mysql就会不断地往里面重新插入记录,但是插入的记录都是有问题的:
游戏服务器连接mysql之后的几分钟,生成的记录数就高达10万,当运行6个小时左右的时候会生成1千万左右的记录数,占用内存高达2G多。
正常的客户端连接统计信息:
【解决方法】
修改/etc/hosts中游戏服务器的主机名长度,长度不能超过16个字符,由于程序跟mysql之间是长连接,所以还需要重新启动程序,释放当前的连接,重新访问mysql。
【关于mysql占用掉所有的内存,缺没有内存溢出的原因的猜测】
现在我们已经知道mysql要实时统计客户端访问mysql的动态信息,并把这些数据写入到内存中的information_schema.CLIENT_STATISTICS动态视图,当mysql已经占用了服务器所有的物理RAM和80%的SWAP时,由于此时没有可用的内存,会导致操作系统的IOWAIT增长到20~30,并且新的连接无法连入mysql,已经建立的连接也会陷入到僵死状态,此时相当于所有访问mysql的客户端连接都是静止的,mysql不会在去更新CLIENT_STATISTICS中的记录,但是CLIENT_STATISTICS占用的内存又不会释放,这样就出现了内存都被占用,却没有发生Out of memory的现象。
【新版本mysql中的CLIENT_STATISTICS】
在新版本中CLIENT_STATISTICS的CLIENT字段长度已经由varchar(16)调整为varchar(64)