濮阳杆衣贸易有限公司

主頁 > 知識庫 > MySQL的MaxIdleConns不合理,會變成短連接的原因

MySQL的MaxIdleConns不合理,會變成短連接的原因

熱門標(biāo)簽:北京人工外呼系統(tǒng)價錢 房產(chǎn)智能外呼系統(tǒng)品牌 福州呼叫中心外呼系統(tǒng)哪家好 沃克斯電梯外呼線路圖 常州電銷外呼系統(tǒng)一般多少錢 400電話鄭州申請 云南語音外呼系統(tǒng)平臺 天智外呼系統(tǒng) 地圖標(biāo)注被騙三百怎么辦

1 背景

最近石墨文檔線上業(yè)務(wù)出現(xiàn)了一些性能問題,在突發(fā)流量情況下,有個業(yè)務(wù)性能急劇下降。該服務(wù)是依賴于數(shù)據(jù)庫的業(yè)務(wù),會批量獲取數(shù)據(jù)庫里的數(shù)據(jù)。在經(jīng)過一系列的排查過程后,發(fā)現(xiàn)該服務(wù)到數(shù)據(jù)庫的連接數(shù)經(jīng)常超過MaxIdleConns,因此懷疑是數(shù)據(jù)庫的配置導(dǎo)致的性能問題,所以以下針對數(shù)據(jù)庫的代碼進(jìn)行了剖析,并做了相關(guān)實(shí)驗(yàn)。

2 配置解讀

maxIdleCount      int                    // zero means defaultMaxIdleConns; negative means 0
maxOpen      int          // = 0 means unlimited
maxLifetime    time.Duration     // maximum amount of time a connection may be reused
maxIdleTime       time.Duration          // maximum amount of time a connection may be idle before being closed

可以看到以上四個配置,是我們Go MySQL客戶端最重要的配置。

maxIdleCount 最大空閑連接數(shù),默認(rèn)不配置,是2個最大空閑連接

maxOpen 最大連接數(shù),默認(rèn)不配置,是不限制最大連接數(shù)

maxLifetime 連接最大存活時間

maxIdleTime 空閑連接最大存活時間

3 源碼解析

我們的場景是客戶端與MySQL建立的連接數(shù)經(jīng)常大于最大空閑連接數(shù),這會導(dǎo)致什么問題?我們看下下圖中的源碼。

我們可以看到,當(dāng)最大空閑連接數(shù)小于客戶端與數(shù)據(jù)庫建立的連接數(shù)的時候,那么就會返回false,并且最大連接數(shù)關(guān)閉計(jì)數(shù)器加1。

然后上圖中,我們就可以看到,連接被關(guān)閉了(MySQL源碼里也不留點(diǎn)緩沖時間再關(guān)閉)。Go的MySQL客戶端這個操作,就會導(dǎo)致當(dāng)突發(fā)流量情況下,由于請求量級過大,超過了最大空閑連接數(shù)的負(fù)載,那么新的連接在放入連接池的時候,會被無情的關(guān)閉,變成短連接,導(dǎo)致你的服務(wù)性能進(jìn)一步惡化。

4 實(shí)驗(yàn)

4.1 模擬線上并發(fā)數(shù)大于MaxIdConns情況

測試代碼 , 為了檢測以上邏輯,假設(shè)了以下場景,設(shè)置最大連接數(shù)為100,最大空閑連接數(shù)為1,并發(fā)數(shù)為10的goroutine來請求數(shù)據(jù)庫。我們通過MySQL的stats的maxIdleClosed的統(tǒng)計(jì),可以看到下圖,我們的連接不停的被關(guān)閉。

4.2 模擬線上并發(fā)數(shù)小于MaxIdConns情況

測試代碼 ,假設(shè)了以下場景,設(shè)置最大連接數(shù)為100,最大空閑連接數(shù)為20,并發(fā)數(shù)為10的goroutine來請求數(shù)據(jù)庫,可以看到下圖中,無MaxIdleClosed的關(guān)閉統(tǒng)計(jì)。

