今天又和Redis超時杠上了

来源:https://www.cnblogs.com/huaweiyun/archive/2023/05/30/17442648.html
-Advertisement-
Play Games

摘要:究竟是不是cpu占比高的問題導致redis超時的呢? 本文分享自華為雲社區《我又和redis超時杠上了》,作者:藍胖子的編程夢 。 背景 經過上次redis超時排查,並聯繫雲服務商解決之後,redis超時的現象好了一陣子,但是最近又有超時現象報出,但與上次不同的是,這次超時的現象發生在業務高峰 ...


摘要:究竟是不是cpu占比高的問題導致redis超時的呢?

本文分享自華為雲社區《我又和redis超時杠上了》,作者:藍胖子的編程夢 。

背景

經過上次redis超時排查,並聯繫雲服務商解決之後,redis超時的現象好了一陣子,但是最近又有超時現象報出,但與上次不同的是,這次超時的現象發生在業務高峰期,在簡單看過伺服器的各項指標以後,發現只有cpu的使用率在高峰期略高,我們是8核cpu,高峰期能達到90%的使用率,其餘指標都相對正常。

但究竟是不是cpu占比高的問題導致redis超時的呢?還有待商榷,因為cpu調度程式慢本質上也是個概率性事件。

解決思路

略帶僥幸的聯繫雲服務商

有了上次的經驗過後,我也是聯繫了雲服務商那邊也排查下是否還存在上次超時的原因,但其實還是有直覺,這次的原因和上次超時是不一樣的(備註:上次超時是由於雲服務商那邊對集群的流量隔離做的不夠好,導致其他企業機器流量影響到了我們的機器,且發生在業務低峰期),這次發生在業務高峰期。

果然,雲服務商得出的結論也是之前出問題的機器以及遷移走了,並且他們也和我同時展開排查。

抓包分析

在ecs伺服器上進行抓包,當出現超時時,關閉tcpdump進行分析。

tcpdump 漏包了?

在dump下抓包文件後,經過wireshark分析,並沒有發現丟包信息,想著應該是tcpdump漏包了。

tcpdump 出現漏包的情況

[webserver@hw-sg1-test-0001 ~]$ sudo tcpdump -i eth0 tcp  port 6379   -w p.cap -W 2 -G 3600 -C 2000
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

可以看到預設的抓包大小262144 bytes,在業務高峰期如果每個包最大長度都在這個值,很可能就導致緩衝區滿了,而之前一次抓包分析為什麼就沒有這個問題呢,因為那是在業務低峰期,tcpdump丟包概率比較小。

sudo tcpdump -i eth0 tcp  port 6379   -w p5.cap -W 2 -G 3600 -C 2000
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C147940 packets captured
468554 packets received by filter
318544 packets dropped by kernel

packets dropped by kernel 說明tcpdump丟棄了某些包,因為tcpdump在處理包時,是先將包放到一個緩衝區進行分析,當緩衝區滿的時候會直接進行丟棄,這樣導致我在用wireshark分析包的時候,就會出現有些包找不到的情況。

在縮小抓取的包大小和去掉功能變數名稱解析後,不再漏包了。

[webserver@hw-sg1-backend-0003 ~]$ sudo tcpdump -i eth0 tcp  port 6379   -w p5.cap -W 2 -G 3600 -C 2000 -n -s 1520
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 1520 bytes
^C21334 packets captured
21454 packets received by filter
0 packets dropped by kernel

抓包分析超時情況

redis客戶端超時時間設置的200ms,可以看到2894687號包是redis伺服器發送給客戶端的包,然後2897927是客戶端發送給redis服務端的rst,正常情況客戶端收到redis服務端的psh信號的包應該會回覆一個ack的,但是客戶端卻在200ms以後回覆了一個rst,說明瞭什麼問題?

我們的客戶端是golang寫的,可以想到的情況是,客戶端程式在讀取包過程協程會有切換上下文操作,當客戶端發現有可讀包時並切回go協程的時候,會首先判斷當前讀操作是否超時,如果超時,則直接調用close方法關閉連接了。

那麼close方法是發送rst信號嗎,正常不應該是fin信號?

非也,close方法如果關閉的時候,連接讀緩衝區的數據還有未被應用程式讀取的話,那麼此時close方法的調用會發送rst信號。

可見,問題的確是出在客戶端了,並且看上去像是客戶端來不及讀取服務端的消息。看到這裡,其實我心裡已經百分之八九十確定是cpu的使用率達到瓶頸了。

雲服務商來信了

在分析到上一個步驟的時候,雲服務商告訴我,他們知道原因了,是ecs服務的磁碟吞吐量達到瞬時上線,說故障點是和超時的故障點是吻合的。

我知道這個後,第一時間的疑惑是,為啥磁碟吞吐會影響到網路傳輸,雲服務商給的解釋是磁碟吞吐達到瞬時上線後,對服務整體是有影響的,我又看了下ecs的監控圖標,發現監控圖標顯示的磁碟吞吐遠遠沒有雲服務商提到的那麼多。

儘管雲服務商堅持是磁碟iops達到了上限,但還是不能說服我 磁碟的iops瞬時上限會那麼大影響到網路傳輸。

於是有了接下來第二天的抓包分析。

第二天的抓包分析

基於對昨天的分析,我懷疑到了cpu頭上,如果cpu切換進程緩慢,協程調度緩慢,那麼的確是有可能發生超時的。由於目前的監控缺少對協程調度延遲的監控,所以決定加上這一指標。

