空库实例频繁重启

1、 【问题现象】背景: xxx实例只有一个空库却一直在挂【实例只创建了一个库,没有创建任何表】,每隔5分钟,实例就会重启一次,空实例频繁重启,后端显示内存超限。
我们购买新实例测试却没有复现实例内存超限情况。
首先我们先确认PDD同步的信息“空库实例频繁挂掉”登录实例查询实例情况:执行show processlist查询除了tencentroot连接外并没有业务,确认用户zhusha库中也无表。
​​
查询监控,实例是最近才购买的,从购买后,内存使用一直超用,正常情况2G实例内存上线是5G,实际用户使用了4.59G。
疑问一:为什么PDD空库会出现内存超用呢?
疑问二:重启频率为什么是5分钟呢?后端是不是有什么任务在跑?

2、 【分析思路和步骤】
(1) 分析思路和步骤:
确认PDD从购买实例后就开始出现内存超限,实例重启现象;我们购买测试实例发现并没有复现,通过通过拉取PDD初始化设置的参数日志对比,发现PDD默认开启了performance_schema。我们将测试实例也开启ps发现实例内存超用并触发实例重启,复现PDD现象。
PDD购买实例时设置默认参数table_open_cache=102400、table_definition_cache=4048、performance_schema=on。开启 ps时,performance_schema_max_table_instances:【最大测量多少个表对象】
对应 (ps_table_share).memory,实例参数performance_schema_max_table_handles=204800;performance_schema_max_table_handles:【最大打开表的总数】
对应(ps_table).memory,实例参数performance_schema_max_table_instances=12500随着 table_open_cache 的增大而增大。

(2) ps的简单介绍:
云上实例默认是关闭ps的,规格实例打开ps会导致内存超用。ps作为mysql统计信息采集,将采集的信息放到内存表中,在分析数据库性能问题的时候可以提供重要的统计信息,对分析数据库问题是有一定作用,但是实例重启会丢失所有数据,而且开启会消耗大量内存资源。
详细参考:
https://dev.mysql.com/doc/refman/5.6/en/performance-schema.html
https://dev.mysql.com/doc/refman/5.7/en/performance-schema.html

(3) 后端逻辑:
正常情况2G实例内存上线是5G,实际用户使用了4.59G,为什么使用4.59G实例就会重启呢? 因为后端有逻辑判定,如果实际内存使用超过内存上线的80%,后端会kill mysql 会话,kill掉会话后仍没有恢复则会kill mysqld进程,约5分钟判定一次,5G*80%<4.59G,所以实例就每5隔分钟重启一次。

3、 【验证】
(1) 验证方案
下面测试验证小规格实例【购买2G内存测试实例】关闭和开启ps内存使用情况
【下面截图是测试1、2、3、4点内存监控图】


1、 关闭ps设置参数table_open_cache=102400、table_definition_cache=4048——内存未超用
2、 开启ps设置参数table_open_cache=102400、table_definition_cache=4048——内存超用,内存使用4.59G
3、 开启ps设置参数table_open_cache=512、table_definition_cache=768——内存超用,参数设置为默认值,内存使用4.46G
4、 开启ps设置参数table_open_cache=512、table_definition_cache=768、performance_schema_max_table_handles=-1、performance_schema_max_table_instances设置-1——内存未超用。performance_schema_max_table_handles和performance_schema_max_table_instances无法动态修改,控制台也不支持。

 

(2) 实验结果
从上面测试结果得到:小规格实例默认关闭ps,开启了ps事件会导致内存消耗,线上要开启ps建议先测试再决定是否开启。

4、 优化方案或者最佳实践
小规格实例建议默认关闭ps参数。

posted @ 2019-08-06 10:40  Sisiluo  阅读(272)  评论(1编辑  收藏  举报