4.3 抓包驗(yàn)證線上并發(fā)數(shù)大于MaxIdConns情況

測試代碼 ,為了驗(yàn)證沒有理解錯代碼,抓個包最穩(wěn)妥。我們將main函數(shù)里放個select{},程序執(zhí)行完mysql的語句后,看下tcp狀態(tài)和抓包數(shù)據(jù)。

可以發(fā)現(xiàn)確實(shí)是tcp的狀態(tài)統(tǒng)計(jì)與MySQL客戶端的統(tǒng)計(jì)是一致的,并且存在fin包。

5 總結(jié)

當(dāng)突發(fā)流量情況下,由于請求量級過大,超過了最大空閑連接數(shù)的負(fù)載,那么新的連接在放入連接池的時候,會被關(guān)閉,將連接變成短連接,導(dǎo)致服務(wù)性能進(jìn)一步惡化。為了避免這種情況,下面列舉了,可以優(yōu)化的措施。

提前將maxIdleConns設(shè)大,避免出現(xiàn)短連接

做好mysql讀寫分離

提升mysql的吞吐量:精簡返回字段,沒必要的字段不要返回,能夠夠快復(fù)用連接

吞吐量的包盡量不要太大,避免分包

優(yōu)化連接池,當(dāng)客戶端到MySQL的連接數(shù)大于最大空閑連接的時候,關(guān)閉能夠做一下延遲(官方不支持,估計(jì)只能自己實(shí)現(xiàn))

讀請求的最好不要放MySQL里,盡量放redis里

6 測試代碼

https://github.com/gotomicro/test/tree/main/gorm

以上就是MySQL的MaxIdleConns不合理,會變成短連接的原因的詳細(xì)內(nèi)容,更多關(guān)于MySQL的MaxIdleConns不合理的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • Mysql主鍵UUID和自增主鍵的區(qū)別及優(yōu)劣分析
  • Mysql根據(jù)某層部門ID查詢所有下級多層子部門的示例
  • 詳解mysql插入數(shù)據(jù)后返回自增ID的七種方法
  • 使用IDEA配置Tomcat和連接MySQL數(shù)據(jù)庫(JDBC)詳細(xì)步驟
  • MYSQL數(shù)據(jù)庫GTID實(shí)現(xiàn)主從復(fù)制實(shí)現(xiàn)(超級方便)
  • MySQL的自增ID(主鍵) 用完了的解決方法
  • JDBC-idea導(dǎo)入mysql連接java的jar包(mac)的方法
  • 深入分析mysql為什么不推薦使用uuid或者雪花id作為主鍵
  • MySQL如何實(shí)現(xiàn)事務(wù)的ACID
  • IDEA連接mysql報(bào)錯的問題及解決方法
  • MySQL為id選擇合適的數(shù)據(jù)類型

標(biāo)簽:珠海 沈陽 拉薩 鹽城 移動 黔東 沈陽 徐州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL的MaxIdleConns不合理,會變成短連接的原因》,本文關(guān)鍵詞  MySQL,的,MaxIdleConns,不合理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL的MaxIdleConns不合理,會變成短連接的原因》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL的MaxIdleConns不合理,會變成短連接的原因的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    嫩江县| 龙陵县| 友谊县| 醴陵市| 安化县| 弋阳县| 荆门市| 嘉荫县| 沙田区| 绥阳县| 安吉县| 耿马| 卢氏县| 延庆县| 公安县| 新和县| 鄢陵县| 靖州| 南京市| 通江县| 贵阳市| 泸水县| 罗城| 黔西| 石台县| 广东省| 奉节县| 五指山市| 景泰县| 庄浪县| 卢氏县| 文昌市| 东城区| 天长市| 大同市| 榆林市| 竹山县| 墨江| 额济纳旗| 汕头市| 赤水市|