现象:
阿里金融某业务的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服务。...
- `my.cnf`文件不建议放在`/etc`目录下,特别是在一台机器运行多个MySQL实例的情况下。 - 示例配置: - `[client]` - `port=3306` - `socket=/tmp/mysql.sock` - `[mysqld]` - `port=3306` - `socket=/tmp/...
MySQL 是一个关系型数据库管理系统,是许多 Web 应用的首选存储解决方案。在 JadeDock 中,MySQL 容器为 PHP 应用提供数据存储服务。通过 Docker,开发者可以轻松地创建、备份和迁移数据库,而不必关心底层操作系统...
- **数据开发**:利用批处理、流处理工具以及机器学习算法进行数据处理和分析,提取有价值的信息。 - **数据存储**:根据不同需求选择合适的存储方案,例如OLAP/OLTP数据库、时序数据库等。 - **数据回流**:将处理...
这允许他们进行实时修改和调试,而不必立即上传到在线服务器,从而降低了因调试错误导致的线上问题风险。 在开发过程中,WampServer还提供了方便的控制面板,可以轻松地启动、停止或重启服务,切换PHP版本,以及...
五、CacheCloud在搜狐的规模每天100 亿次命令调用2T 的内存空间800 个Redis实例100 台机器六、CacheCloud环境需求Java 7Maven 3MySQLRedis 3七、CacheCloud快速开始1、初始化数据库 导入项目中cachecloud.sql初始化...
部署时,可以将代码推送到远程服务器,然后在服务器上拉取更新,确保线上环境与开发环境一致。 通过以上步骤,你可以成功搭建一个PHP工程并开始进行开发工作。随着项目规模的扩大,可能需要引入更多的工具和技术,...
针对ProxySQL Cluster与DBProxy的功能对比,我们可以从多个维度来分析它们之间的差异。 **1. 配置更新** - **DBProxy(2节点)**:仅能通过手动编辑配置文件进行更新,新增加主从服务器时需要重启服务。这意味着...
【OceanBase 数据库基础...总的来说,OceanBase 提供了一个高度可扩展、高可用的分布式数据库解决方案,它的设计考虑了数据的高效写入、读取、备份恢复以及分布式部署的复杂性,为用户提供了一种强大的数据管理工具。
通过 Homestead,开发者可以快速建立一个与生产环境相似的开发环境,确保代码在本地和线上保持一致,减少因环境差异导致的问题。此外,由于所有代码都在虚拟机中运行,这也有助于保护主机系统不受可能的恶意代码影响...
- 索引构建:HBase支持从MySQL等数据库中导入商品和用户产生的线上数据,通过流式处理构建搜索引擎所需的索引。在线上环境变化时,如商品库存更新或新产品上架,动态变化的数据通过实时更新到HBase,进而触发增量...
在Vagrant和VirtualBox的帮助下,开发者可以在本地设置一个与生产环境相似的Magento 2环境,进行代码调试和功能测试,而不会影响到线上商店的正常运行。 搭建Vagrant+VirtualBox的本地开发环境步骤如下: 1. **...
Java电影票系统是一个小型的、基于Java编程语言开发的应用程序,主要功能在于实现线上购票操作。作为一个模板项目,它提供了一个基础框架,方便开发者在此基础上扩展其他相关功能,如座位选择、订单管理、用户账户...
sh start.sh # 如果机器内存不足,可以调整 `-Xmx` 和 `-Xms` 参数 sh stop.sh ``` 3. **登录确认**: 访问 `http://127.0.0.1:9999/manage/login` (其中 9999 为 Tomcat 的端口号,具体端口号参见 `online....
Linux 是在 1991 年发展起来的与 UNIX兼容的操作系统,可以免费使用,它的源代码 可以自由传播且可任人修改、充实、发展,开发者的初衷是要共同创造一个完美、理想并 可以免费使用的操作系统。 我们并不能使同学...
8. **数据库集成(Database Integration)**:如果LupoBot需要存储持久化数据,如用户信息、聊天记录等,那么它可能会与数据库进行交互,如MySQL、MongoDB等。 在实际开发中,你可能需要学习以下技能来更好地利用...