国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一則 TCP 緩存超負(fù)荷導(dǎo)致的 MySQL 連接中斷的案例分析

這篇具有很好參考價(jià)值的文章主要介紹了一則 TCP 緩存超負(fù)荷導(dǎo)致的 MySQL 連接中斷的案例分析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

除了 MySQL 本身之外,如何分析定位其他因素的可能性?

作者:龔唐杰,愛(ài)可生 DBA 團(tuán)隊(duì)成員,主要負(fù)責(zé) MySQL 技術(shù)支持,擅長(zhǎng) MySQL、PG、國(guó)產(chǎn)數(shù)據(jù)庫(kù)。

愛(ài)可生開(kāi)源社區(qū)出品,原創(chuàng)內(nèi)容未經(jīng)授權(quán)不得隨意使用,轉(zhuǎn)載請(qǐng)聯(lián)系小編并注明來(lái)源。

本文約 1200 字,預(yù)計(jì)閱讀需要 3 分鐘。

背景

在執(zhí)行跑批任務(wù)的過(guò)程中,應(yīng)用程序遇到了一個(gè)問(wèn)題:部分任務(wù)的數(shù)據(jù)庫(kù)連接會(huì)突然丟失,導(dǎo)致任務(wù)無(wú)法完成。從數(shù)據(jù)庫(kù)的錯(cuò)誤日志中,發(fā)現(xiàn)了 Aborted connection 的信息,這說(shuō)明客戶端和服務(wù)器之間的通信被異常中斷了。

分析

為了找出問(wèn)題的原因,我們首先根據(jù)經(jīng)驗(yàn),分析了可能導(dǎo)致連接被 Aborted 的幾種常見(jiàn)情況:

  1. 客戶端沒(méi)有正確地關(guān)閉連接,沒(méi)有調(diào)用 mysql_close() 函數(shù)。
  2. 客戶端空閑時(shí)間超過(guò)了 wait_timeoutinteractive_timeout 參數(shù)的秒數(shù),服務(wù)器自動(dòng)斷開(kāi)了連接。
  3. 客戶端發(fā)送或接收的數(shù)據(jù)包大小超過(guò)了 max_allowed_packet 參數(shù)的值,導(dǎo)致連接中斷。
  4. 客戶端試圖訪問(wèn)數(shù)據(jù)庫(kù),但沒(méi)有權(quán)限,或者使用了錯(cuò)誤的密碼,或者連接包不包含正確的信息。

然而,經(jīng)過(guò)排查,發(fā)現(xiàn)以上情況都不適用于當(dāng)前的問(wèn)題。因?yàn)槿蝿?wù)在之前都是正常運(yùn)行的,而且程序也沒(méi)有變動(dòng),所以可以排除第一種情況。查看了 MySQL 的超時(shí)參數(shù) wait_timeoutinteractive_timeout ,發(fā)現(xiàn)它們都是 28800,也就是 8 個(gè)小時(shí),遠(yuǎn)遠(yuǎn)超過(guò)了任務(wù)執(zhí)行時(shí)間,所以可以排除第二種情況。也檢查了客戶端和服務(wù)器的 max_allowed_packet 參數(shù),發(fā)現(xiàn)它們都是 64M,也不太可能超過(guò)這個(gè)限制,所以可以排除第三種情況。我們也確認(rèn)了客戶端的數(shù)據(jù)庫(kù)訪問(wèn)權(quán)限,密碼,連接包等信息,都是正確的,所以可以排除第四種情況。

到此,我們初步感覺(jué) MySQL 層面應(yīng)該沒(méi)有問(wèn)題,問(wèn)題可能出在其他地方。

為了進(jìn)一步定位問(wèn)題,我們嘗試了修改服務(wù)器的一些相關(guān)內(nèi)核參數(shù),如下:

net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_time = 120
net.core.rmem_default = 2097152
net.core.wmem_default = 2097152
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_syn_backlog = 16384

這些參數(shù)主要是為了優(yōu)化網(wǎng)絡(luò)連接的性能和穩(wěn)定性,避免連接被意外關(guān)閉或超時(shí)。但是,修改后的結(jié)果并沒(méi)有改善,連接還是會(huì)異常中斷。

