`

线上MySQL机器内存爆掉原因分析与解决

 
阅读更多

 现象:

  阿里金融某业务的MySQL机器的内存每隔几天就会增长,涨上去后,却不下来。累积后内存爆掉

分析:

  此业务是间隔的对MySQL有大访问,其它时间几乎无访问。排查发现,内存涨时,一般会有MySQL读非常大,主要是InnoDB_DATA_READS。

  结合此时的特性,业务同学给出此时的主要场景:

  1、14个线程并发;

  2、写入数据流程:先查询再update;

select pid,value from tableName where id=?;
查不到“id&pid”的记录,执行如下语句
insert into tableName values ( id,pid,value,now() ) on duplicate key update value=values(value) ;
查到“id&pid”的记录,执行如下
update tableName set value= ? where id=? and pid=?;

  在分析过程,我们走了些弯路。现在回想,我们可能会从如下几个方面去思考:

  1、近期升级过kernel,典型的阿里分库分表集群,其中一台升级未升级。所以,新版本内核相关性不大。

  2、innodb内部统计的内存使用量,没有发现异常。

  3、NUMA开关导致swap。这是MySQL swap中经常会讨论到的,但这几台没有开(线上也全部是关掉的)。

  4、临时表、memory引擎表,可能会消耗大量的服务器端的内存,但业务没有用到或生成临时表。

  5、连接所消耗内存。类似key_buffer_size等每个线程所占有的,是我们格外要注意的,但很明显,这点可以否定,因为并发连接一直很小。

  6、table cache相关的内存。这点实现证明,效果非常明显,是我们排查问题的突破点。

  7、真正的mysqld内存泄漏。结合业务的特性,在buglist中发现这个问题在很久很久之前确实存在并早已fix掉。

  执行FLUSH TABLES发现mysqld的RSZ直接减少10G~

  flush之前:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3018 mysql 20 0 44.2g 41g 4232 S 0.0 86.8 981:52.36 /u01/mysql/libexec/mysqld

$ free -m
total used free shared buffers cached
Mem: 48384 46335 2048 0 344 2896
-/+ buffers/cache: 43094 5289
Swap: 8191 8 8183

  flush之后:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3018 mysql 20 0 34.7g 30g 4248 S 0.3 65.5 981:55.64 /u01/mysql/libexec/mysqld

$ free -m
total used free shared buffers cached
Mem: 48384 36010 12373 0 345 2898
-/+ buffers/cache: 32766 15617

  innodb层状态几乎没有变化:

———————-
BUFFER POOL AND MEMORY
———————-
Total memory allocated 26361200640; in additional pool allocated 0
Dictionary memory allocated 7723336
Buffer pool size 1572863
Free buffers 1
Database pages 1556426
Old database pages 574520
Modified db pages 4
Pending reads 0

  解决方法:

  定时在业务低峰时flush tables或将相关的参数(table_open_cache 和 table_definition_cache)改小(从2048到512或更小)。

分享到:
评论

相关推荐

    完美Mysql 线上部署初始化

    ### 完美MySQL线上部署初始化知识点详解 #### 一、系统安装与配置 **系统环境准备:** 在进行MySQL线上部署之前,首先需要确保服务器操作系统处于一个良好的状态,并且已经安装了必要的软件包来支持MySQL服务。...

    Mysql安全和性能配置标准

    - `my.cnf`文件不建议放在`/etc`目录下,特别是在一台机器运行多个MySQL实例的情况下。 - 示例配置: - `[client]` - `port=3306` - `socket=/tmp/mysql.sock` - `[mysqld]` - `port=3306` - `socket=/tmp/...

    JadeDock:使用Docker快速部署简易的Ngixn + PHP + MySQL + Redis环境(可开发,可线上运行)

    MySQL 是一个关系型数据库管理系统,是许多 Web 应用的首选存储解决方案。在 JadeDock 中,MySQL 容器为 PHP 应用提供数据存储服务。通过 Docker,开发者可以轻松地创建、备份和迁移数据库,而不必关心底层操作系统...

    基于全链路的大数据基础管理关键技术分析.docx

    - **数据开发**:利用批处理、流处理工具以及机器学习算法进行数据处理和分析,提取有价值的信息。 - **数据存储**:根据不同需求选择合适的存储方案,例如OLAP/OLTP数据库、时序数据库等。 - **数据回流**:将处理...

    wampserver2.5

    这允许他们进行实时修改和调试,而不必立即上传到在线服务器,从而降低了因调试错误导致的线上问题风险。 在开发过程中,WampServer还提供了方便的控制面板,可以轻松地启动、停止或重启服务,切换PHP版本,以及...

    Redis云管理平台CacheCloud.zip

    五、CacheCloud在搜狐的规模每天100 亿次命令调用2T 的内存空间800 个Redis实例100 台机器六、CacheCloud环境需求Java 7Maven 3MySQLRedis 3七、CacheCloud快速开始1、初始化数据库 导入项目中cachecloud.sql初始化...

    关于搭建一个PHP工程的例子

    部署时,可以将代码推送到远程服务器,然后在服务器上拉取更新,确保线上环境与开发环境一致。 通过以上步骤,你可以成功搭建一个PHP工程并开始进行开发工作。随着项目规模的扩大,可能需要引入更多的工具和技术,...

    PrxoxySQL Cluster配置及维护

    针对ProxySQL Cluster与DBProxy的功能对比,我们可以从多个维度来分析它们之间的差异。 **1. 配置更新** - **DBProxy(2节点)**:仅能通过手动编辑配置文件进行更新,新增加主从服务器时需要重启服务。这意味着...

    OBCA最新题库(包括单选,多选和判断)

    【OceanBase 数据库基础...总的来说,OceanBase 提供了一个高度可扩展、高可用的分布式数据库解决方案,它的设计考虑了数据的高效写入、读取、备份恢复以及分布式部署的复杂性,为用户提供了一种强大的数据管理工具。

    homestead-6.4.0.tar.gz

    通过 Homestead,开发者可以快速建立一个与生产环境相似的开发环境,确保代码在本地和线上保持一致,减少因环境差异导致的问题。此外,由于所有代码都在虚拟机中运行,这也有助于保护主机系统不受可能的恶意代码影响...

    hbase在阿里搜索中的应用

    - 索引构建:HBase支持从MySQL等数据库中导入商品和用户产生的线上数据,通过流式处理构建搜索引擎所需的索引。在线上环境变化时,如商品库存更新或新产品上架,动态变化的数据通过实时更新到HBase,进而触发增量...

    vagrant bootstrap

    在Vagrant和VirtualBox的帮助下,开发者可以在本地设置一个与生产环境相似的Magento 2环境,进行代码调试和功能测试,而不会影响到线上商店的正常运行。 搭建Vagrant+VirtualBox的本地开发环境步骤如下: 1. **...

    java电影票

    Java电影票系统是一个小型的、基于Java编程语言开发的应用程序,主要功能在于实现线上购票操作。作为一个模板项目,它提供了一个基础框架,方便开发者在此基础上扩展其他相关功能,如座位选择、订单管理、用户账户...

    Cachecloud文档

    sh start.sh # 如果机器内存不足,可以调整 `-Xmx` 和 `-Xms` 参数 sh stop.sh ``` 3. **登录确认**: 访问 `http://127.0.0.1:9999/manage/login` (其中 9999 为 Tomcat 的端口号,具体端口号参见 `online....

    Linux操作系统基础教程

    Linux 是在 1991 年发展起来的与 UNIX兼容的操作系统,可以免费使用,它的源代码 可以自由传播且可任人修改、充实、发展,开发者的初衷是要共同创造一个完美、理想并 可以免费使用的操作系统。 我们并不能使同学...

    LupoBot

    8. **数据库集成(Database Integration)**:如果LupoBot需要存储持久化数据,如用户信息、聊天记录等,那么它可能会与数据库进行交互,如MySQL、MongoDB等。 在实际开发中,你可能需要学习以下技能来更好地利用...

Global site tag (gtag.js) - Google Analytics