100ms的SQL把伺服器搞崩潰了

来源:https://www.cnblogs.com/zoe-zyq/archive/2022/04/29/16207287.html
-Advertisement-
Play Games

前言 一個項目上線了兩個月,除了一些反饋的優化和小Bug之外,項目一切順利;前期是屬於推廣階段,可能使用人員沒那麼多,當然對於項目部署肯定提前想到併發量了,所以早就把集群安排上,而且還在測試環境搞了一下壓測,絕對是沒得問題的;但是,就在兩個月後的一天,系統突然跑的比烏龜還慢,投訴開始就陸續反饋過來了 ...


前言

一個項目上線了兩個月,除了一些反饋的優化和小Bug之外,項目一切順利;前期是屬於推廣階段,可能使用人員沒那麼多,當然對於項目部署肯定提前想到併發量了,所以早就把集群安排上,而且還在測試環境搞了一下壓測,絕對是沒得問題的;但是,就在兩個月後的一天,系統突然跑的比烏龜還慢,投訴開始就陸續反饋過來了。

經過排查,原來是頻繁執行一條耗時100ms的SQL導致,100ms感覺不長,但就是把系統搞崩了,具體細節如下。

正文

1. 項目概況

項目採用ABP進行開發,集成統一的認證中心(IDS4),部分數據對接第三方系統,拆分後的這個項目架構相對簡單。

考慮併發量不高,就算是高峰期也不會超過1000,於是就搞了個單台的資料庫伺服器(MySQL),測試環境中經過壓測,完全能抗住。

上線時,由於線上資源的關係,DB伺服器的配置沒有按測試環境的標準來分配,相關人員想著後續看情況進行補配。上線推的比較緊,簡單評估了配置風險,初步判斷沒啥大問題,於是就推上線了。

相關技術棧:ABP、IdentityServer4、Autofac、AutoMapper、Quartz.NET、EF Core、Redis、MySQL等,這都不重要,重要的是100ms的SQL把系統搞崩了。

由於系統相對不大,並沒有把分散式日誌、調度監控,性能監控集成上去。

2. 問題排查

上線期間,前期處於使用推廣階段,一切正常。兩個月後的一天,系統處於使用高峰時段,突然陸續收到反饋:系統有點卡!!!於是趕緊進行排查。

由於系統已經是集群部署的,慢這個問題首先懷疑是資料庫伺服器,於是讓DBA的同事排查了一下,沒有鎖,只是有大量事務等待提交(waiting for handler commit),通過如下命令可查的:

# 查看正在執行的腳本
select *  from information_schema.PROCESSLIST t where t.COMMAND != 'Sleep'  order by time desc;

看到都是插入審計日誌記錄導致,一看日誌記錄頻率,差不多一秒500條記錄。DBA同事說可能是記錄插入頻繁導致,此時CPU已經爆到100%了,為了快速解決問題,於是就趕緊關掉了一些不必要的日誌記錄。

這麼一改,稍微降了一點,沒有事務提交的記錄,系統勉強可以撐著用,但是CPU還是在85%~97%波動;

看到這種情況,當然還是不放心,繼續排查。 中間有對伺服器的配置產生過懷疑,但非常肯定的是這不是主要原因,於是和DBA的同事繼續排查。

系統雖然可以正常使用,但時不時的也看看監控屏,CPU一直處於高水位狀態,還是有點慌的,因為一有問題,信息和電話都要爆。

突然DBA同事發現有一個單表查詢的SQL執行比較頻繁,於是單獨拿出來試了一下,查詢時間150ms左右,這個表的數據量不大,8萬左右,但沒有加任何索引,因為想著數據量不大,查詢時長還可接受,所以當時就沒有加相關索引。

定位到這條SQL後,想到的第一步就是增加索引,在測試環境上試了一把,執行效率直接飛速提高到1ms;效果如下:

所以和DBA同事達成一致意見,在生成環境上增加複合索引(創建索引一定要註意欄位順序),在中午時候,系統使用頻率不太高,於是就在生成上快速加了索引,我去,CPU一下降到了20%以內,意不意外;就算在使用高峰期,也沒超過20%,通過zabbix工具監控看到CPU的效果:

問題算是解決了,總算鬆了一口氣。

這裡有個問題: CPU都爆了為什麼沒有報警提醒,這塊DBA同事正在排查相關配置。這裡發現CPU爆了,還是無意的遠程到伺服器,發現很卡,一看CPU才知道爆了。

系統雖小,問題不大,但其實暴露的問題還是挺多。

總結

這次線上小事故暫時分享到這,因為項目不大,所以沒有做那麼多監控,但以下建議,小伙伴可以參考一下:

  • 頻繁執行的SQL語句,一定要保證其執行效率,不要小看ms級的優化,如果併發量上來也會是災難;
  • 對應伺服器要做好監控,指定預警範圍提醒,避免打個措手不及
  • 儘量避免頻繁的自動刷新;引入實時通信的方式,會減少不必要的訪問壓力。
  • 關於系統頻繁記錄的審計日誌,儘量不要和業務資料庫存放在一起;大量的日誌頻繁操作資料庫是很占用IO的。
  • 對於拆分的項目,再加上集群部署,分散式日誌管理必須安排上,不然分析日誌排查問題是個費時費腦的事

關註“Code綜藝圈”,和我一起學習吧。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在這次的Java 18中,新增了一個@snipppet標簽,主要用於JavaDoc中需要放示例代碼的場景。其實在Java 18之前,已經有一個@code標簽,可以用於在JavaDoc中編寫小段的代碼內容,比如在之前介紹Simple Web Server視頻中,提到的這段樣例代碼,就是用@code標簽 ...
  • 最近正在學習回溯法,遇到的第一個問題就是n皇後問題,問題如下: 要求在一個n×n的棋盤上放置n個皇後,使得任意兩個皇後不在同一行或同一列或同一斜線上。 直接上代碼: #include<iostream> #include<math.h> using namespace std; void NQuee ...
  • POM :文件名稱是pom.xml ,  pom翻譯過來叫做項目對象模型,maven把一個項目當做一個模型使用 ...
  • 背景介紹 R和Python作為兩個開源、且容易上手的數據分析和繪圖工具,在科研中應用的比較廣泛。 在接下來的日子,我們圍繞Python進行繪圖和數據分析話題,寫一系列推文,事實上是我自己的一些學習筆記分享出來,為了我 方便查閱,也方便大家翻閱。 軟體介紹 [軟體名稱]:Anaconda | Spyd ...
  • 我們知道,頻繁操作資料庫會降低伺服器的系統性能,因此通常需要將頻繁訪問、更新的數據存入到緩存。Halo 項目也引入了緩存機制,且設置了多種實現方式,如自定義緩存、Redis、LevelDB 等,下麵我們分析一下緩存機制的實現過程。 ...
  • 適用 2022.1 【更新時間 2022-4-29】 引言 由於IDEA在2021.2.2以後我們不能再使用重置大法白嫖了。 為了打擊破解,Jetbrains煞費苦心,這次採用了JB賬號登陸,通過授權認證獲取免費試用資格(所以之前的無限重置的插件在今後的新版本中,將無法使用),以下整理了一個免JB註 ...
  • 前幾篇都是手動錄入或隨機函數產生的數據。實際有許多類型的文件,以及許多方法,用它們從文件中提取數據來圖形化。 比如之前python基礎(12)介紹打開文件的方式,可直接讀取文件中的數據,擴大了我們的數據來源。下麵詳細介紹從文件中載入數據。 一、使用內置的 csv 模塊載入CSV文件 CSV文件是一種 ...
  • 我前面幾篇隨筆介紹了關於幾篇關於SqlSugar的基礎封裝,已經可以直接應用在Winform項目開發上,並且基礎介面也通過了單元測試,同時測試通過了一些Winform功能頁面;本篇隨筆繼續深化應用開發,著手在在.net6框架的Web API上開發應用,也就是基於.net core的Web API應用... ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...