最后,我們嘗試了進(jìn)行抓包分析,通過(guò) Wireshark 工具,我們發(fā)現(xiàn)了一個(gè)異常的現(xiàn)象:服務(wù)器會(huì)給客戶端發(fā)送大量的 ACK 包。如下圖所示:

一則 TCP 緩存超負(fù)荷導(dǎo)致的 MySQL 連接中斷的案例分析,mysql,oceanbase,數(shù)據(jù)庫(kù)

這些 ACK 包是 TCP 協(xié)議中的確認(rèn)包,表示服務(wù)器已經(jīng)收到了客戶端的數(shù)據(jù)包,請(qǐng)求客戶端繼續(xù)發(fā)送數(shù)據(jù)。但是,為什么服務(wù)器會(huì)發(fā)送這么多的 ACK 包呢?我們猜測(cè)可能是網(wǎng)絡(luò)有異常,導(dǎo)致客戶端接收不到服務(wù)器返回的 ACK 包,所以服務(wù)器會(huì)反復(fù)發(fā)送 ACK 包,直到超時(shí)或收到客戶端的響應(yīng)。但是,經(jīng)過(guò)網(wǎng)絡(luò)人員的排查,未發(fā)現(xiàn)有明顯的問(wèn)題。

繼續(xù)分析抓包,我們又發(fā)現(xiàn)了另一個(gè)異常的現(xiàn)象:客戶端會(huì)給發(fā)送服務(wù)器一些窗口警告。如下圖所示:

一則 TCP 緩存超負(fù)荷導(dǎo)致的 MySQL 連接中斷的案例分析,mysql,oceanbase,數(shù)據(jù)庫(kù)

這些窗口警告是 TCP 協(xié)議中的流量控制機(jī)制,表示服務(wù)器或客戶端的接收窗口已經(jīng)滿了,不能再接收更多的數(shù)據(jù)。

[TCP Window Full] 是發(fā)送端向接收端發(fā)送的一種窗口警告,表示已經(jīng)到數(shù)據(jù)接收端的極限了

[TCP ZeroWindow] 是接收端向發(fā)送端發(fā)送的一種窗口警告,告訴發(fā)送者,接收端接收窗口已滿,暫時(shí)停止發(fā)送。

根據(jù)以上信息,我們推測(cè)出了問(wèn)題的原因:由于 MySQL 需要發(fā)送的數(shù)據(jù)太大,客戶端的 TCP 緩存已經(jīng)滿了,所以需要等待客戶端把 TCP 緩存里面的數(shù)據(jù)消化掉,才能繼續(xù)接收數(shù)據(jù)。但是,在這段時(shí)間內(nèi),MySQL 會(huì)一直向客戶端請(qǐng)求繼續(xù)發(fā)送數(shù)據(jù),如果客戶端在一定時(shí)間內(nèi)(默認(rèn)是 60 秒)沒(méi)有響應(yīng),MySQL 就會(huì)認(rèn)為發(fā)送數(shù)據(jù)超時(shí),中斷了連接。

為了驗(yàn)證推測(cè),查看 MySQL 的慢日志,發(fā)現(xiàn)了很多 Last_errno: 1161 的記錄。

這些記錄表示 MySQL 在發(fā)送數(shù)據(jù)時(shí)遇到了超時(shí)錯(cuò)誤,而且發(fā)現(xiàn)出現(xiàn)的次數(shù)和應(yīng)用程序失敗的任務(wù)數(shù)很接近。根據(jù) MySQL 官網(wǎng)的說(shuō)明,這個(gè)錯(cuò)誤的含義是:

Error number: 1161; Symbol: ER_NET_WRITE_INTERRUPTED; SQLSTATE: 08S01

Message: Got timeout writing communication packets

可知這個(gè)表示的意思是網(wǎng)絡(luò)寫(xiě)入中斷,而MySQL層面有個(gè)參數(shù)就是控制這個(gè)的,所以嘗試更改net_write_timeout參數(shù)為600,跑批任務(wù)正常運(yùn)行。

