容易引起雪崩的两个处理

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

背景


先介绍标题《容易引起雪崩的两个处理》的第一个处理:慢查询。上周在测试环境遇到一个慢查询问题,虽然是测试环境,但是现象还是很让人担忧的:“在大量执行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


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


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


相关文章
|
1天前
|
人工智能 自然语言处理 Shell
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
仅用3分钟,百炼调用满血版Deepseek-r1 API,享受百万免费Token。阿里云提供零门槛、快速部署的解决方案,支持云控制台和Cloud Shell两种方式,操作简便。Deepseek-r1满血版在推理能力上表现出色,尤其擅长数学、代码和自然语言处理任务,使用过程中无卡顿,体验丝滑。结合Chatbox工具,用户可轻松掌控模型,提升工作效率。阿里云大模型服务平台百炼不仅速度快,还确保数据安全,值得信赖。
59161 16
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
|
3天前
|
人工智能 API 网络安全
用DeepSeek,就在阿里云!四种方式助您快速使用 DeepSeek-R1 满血版!更有内部实战指导!
DeepSeek自发布以来,凭借卓越的技术性能和开源策略迅速吸引了全球关注。DeepSeek-R1作为系列中的佼佼者,在多个基准测试中超越现有顶尖模型,展现了强大的推理能力。然而,由于其爆火及受到黑客攻击,官网使用受限,影响用户体验。为解决这一问题,阿里云提供了多种解决方案。
14914 32
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。
|
11天前
|
人工智能 搜索推荐 Docker
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
DeepSeek R1 + LobeChat + Ollama:快速本地部署模型,创建个性化 AI 助手
3154 115
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
|
3天前
|
并行计算 PyTorch 算法框架/工具
本地部署DeepSeek模型
要在本地部署DeepSeek模型,需准备Linux(推荐Ubuntu 20.04+)或兼容的Windows/macOS环境,配备NVIDIA GPU(建议RTX 3060+)。安装Python 3.8+、PyTorch/TensorFlow等依赖,并通过官方渠道下载模型文件。配置模型后,编写推理脚本进行测试,可选使用FastAPI服务化部署或Docker容器化。注意资源监控和许可协议。
856 5
|
6天前
|
人工智能 自然语言处理 API
DeepSeek全尺寸模型上线阿里云百炼!
阿里云百炼平台近日上线了DeepSeek-V3、DeepSeek-R1及其蒸馏版本等六款全尺寸AI模型,参数量达671B,提供高达100万免费tokens。这些模型在数学、代码、自然语言推理等任务上表现出色,支持灵活调用和经济高效的解决方案,助力开发者和企业加速创新与数字化转型。示例代码展示了如何通过API使用DeepSeek-R1模型进行推理,用户可轻松获取思考过程和最终答案。
|
10天前
|
API 开发工具 Python
阿里云PAI部署DeepSeek及调用
本文介绍如何在阿里云PAI EAS上部署DeepSeek模型,涵盖7B模型的部署、SDK和API调用。7B模型只需一张A10显卡,部署时间约10分钟。文章详细展示了模型信息查看、在线调试及通过OpenAI SDK和Python Requests进行调用的步骤,并附有测试结果和参考文档链接。
1729 9
阿里云PAI部署DeepSeek及调用
|
9天前
|
人工智能 自然语言处理 JavaScript
宜搭上新,DeepSeek 插件来了!
钉钉宜搭近日上线了DeepSeek插件,无需编写复杂代码,普通用户也能轻松调用强大的AI大模型能力。安装后,平台新增「AI生成」组件,支持创意内容生成、JS代码编译、工作汇报等场景,大幅提升工作效率。快来体验这一高效智能的办公方式吧!
1558 8
|
10天前
|
缓存 自然语言处理 安全
快速调用 Deepseek API!【超详细教程】
Deepseek 强大的功能,在本教程中,将指导您如何获取 DeepSeek API 密钥,并演示如何使用该密钥调用 DeepSeek API 以进行调试。
|
7天前
|
人工智能 数据可视化 Linux
【保姆级教程】3步搞定DeepSeek本地部署
DeepSeek在2025年春节期间突然爆火出圈。在目前DeepSeek的网站中,极不稳定,总是服务器繁忙,这时候本地部署就可以有效规避问题。本文以最浅显易懂的方式带读者一起完成DeepSeek-r1大模型的本地部署。