容易引起雪崩的两个处理

简介: 容易引起雪崩的两个处理

背景


先介绍标题《容易引起雪崩的两个处理》的第一个处理:慢查询。上周在测试环境遇到一个慢查询问题,虽然是测试环境,但是现象还是很让人担忧的:“在大量执行update操作”“已经执行1个多小时”“负载200多,基本上库都卡死了”。把库都要搞挂了,细思极恐啊。于是,这个事件处理的优先级即刻被升级为S级别,我们进行了点线面的梳理和分析。



现象分析


首先针对此问题做一个分析。慢查询的原因简单可以这么理解:公司创立之初写的代码,当时上线工期紧,做的比较糙(声明:不代表公司水平)。后台有个人工查询操作,这个操作要查询下游,下游是异步返回结果。所以是通过异步转同步实现的,使用了一张表,每次操作将历史记录标识位全部改成“已过期”,再将新结果插入到数据表中。“在大量执行update操作”指的就是批量更新标识位的操作。大概一次操作要更新几十万条,然后插入几条。一次更新要执行几十秒。


问题解决


当时同事提出要加索引解决,我第一个反应:最主要的字段只有两个值:“已过期”、“未过期”。对这种字段加索引是不是没什么用?结果实际测试结果是:不加这条索引十几秒执行完的查询和更新操作,加了索引只要几毫秒。


原理分析


这里主要分析三个问题。


1>为什么这条索引如此管用?


先说说为什么我第一反应觉得不管用,看看某乎上的神回复:


1112728-20211002101531703-790099193.png


先说为什么能提高查询速度。举个例子,假设表中有一千万条记录,状态字段有0和1两个值。某个状态为0的记录总数大概会有100条,那么你想查询状态为0的记录时,有没有索引影响非常大,而查询状态为1的记录,则索引基本无用。如果两种状态的记录数相差无几的话,索引也基本无用。所有的关于索引的文章,建议你不要为这种字段建索引的依据,都是以值分布是均匀为前提的。但如果值分布不均匀的时候,这个建议就不一定是正确的了。当我们需要查询的记录恰好是分布较少的记录的时候,值分布越是不均匀,索引就越有价值!那为什么能提高更新速度呢?


对于update/insert/delete的每次执行,字段的索引都必须重新计算更新。听起来很慢,但是更新操作实际上是先select再update的过程,这里因为“未过期”数据条数很少,所以select效率高,然后更新是按照id进行更新,所以很快。


2>为什么慢查询会导致库卡死?


一般慢查询,特别是这样将历史记录标识位全部改成“已过期”的,必然会引起锁表。这个表的相关操作会受到影响是可以理解的,但是为什么会影响到整个数据库呢?这就涉及一个最基本的问题:资源竞争。慢查询和慢请求一个道理,长时间占用连接不释放、连接数是有限的,其他后到的请求要排队。


这个问题在生产环境相对好些,因为生产环境一般都会用物理机,而且数据盘至少是SSD的。测试环境资源差很多,所以问题会更明显。


3>负载200多是什么概念?


系统平均负载(load averages)是对当前CPU工作量的度量,被定义为特定时间间隔内运行队列中的平均线程数。可以通过top, htop, uptime这些命令找到它们.关于负载的含义,网上最广泛的示例,是通过桥梁的通过率来解释的。讲的真心好,所以直接「借鉴」过来,需要看原文的直接从参考引用处自行穿越。注意这里的比喻是基于单核CPU的。


系统负荷为0,意味着大桥上一辆车也没有

系统负荷为0.5,意味着大桥一半的路段有车

系统负荷为1.0,意味着大桥的所有路段都有车,但任然可以顺次通行

系统负荷为1.7,除了桥满之外,在桥的入口处还有70%的车辆在等待


系统负荷为200,除了桥满之外,在桥的入口处还有19900%的车辆在等待!不卡死才怪!

 

线


sql问题影响巨大,所以我们针对所有的数据表进行了梳理,排查隐患。

 


还需要梳理所有可能引起稳定性隐患的问题。这里就要引出标题《容易引起雪崩的两个处理》的第二个处理了:递归。


递归如果深度控制不好,会产生栈溢出,也就是StackOverflowError。溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。怎么改呢?要解决这个问题之前刷的leetcode技能就排上用场了。把递归算法转化为非递归算法有如下三种基本方法


1、对于尾递归和单向递归的算法,可以用循环结构的算法替代


2、自己用堆栈模拟运行时栈,分析只保存必须保存的信息(因而可小幅提高时间效率),从而用非递归算法替代递归算法。


3、利用堆栈保存参数,由于堆栈的后进先出特性吻合递归算法的执行过程,因而可以用非递归算法替代递

 

后记