所以 MySQL 連接被異常中斷的原因在于客戶端獲取的數(shù)據(jù)庫(kù)太大,超過(guò)了客戶端 TCP 緩存,客戶端需要先處理緩存中的數(shù)據(jù),在這段時(shí)間內(nèi),MySQL 會(huì)一直向客戶端請(qǐng)求繼續(xù)發(fā)送數(shù)據(jù),但是客戶端 60 秒內(nèi)一直未能響應(yīng),導(dǎo)致 MySQL 發(fā)送數(shù)據(jù)超時(shí),中斷了連接。

結(jié)論

通過(guò)上述的分析和嘗試,我們得出了以下的結(jié)論:

  • 抓包信息中,有很多 ACK 信息是因?yàn)榭蛻舳说木彺鏉M了不能及時(shí)給服務(wù)端反饋,所以服務(wù)器會(huì)反復(fù)發(fā)送 ACK 信息,直到超過(guò) 60秒(net_write_timeout 默認(rèn)值是 60),導(dǎo)致 MySQL 把連接中斷了。
  • 慢日志中,有很多 Last_errno: 1161 的記錄,是因?yàn)樵?SQL 實(shí)際已經(jīng)在 MySQL 中執(zhí)行完畢了,但是在發(fā)送數(shù)據(jù)到客戶端時(shí),由于數(shù)據(jù)量太大超過(guò)了客戶端的 TCP 緩存,然后客戶端上的應(yīng)用在 60 秒內(nèi)未把緩存中的數(shù)據(jù)處理掉,導(dǎo)致 MySQL 往客戶端發(fā)送數(shù)據(jù)超時(shí)。
  • MySQL 層面調(diào)整 net_write_timeout 參數(shù)只能緩解這個(gè)現(xiàn)象,根因在于單個(gè) SQL 獲取的數(shù)據(jù)量太大,超過(guò)了客戶端的緩存大小,應(yīng)用程序不能短時(shí)間內(nèi)處理完緩存中的數(shù)據(jù),進(jìn)而導(dǎo)致后續(xù)的數(shù)據(jù)發(fā)送超時(shí)。

優(yōu)化建議

  • 業(yè)務(wù)層面進(jìn)行分批處理數(shù)據(jù),避免單個(gè) SQL 從服務(wù)器獲取大量的數(shù)據(jù),導(dǎo)致客戶端的 TCP 緩存不足。
  • 提高 MySQL 中的 net_write_timeout 參數(shù)或者增加客戶端的 TCP 緩存,可緩解此情況的發(fā)生,但不能徹底解決該問(wèn)題,因?yàn)閿?shù)據(jù)量太大仍然會(huì)影響性能和穩(wěn)定性。
  • 優(yōu)化 SQL 語(yǔ)句,減少不必要的數(shù)據(jù)返回,比如使用 LIMIT、WHERE 等條件,或者使用聚合函數(shù),分組函數(shù)等,以減少數(shù)據(jù)量和提高查詢效率。

更多技術(shù)文章,請(qǐng)?jiān)L問(wèn):https://opensource.actionsky.com/

關(guān)于 SQLE

SQLE 是一款全方位的 SQL 質(zhì)量管理平臺(tái),覆蓋開(kāi)發(fā)至生產(chǎn)環(huán)境的 SQL 審核和管理。支持主流的開(kāi)源、商業(yè)、國(guó)產(chǎn)數(shù)據(jù)庫(kù),為開(kāi)發(fā)和運(yùn)維提供流程自動(dòng)化能力,提升上線效率,提高數(shù)據(jù)質(zhì)量。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-860530.html

SQLE 獲取

類(lèi)型 地址
版本庫(kù) https://github.com/actiontech/sqle
文檔 https://actiontech.github.io/sqle-docs/
發(fā)布信息 https://github.com/actiontech/sqle/releases
數(shù)據(jù)審核插件開(kāi)發(fā)文檔 https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

