优化 - 重构一次Mysql导致服务器的OOM

这篇具有很好参考价值的文章主要介绍了优化 - 重构一次Mysql导致服务器的OOM。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

优化了一次前后端处理不当导致的CPU的一次爆机行为,当然,这和服务器的配置低也有着密不可分的关系,简单的逻辑学告诉我们,要找到真正的问题,进行解决,CPU爆机的关键点在于前后端两个方面,下面针对具体的问题,进行分析和解决。

定位问题

优化 - 重构一次Mysql导致服务器的OOM,# 思考,# MySql,# PHP,重构,mysql,服务器

看监控的图表,CPU已经达到了100%,但是内存的使用曲线很平缓(也说明内存没有被合理的使用),大概率是代码或者循环中产生的问题,服务器进程处理产生多条阻塞,产生的积压,导致的崩溃。

服务端Join影响了性能

顺着代码分析,找到了影响性能的几个关键点,服务端导致性能慢的关键点在于18w的用户表分别和26w的评估记录表、88w的训练动作表、19w的用户签到表进行Join所产生的进程处理缓慢,下面我们用explan工具分别看一下所在的性能差别。

Mysql主要看到的是type和rows的指标,下面的语句告诉我们是全量(all)扫描了179223条数据,优化到了range级别的349条。

+----+-------------+-------+------+-------------------+---------+---------+----------+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys     | key     | key_len | ref      | rows   | Extra                                        |
+----+-------------+-------+------+-------------------+---------+---------+----------+--------+----------------------------------------------+
|  1 | SIMPLE      | u     | ALL  | PRIMARY,origin_id | NULL    | NULL    | NULL     | 179223 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | a     | ref  | user_id           | user_id | 4       | cc.u.uid |      1 | Using where                                  |
+----+-------------+-------+------+-------------------+---------+---------+----------+--------+----------------------------------------------+
2 rows in set (0.01 sec)
+----+-------------+---------------+-------+---------------+---------+---------+------+------+-----------------------------+
| id | select_type | table         | type  | possible_keys | key     | key_len | ref  | rows | Extra                       |
+----+-------------+---------------+-------+---------------+---------+---------+------+------+-----------------------------+
|  1 | SIMPLE      | cc_assessment | range | user_id       | user_id | 4       | NULL |  349 | Using where; Using filesort |
+----+-------------+---------------+-------+---------------+---------+---------+------+------+-----------------------------+
1 row in set (0.01 sec)

和上面的问题差不多,都是全量检索了80w+数据,优化后range方式检索了1.2w+条数据。

+----+-------------+-------+--------+-------------------+---------+---------+--------------+--------+-------------+
| id | select_type | table | type   | possible_keys     | key     | key_len | ref          | rows   | Extra       |
+----+-------------+-------+--------+-------------------+---------+---------+--------------+--------+-------------+
|  1 | SIMPLE      | t     | ALL    | user_id           | NULL    | NULL    | NULL         | 881949 | Using where |
|  1 | SIMPLE      | u     | eq_ref | PRIMARY,origin_id | PRIMARY | 4       | cc.t.user_id |      1 | Using where |
+----+-------------+-------+--------+-------------------+---------+---------+--------------+--------+-------------+
+----+-------------+-----------------+-------+---------------+---------+---------+------+-------+-------------+
| id | select_type | table           | type  | possible_keys | key     | key_len | ref  | rows  | Extra       |
+----+-------------+-----------------+-------+---------------+---------+---------+------+-------+-------------+
|  1 | SIMPLE      | cc_train_action | range | user_id       | user_id | 4       | NULL | 12979 | Using where |
+----+-------------+-----------------+-------+---------------+---------+---------+------+-------+-------------+
1 row in set (0.02 sec)

Mysql以page为基础,采用Be+Tree的结构存储在硬盘中,对硬盘的I/O传输效率非常明显和敏感,一般的CPU爆机可能产生的情况就是代码中的循环和递归使用的不当,还有一种可能的情况就是Mysql的Sql使用的不当导致的。

代码字典式拼接

之前的查询写在了循环里,数据多的时候,Mysql需要进行反复的连接、查询、断开影响性能,这个地方也进行了优化。

$areaList = $this->area_model->get_info(['id' => $areaAllIds], '', '', '', 'id,name');
$areaNameDict = array_column($areaList, 'name', 'id');
foreach ($user_infos as $key => $val) {
    //数组拼接
    $user_infos[$key]['province_name'] = isset($areaNameDict[$val['native_province_id']]) ? $areaNameDict[$val['native_province_id']] : '';
}

大胆使用内存

优化 - 重构一次Mysql导致服务器的OOM,# 思考,# MySql,# PHP,重构,mysql,服务器

因为内存的曲线较为平缓,说明内存不是导致问题的关键行为,PHP-FPM的特性在子进程执行结束也会进行释放,所以在进程执行时要保证内存的合理使用,可以一次性的加载数据。

ini_set('memory_limit', '1024M');

前段的定时器

Http的每一次请求,服务器都会对应开启一个进程,进行处理和响应,前段的小伙伴使用定时器每分钟进行一次请求,导致的直接结果就是服务器进入了多条等待导致的阻塞,直接到CPU打满。

优化 - 重构一次Mysql导致服务器的OOM,# 思考,# MySql,# PHP,重构,mysql,服务器

