SQL语句执行超时引发网站首页访问故障问题
作者:博客园团队 发布时间:2024-01-29 01:33:27
非常抱歉,今天早上 6:37~8:15 期间,由于获取网站首页博文列表的 SQL 语句出现突发的查询超时问题,造成访问网站首页时出现 500 错误,由此给您带来麻烦,请您谅解。
故障的情况是这样的。
故障期间日志中记录了大量下面的错误。
2020-02-03 06:37:24.635 [Error] An unhandled exception has occurred while executing the request./Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareSystem.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception (258): Unknown error 258 at System.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__126_0(Task`1 result)
数据库服务器(阿里云 RDS SQL Server 2016 实例)的 CPU 消耗突增。
数据库服务器的 IOPS 暴增。
通过阿里云 RDS 控制台的 CloudDBA 可以查看到故障期间获取首页博文的 SQL 语句被执行了3万多次,执行这么多次是由于查询超时,无法建立缓存,每次请求都要访问数据库。
发现故障后,我们通过阿里云 RDS 的主备切换恢复了正常。
经过对故障的排查分析,锁定的最大嫌疑对象是 SQL Server 参数嗅探(详见园子里的博文 什么是 SQL Server 参数嗅探)。
对于这种因为重用他人生成的执行计划而导致的水土不服现象,SQL Server 有一个专有名词,叫“参数嗅探 parameter sniffing”。
而且我们找到了引发 SQL Server 参数嗅探问题的条件。
在我们的 open api 中提供了获取首页博文列表的 web api ,但没有限制可以获取的最大博文数,也就是下面的 ItemCount 参数(除了 open api ,其他地方调用时 ItemCount 值都是 20 )。
SELECT TOP (@ItemCount)
假如有人调用 open api 时给 ItemCount 传了一个很大的值,比如 20000 ,虽然调用的是同样的 SQL 语句,但由于 ItemCount 的值不同, SQL Server 可能会生成相差很大的执行计划,对于 ItemCount 20000 性能比较好的执行计划,对于 ItemCount 20 可能性能极差。如果查询 ItemCount 20000 时生成的执行计划被缓存下来,查询 ItemCount 20 时继续使用这个执行计划,就会出现本来好好的 SQL 查询突然变得性能极差。我们今天遇到的故障很可能就是这个原因,而且故障时就一个 SQL 语句出现问题(正好就这个 SQL 查询缓存了水土不服的执行计划),其他都正常,也验证了这个猜测。
通过这次故障,我们吸取的教训是一定要在代码中对 ItemCount 与 PageSize 的最大值进行限制,它不仅仅是带来不必要的低性能查询,而且可能会因为 SQL Server 参数嗅探问题拖垮整个数据库。
总结
以上所述是小编给大家介绍的SQL语句执行超时引发网站首页访问故障问题,希望对大家有所帮助!
来源:https://www.cnblogs.com/cmt/p/12255415.html


猜你喜欢
- 需要画框取消注释rectangleimport cv2import os,sys,shutilimport numpy as np# Ope
- 前言:MySQL 的二进制日志 binlog 可以说是 MySQL 最重要的日志,它记录了所有的 DDL 和 DML 语句(除了数据查询语句
- 前言由于今年暑假在学习一些自然语言处理的东西,发现网上对k-means的讲解不是很清楚,网上大多数代码只是将聚类结果以图片的形式呈现,而不是
- Git是什么?svn是什么?Git svn 统称版本控制器在开发中经常是两个或多个人同时开发一个控制器为了不产生代码冲突法发明了版本控制器最
- 正在看的ORACLE教程是:Oracle数据库的备份与恢复。---- 当我们使用一个数据库时,总希望数据库的内容是可靠的、正确的,但由于计算
- 现在需要将course分组,然后选择出每一组里面的最大值和最小值,并保留下来实现下面数据结果:直接使用groupby函数,不能直接达到此效果
- Python是跨平台的,免费开源的一门计算机编程语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不
- 本文实例讲述了Python实现网络端口转发和重定向的方法。分享给大家供大家参考,具体如下:【任务】需要将某个网络端口转发到另一个主机(for
- 本文实例讲述了python中黄金分割法实现方法。分享给大家供大家参考。具体实现方法如下:''' a,b = brac
- 安装MySQL5.1过程中,我把以前MySQL5.0的GUI工具和服务器全部删掉,安装目录全部删掉,数据文件目录名字改掉,注册表用完美卸载清
- 我写的这个程序import tensorflow as tfsess=tf.InteractiveSession()x=tf.Variabl
- python版本要求在3.3.x,需要mysql connector for python第三方库支持不适用所有的zencart导入到mag
- MGR全称MySQL Group Replication(Mysql组复制),是MySQL官方于2016年12月推出的一个全新的高可用与高扩
- 对一个列表list而言,进行排序是很简单的。正序排序(从小到大)用list.sort() 倒序排序(从大到小)用list.sort
- WordPress可以改造成twitter一样的微博网站,但是有一个坏处就是你要么用来做博客要么用来做微博,功能难兼得。相信大家在访问一些知
- tkinter介绍tkinter是python自带的GUI库,是对图形库TK的封装tkinter是一个跨平台的GUI库,开发的程序可以在wi
- 今天有碰到这种情况,数据库中有张表没办法通过migration来更改, migrate时报 django.db.utils.Operatio
- 目录项目引入flask-sqlalchemyORM简介及模型定义表关系类型及编码实现一对多关系(多对一关系)一对一关系多对多关系数据库基本操
- 新建一个Spring Initializr项目2.把pom.xml文件中的oracle依赖换成自己的oracle版本依赖:原来的:现在的:
- 用ASP生成XBM数字图片(可用来生成验证码)XBM图片是一个纯文本的文件,可以用ASP来自动生成。可以用它来使用网站登陆的验证码;我们用记