golang1.17後 runtime包提供了協程調度延遲的直方圖統計信息,而go prometheus的client其實以已經支持將這個信息轉換為prometheus內置的指標類型,metric名稱是go_sched_latencies_seconds,而我們之前試用prometheus的client包註冊的collector 是相容到go1.16以及之前的版本,所以沒有當改用到最新的collector後,client如期返回了go_sched_latencies_seconds 直方圖信息。

將這個信息展示在grafana里。於是有了第二天協程調度延遲的信息。p999在業務高峰期間達到了100ms,也是與超時時間吻合的。協程調度延遲指的是協程變為可運行狀態後到被真正執行這段時間等待被調度的時間,這裡都高達100ms了,如果加上cpu線程,進程切換上下文時間,很有可能是超過了redis client端設置的200ms超時上限。

為了排除掉是磁碟原因引起的超時。

我在7點又進行了抓包分析,發現和昨天抓到包的情況是一致的,客戶端最後來不及回應服務端的包最後發送rst了。

然後看了下此時機器磁碟吞吐情況,發現圖中箭頭處也處於高峰期,但是磁碟吞吐量並未上去,而升上去的點正是抓包帶來的,懷疑是抓包寫入文件導致磁碟吞吐量漲上去了。於是又問了服務商要磁碟達到瞬時峰值的日誌。

發現報瞬時峰值的日誌也和抓包時間吻合,所以已經確認磁碟吞吐達到上限是抓包導致的,網路超時是和磁碟吞吐無關的,反而應該是cpu使用率達到上限了,雖然沒有100%,也是8核,但畢竟cpu某個核達到上限是概率性事件,而對於redis這種時延敏感性應用,一但發生,那麼超時是有可能的。

完美解決

於是,在業務低峰期將我們三台ecs服務進行了cpu配置提升,提升後效果很明顯,超時在高峰期不見了,協程調度延遲也大大減少。

總結

1,對於抓包分析,還是疏忽了,加上包限制大小,能很好的防止tcpdump抓包時丟包的情況。
2,對於任何第三方的說法要有自己的判斷力,像這次如果中途去將磁碟擴容顯然是不能解決問題的。
3,性能問題分析真是像一個偵探破案的過程,不斷列出證據,不斷排除掉干擾因素,不斷論證的過程也是性能分析的魅力所在吧,就像這次看到cpu的確比較高了,但是究竟是不是客戶端問題呢?我又抓包論證了的確是客戶端問題,那究竟是不是協程調度問題呢?我又列出協程調度延遲。

 

點擊關註,第一時間瞭解華為雲新鮮技術~


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

-Advertisement-
Play Games
更多相關文章
  • 再在越來越多的地方不但需要昵稱,同時也可以設置昵稱下麵的個人簽名,官方叫“個性簽名”。百度百科的解釋是:是指你在某個論壇(BBS)註冊之後, 就可以設置自己的簽名了,即在你的每個帖子底部顯示的文字, 有些象便簽抬頭。 由於每個網友所寫的文字都不同,有格言、有諺語、有調侃語句等等,也有用圖片、動畫作為 ...
  • 在之前就弄到過個性網名和論壇簽名的數據,比如有《8萬多個網名大全QQ網名ACCESS資料庫》、《個性網名大全網路名稱大全ACCESS資料庫》《2萬多條QQ簽名論壇簽名大全ACCESS資料庫》、《24萬QQ傷感簽名論壇簽名ACCESS資料庫》、《近2萬簽名的句子網路簽名ACCESS資料庫》、《上萬條個 ...
  • 今天這一份方劑資料庫是最全也是最好的方劑資料庫,不但欄位內容多,而且記錄數也是最多的,欄位包含:名稱、組成、出處、功效、主治、加減、用法用量、製備方法、臨床應用、各家論述、用藥禁忌、附註等。 HTML內容欄位是排版好了的全部內容,具體可以從以下鏈接下載樣本: 鏈接: https://pan.baid ...
  • 雖然收集了一些古詩詞相關的資料庫,但好像沒有什麼註釋點評類的內容,而今天這份《1萬7千多首古詩詞範賞評詩詞ACCESS資料庫》包含了17704首本地賞評詩詞、12個朝代分門別類、1680位本地詩人簡介、超過50個詩詞分類欣賞。 樣本請從以下鏈接下載:鏈接: https://pan.baidu.com ...
  • 或許你已經看過很多博主寫的文章,要不就是抄襲,要不就是給你一個下麵的語句,隨機是隨機了,但是多來兩頁,你會發現前面出現的數據在第三頁甚至第二頁就出現了 select * from table order by rand() 這是因為rand()機制的問題,他每次都會打亂數據給你,然後你去取的時候0- ...
  • ![file](https://img2023.cnblogs.com/other/2685289/202305/2685289-20230530115137903-2141604303.png) > 文章摘要:用一杯星巴克的錢,自己動手2小時的時間,就可以擁有自己訓練的開源大模型,並可以根據不同的 ...
  • 今天這個《1萬7千道法律職業考試題ACCESS資料庫》集收了海量的法考題庫試題,是從法律職業考試軟體取提出來的,讓你備考通關更加高效。今天這個《1萬7千道法律職業考試題ACCESS資料庫》集收了海量的法考題庫試題,是從法律職業考試軟體取提出來的,讓你備考通關更加高效。 包含分類:1.法理學(607) ...
  • 雖然之前弄到過《1萬多公務員考試基礎知識題庫ACCESS資料庫》,但完全沒有今天這份資料庫那麼美。今天這份數據是從一款考試學習類的軟體中破解提取出來的,據數非常不錯,不但有大小分類,而且題型包含:單項選擇題(25575條)、簡答題(942條)。 題庫中有些包含圖片問答,或者選項中有含圖片,如: 本數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...