和前端的小伙伴沟通和协商,30分钟请求一次服务,就变的平稳和丝滑了,至此这个问题告一段落了。

优化 - 重构一次Mysql导致服务器的OOM,# 思考,# MySql,# PHP,重构,mysql,服务器

最后

我曾经一度认为不停的学习和钻研技术就能做到技术人中的天花板,就可以所向无敌,还是卖炭翁的一句【我亦无他 唯手熟尔】点醒了我,其实就分熟练和不熟练2种 有2点要纠正自己和分享给朋友们,技术人更高维度是要学会合作、沟通和理解,协商的解决问题,Tcp、Http、Udp都是协议,都是请求和响应的双方达成一致,进行的通信。

当然,要保持良好的学习习惯和修炼技能的纯度,也是必不可少的。文章来源地址https://www.toymoban.com/news/detail-810249.html

到了这里,关于优化 - 重构一次Mysql导致服务器的OOM的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记一次MySQL从节点服务器宕机重启后,从节点出现主键冲突异常的处理

    MySQL 5.7 非GTID模式多线程复制。 某MySQL数据库从节点因故障宕机(因故障直接宕机,非正常关闭),重启之后发现复制状态异常,show slave的结果中Slave_SQL_Running为No,错误代码为1062 error code,从系统表performance_schema.replication_applier_status_by_worker以及error log中显示某条数据因为已

    2024年02月19日
    浏览(45)
  • 读高性能MySQL(第4版)笔记05_优化服务器设置

    2.1.3.1. MySQL只需要少量的内存就能保持一个连接(通常是一个相关的专用线程)打开 2.2.1.1. InnoDB缓冲池大小 2.2.1.2. 需要的内存比其他任何组件都多 2.2.1.3. 不仅缓存索引,还缓存行数据、自适应哈希索引、更改缓冲区、锁和其他内部结构等 2.2.1.4. InnoDB严重依赖缓冲池,应

    2024年02月09日
    浏览(55)
  • mybatis批量插入数据导致系统OOM,微服务内存爆了

    今天我们来说说工作中遇到的一个真实案例,由于使用mybatis的批量插入功能,导致系统内存溢出OOM(Out Of Memory), \\\"java.lang.OutOfMemoryError: Java heap space\\\"的报错,导致服务出现短暂的服务不可用,大概一两分钟不可用。这其实是个非常危险的故障,可能在高峰期导致整个系统瘫

    2024年02月01日
    浏览(48)
  • journal日志导致服务器磁盘满

    ubuntu 18.04服务器磁盘突然100% 一查/var/log/journal目录占了14G 要清理 journal 日志,可以使用以下步骤: 运行以下命令来查看 journal 日志的使用情况: 这将显示 journal 日志的当前使用情况,包括占用的磁盘空间和日志条目数量。 上述命令将清除 journal 日志中超过 100MB 大小的内容

    2024年02月10日
    浏览(42)
  • 基于多反应堆的高并发服务器【C/C++/Reactor】(下)重构Channel类

    一、C语言 Channel.h Channel.c 二、C++ Channel.h Channel.cpp  

    2024年01月21日
    浏览(70)
  • 服务器数据恢复—服务器进水导致阵列中磁盘同时掉线的数据恢复案例

    服务器数据恢复环境: 数台服务器+数台存储阵列柜,共上百块硬盘,划分了数十组lun。 服务器故障检测: 外部因素导致服务器进水,进水服务器中一组阵列内的所有硬盘同时掉线。 北亚数据恢复工程师到达现场后发现机房内有一台存储柜中的机器都没有开机。和用户方沟

    2024年01月23日
    浏览(52)
  • 服务器 ping 不通有哪些原因导致的

    服务器 ping 不通有哪些原因导致的 太心急。即网线刚插到交换机上就想 Ping 通网关,忽略了生成树的收敛时间。当然,较新的交换机都支持快速生成树,或者有的管理员干脆把用户端口(access port)的生成树协议关掉,问题就解决了。 某些路由器端口是不允许用户 Ping 的。

    2024年02月12日
    浏览(49)
  • 使用代理服务器导致电脑无法打开网页解决办法

    日常生活和工作中,经常会使用代理IP。但是在使用完代理服务器之后,很多用户都会遇到这样的问题:明明网络正常,为什么网页确打不开了? 其实,只需要关闭代理服务即可。具体操作如下: win+i进入设置 进入【网络和Internet】 进入【代理】 关闭【使用代理服务器】选

    2024年02月11日
    浏览(70)
  • 有哪几种行为会导致服务器被入侵

    导致服务器被入侵的行为有很多种,以下是一些常见的行为: 系统漏洞:服务器操作系统或软件存在漏洞,攻击者可以通过利用这些漏洞获取系统权限,从而入侵服务器。 弱口令:服务器的账号密码过于简单或者未及时更新,攻击者可以通过暴力破解等手段获取系统权限,

    2024年02月22日
    浏览(54)
  • 导致服务器CPU跑满的原因有哪些

    一.硬件原因 服务器CPU自身出现问题,比如机房散热不足,温度过热或者驱动故障,导致CPU性能下降,很容易造成CPU跑满的情况。 二.网站代码错误 排查硬件原因后,我们进入网站后台查看是哪些程序占用了大量CPU,检测这些代码自身是否有问题。如果是代码问题就需要

    2024年02月12日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包