到了這里,關(guān)于一則 TCP 緩存超負(fù)荷導(dǎo)致的 MySQL 連接中斷的案例分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 虛擬交換緩存不足導(dǎo)致qt編譯失敗

    qt pro make 失?。?virtual memory exhausted: Cannot allocate memory 查看內(nèi)存: 設(shè)置交換緩存: 釋放緩存 開(kāi)機(jī)自動(dòng)使用該虛擬內(nèi)存的啟動(dòng)腳本 參考

    2024年02月10日
    瀏覽(31)
  • Android studio 通過(guò)mysql連接數(shù)據(jù)庫(kù)完成注冊(cè)登錄,登陸后通過(guò)tcp協(xié)議與電腦的網(wǎng)絡(luò)調(diào)試助手互發(fā)信息

    Android studio 通過(guò)mysql連接數(shù)據(jù)庫(kù)完成注冊(cè)登錄,登陸后通過(guò)tcp協(xié)議與電腦的網(wǎng)絡(luò)調(diào)試助手互發(fā)信息

    先不多直接看軟件截圖 這個(gè)是首頁(yè)等陸界面 xml代碼如下 MainActivity文件 ? ?注冊(cè)界面的xlm文件? 這個(gè)界面比較簡(jiǎn)單就不介紹了 ? MainActivity文件 這是一個(gè)注冊(cè)失敗的界面,如果數(shù)據(jù)庫(kù)內(nèi)有相同的賬號(hào)密碼則顯示注冊(cè)失敗 話不多說(shuō)直接上代碼 MainActivity里面的代碼 這里是user類(lèi)用

    2024年02月02日
    瀏覽(35)
  • Tomcat 的 work 目錄緩存導(dǎo)致的JSP頁(yè)面圖片更新問(wèn)題

    Tomcat 的 work 目錄緩存導(dǎo)致的JSP頁(yè)面圖片更新問(wèn)題

    一、問(wèn)題分析 1.?修改后重新部署沒(méi)有變化 ? ? 筆者之前部署了一個(gè)后臺(tái)管理項(xiàng)目,通過(guò)它來(lái)發(fā)布課程內(nèi)容,其中有一個(gè) JSP?課程頁(yè)面,在該 JSP 頁(yè)面里也引用了類(lèi)文件 Constant.java 里的一個(gè)變量(ALIYUN_OSS_PATH),該變量的值是一個(gè)域名地址( static.aaa.com ),在該 JSP 頁(yè)面基于

    2024年02月02日
    瀏覽(24)
  • python中使用selenium進(jìn)行爬蟲(chóng)時(shí),導(dǎo)致(內(nèi)存已緩存)備用內(nèi)存占用過(guò)大導(dǎo)致崩潰問(wèn)題,3個(gè)解決方案

    python中使用selenium進(jìn)行爬蟲(chóng)時(shí),導(dǎo)致(內(nèi)存已緩存)備用內(nèi)存占用過(guò)大導(dǎo)致崩潰問(wèn)題,3個(gè)解決方案

    在使用python進(jìn)行爬蟲(chóng)的時(shí)候,使用selenium進(jìn)行爬取的時(shí)候經(jīng)常會(huì)出現(xiàn)已緩存過(guò)大的情況,如果緩存出現(xiàn)過(guò)大之后再次執(zhí)行的話就會(huì)計(jì)算機(jī)拒絕,但是這個(gè)時(shí)候我們的內(nèi)存又有很多空間可以使用,一開(kāi)始我以為是占用文件過(guò)多然后點(diǎn)360的那個(gè)進(jìn)行文件整理和清理垃圾,結(jié)果效果

    2023年04月08日
    瀏覽(23)
  • 【算法一則】編輯距離 【動(dòng)態(tài)規(guī)劃】

    【算法一則】編輯距離 【動(dòng)態(tài)規(guī)劃】

    給你兩個(gè)單詞 word1 和 word2, 請(qǐng)返回將 word1 轉(zhuǎn)換成 word2 所使用的最少操作數(shù) 。 你可以對(duì)一個(gè)單詞進(jìn)行如下三種操作: 插入一個(gè)字符 刪除一個(gè)字符 替換一個(gè)字符 這個(gè)問(wèn)題可以使用動(dòng)態(tài)規(guī)劃來(lái)解決。我們可以定義一個(gè)二維數(shù)組dp,其中dp[i][j]表示將word1的前i個(gè)字符轉(zhuǎn)換成word

    2024年04月24日
    瀏覽(25)
  • rocketmq客戶端本地日志文件過(guò)大調(diào)整配置(導(dǎo)致pod緩存cache過(guò)高)

    rocketmq客戶端本地日志文件過(guò)大調(diào)整配置(導(dǎo)致pod緩存cache過(guò)高)

    ? ? ? ? 在使用rocketmq時(shí),發(fā)現(xiàn)本地項(xiàng)目中文件越來(lái)越大,查找發(fā)現(xiàn)在/home/root/logs/rocketmqlog目錄下存在大量rocketmq_client.log日志文件。 開(kāi)啟slf4j日志模式,在項(xiàng)目啟動(dòng)項(xiàng)中增加-Drocketmq.client.logUseSlf4j=true 因?yàn)榕渲檬褂玫氖荢ystem.getProperty獲取,所以只能使用系統(tǒng)環(huán)境配置。 調(diào)整日

    2024年02月15日
    瀏覽(27)
  • 織夢(mèng)欄目有緩存導(dǎo)致剛發(fā)布的文章條數(shù)和分頁(yè)不同步處理方法

    剛做一個(gè)網(wǎng)站需要大量填充數(shù)據(jù),發(fā)覺(jué)得新增的數(shù)據(jù)沒(méi)有即時(shí)同步到欄目文章分頁(yè)里 如圖: 圖2: 分頁(yè)對(duì)不上,經(jīng)查,由于緩存問(wèn)題要等1個(gè)小時(shí)可以自動(dòng)變正常,或手工用ftp把data》cache里所有文件清空,也可以解決,如果不想每次都手工清理,可以通過(guò)改文件,使之不用緩

    2024年02月02日
    瀏覽(18)
  • K8S容器的一則故障記錄

    K8S容器的一則故障記錄

    ?? kubelet 、pod持久化 metrics/vlalphal容器 kube-controller、apiserver ? ? XXX反饋說(shuō)某某業(yè)務(wù)服務(wù)異常,無(wú)法啟動(dòng),需要進(jìn)行協(xié)助排查。經(jīng)常會(huì)接到這樣一個(gè)需求,一開(kāi)始無(wú)法清楚知道具體什么問(wèn)題,需要跟一線運(yùn)維人員詳細(xì)做溝通,了解故障問(wèn)題的細(xì)節(jié)。 ? ? 根據(jù)一線運(yùn)維人

    2024年02月02日
    瀏覽(21)
  • tcp緩存引起的日志丟失

    tcp緩存引起的日志丟失

    logstash從數(shù)據(jù)源拉取日志,然后通過(guò)tcp插件發(fā)送到proxy進(jìn)程中。在業(yè)務(wù)側(cè)發(fā)現(xiàn)日志量明顯少了,所以有了這一次的問(wèn)題排查。 首先從logstash側(cè)開(kāi)始檢查。我們先看logstash的日志,沒(méi)有明顯的報(bào)錯(cuò)信息。 然后再查看logstash管道的狀態(tài)??梢院苊黠@的看到,在output管道中,in遠(yuǎn)遠(yuǎn)大

    2024年01月24日
    瀏覽(18)
  • 項(xiàng)目引入多個(gè)連接池,導(dǎo)致使用其他連接池,maven分析學(xué)習(xí)

    項(xiàng)目引入多個(gè)連接池,導(dǎo)致使用其他連接池,maven分析學(xué)習(xí)

    第一步在命令行中執(zhí)行 如果你的settings文件不是項(xiàng)目使用的setting配置,那么就使用下面的命令 然后打開(kāi)這個(gè)輸出的 excludeParentstart.log文件 然后得到了一堆密密麻麻的文件 這個(gè)玩意怎么看呢?我們得先知道依賴加載順序 執(zhí)行命令 mvn dependency:tree 會(huì)輸出Maven項(xiàng)目的依賴樹(shù),展示

    2024年02月11日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包