89年有个电影版的《红楼梦》,演员阵容豪华让人咋舌。赵丽蓉演的刘姥姥、刘晓庆演的王熙凤、傅艺伟演的薛宝钗……。很小就觉得经典电视剧版的《红楼梦》里薛宝钗优雅端庄,颇有大家闺秀之风。看到了电影版《红楼梦》,特别是有个名场面:宝玉管宝姐姐要她随身挂在脖子上的金锁来看:电视剧版的宝姐姐金锁是挂在贴身内层的,当时宝姐姐是这样的:宝姐姐脸微红,转过身去解下金锁,又缓缓转过来身来,微微笑着给了宝玉。电影版的宝姐姐也是金锁是挂在贴身内层的,宝姐姐听宝玉问他要,她不假思索、干脆利落的解下来给了宝玉。我看到这里,心里的表情是这样的:


1112728-20211002101641892-285607446.png


这是哪里来的英姿飒爽的女侠走错了片场?


而在实际工作,我也经常会遇到类似的反差。咱们的每个软件设计和代码,周围的人,后来的人内心都自有评价。愿他们看到的是最好的我们。


相关文章
|
13天前
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
阿里云与企业共筑容器供应链安全
171328 12
|
16天前
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
随着云计算和DevOps的兴起,容器技术和自动化在软件开发中扮演着愈发重要的角色,但也带来了新的安全挑战。阿里云针对这些挑战,组织了一场关于云上安全的深度访谈,邀请了内部专家穆寰、匡大虎和黄竹刚,深入探讨了容器安全与软件供应链安全的关系,分析了当前的安全隐患及应对策略,并介绍了阿里云提供的安全解决方案,包括容器镜像服务ACR、容器服务ACK、网格服务ASM等,旨在帮助企业构建涵盖整个软件开发生命周期的安全防护体系。通过加强基础设施安全性、技术创新以及倡导协同安全理念,阿里云致力于与客户共同建设更加安全可靠的软件供应链环境。
150295 32
|
24天前
|
弹性计算 人工智能 安全
对话 | ECS如何构筑企业上云的第一道安全防线
随着中小企业加速上云,数据泄露、网络攻击等安全威胁日益严重。阿里云推出深度访谈栏目,汇聚产品技术专家,探讨云上安全问题及应对策略。首期节目聚焦ECS安全性,提出三道防线:数据安全、网络安全和身份认证与权限管理,确保用户在云端的数据主权和业务稳定。此外,阿里云还推出了“ECS 99套餐”,以高性价比提供全面的安全保障,帮助中小企业安全上云。
201959 14
对话 | ECS如何构筑企业上云的第一道安全防线
|
6天前
|
存储 人工智能 安全
对话|无影如何助力企业构建办公安全防护体系
阿里云无影助力企业构建办公安全防护体系
1251 8
|
2天前
|
机器学习/深度学习 自然语言处理 PyTorch
深入剖析Transformer架构中的多头注意力机制
多头注意力机制(Multi-Head Attention)是Transformer模型中的核心组件,通过并行运行多个独立的注意力机制,捕捉输入序列中不同子空间的语义关联。每个“头”独立处理Query、Key和Value矩阵,经过缩放点积注意力运算后,所有头的输出被拼接并通过线性层融合,最终生成更全面的表示。多头注意力不仅增强了模型对复杂依赖关系的理解,还在自然语言处理任务如机器翻译和阅读理解中表现出色。通过多头自注意力机制,模型在同一序列内部进行多角度的注意力计算,进一步提升了表达能力和泛化性能。
|
7天前
|
人工智能 自然语言处理 程序员
通义灵码2.0全新升级,AI程序员全面开放使用
通义灵码2.0来了,成为全球首个同时上线JetBrains和VSCode的AI 程序员产品!立即下载更新最新插件使用。
1275 23
|
8天前
|
机器学习/深度学习 自然语言处理 搜索推荐
自注意力机制全解析:从原理到计算细节,一文尽览!
自注意力机制(Self-Attention)最早可追溯至20世纪70年代的神经网络研究,但直到2017年Google Brain团队提出Transformer架构后才广泛应用于深度学习。它通过计算序列内部元素间的相关性,捕捉复杂依赖关系,并支持并行化训练,显著提升了处理长文本和序列数据的能力。相比传统的RNN、LSTM和GRU,自注意力机制在自然语言处理(NLP)、计算机视觉、语音识别及推荐系统等领域展现出卓越性能。其核心步骤包括生成查询(Q)、键(K)和值(V)向量,计算缩放点积注意力得分,应用Softmax归一化,以及加权求和生成输出。自注意力机制提高了模型的表达能力,带来了更精准的服务。
|
6天前
|
消息中间件 人工智能 运维
1月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
519 22
1月更文特别场——寻找用云高手,分享云&AI实践
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
|
12天前
|
人工智能 自然语言处理 API
阿里云百炼xWaytoAGI共学课DAY1 - 必须了解的企业级AI应用开发知识点
本课程旨在介绍阿里云百炼大模型平台的核心功能和应用场景,帮助开发者和技术小白快速上手,体验AI的强大能力,并探索企业级AI应用开发的可能性。