<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【騰訊二面】5s內(nèi)建立多少個(gè)mysql連接?

          共 2243字,需瀏覽 5分鐘

           ·

          2021-10-16 11:18


          2020年面試騰訊時(shí)面試官問過這樣一個(gè)場景:

          以100每秒的速度向mysql寫數(shù)據(jù),持續(xù)5s,此時(shí)我們的程序和mysql建立了多少個(gè)tcp連接?


          從編程的角度來看,一個(gè)問題的解答過程,無非是尋求輸入輸出,這里輸出是多少個(gè)tcp連接,那么就要鎖定輸入,也就是參數(shù),有哪些因素會影響這個(gè)問題?


          在牛牛看來只有兩點(diǎn):mysql當(dāng)前處理能力和連接池配置。






          參數(shù)分析


          1.mysql處理能力


          • 如果負(fù)載正常的情況,mysql 1s內(nèi)一定能處理100個(gè)請求。

          • 如果負(fù)載比較高,那1s內(nèi)就處理不完,為了方便討論,這里假設(shè)1s能處理50個(gè)請求。


          PS: 正常實(shí)體機(jī)的mysql,即使配置差到1核1G,也完全能勝任100/s的單純插入請求。只有在mysql本身異常,或有其他進(jìn)程占用系統(tǒng)資源時(shí),才會出現(xiàn)1s處理不過來100個(gè)請求的情況。這里的兩個(gè)分支只是邏輯上的討論。


          2.連接池


          連接池是實(shí)現(xiàn)連接復(fù)用的手段,和mysql交互時(shí),每次需要建立一個(gè)連接,用完就會關(guān)掉,這就是短連接。如果在高并發(fā)場景,反復(fù)建立連接的成本是很高的,所以我們可以使用長連接,即連接用完后先不關(guān)閉,放到一個(gè)池子里等待復(fù)用,這個(gè)池子就叫連接池。



          如圖所示,連接池暫存了使用完成之后的mysql連接以待復(fù)用,最大空閑連接數(shù)就是這個(gè)池子的大小。連接池通過一系列參數(shù)控制了針對mysql的連接復(fù)用策略,一般是由客戶端引擎實(shí)現(xiàn),支持哪些參數(shù)也由客戶端引擎決定,通常而言所有的客戶端引擎都支持如下幾個(gè)主要參數(shù):


          • 最大連接數(shù):支持的最大連接數(shù),即能打開連接的最大上限,如果超過這個(gè)閾值,就會出現(xiàn)too many connections的提示,這個(gè)數(shù)字通常可以設(shè)置得較大,以應(yīng)對突如其來的峰值。


          • 最大空閑連接數(shù): 這個(gè)參數(shù)在上圖有標(biāo)注,表示連接池中最多有多少個(gè)空閑連接 ,某個(gè)連接做完事務(wù)之后暫時(shí)空閑,如果連接池中空閑連接數(shù)沒有達(dá)到上限,即可放入連接池。該參數(shù)其實(shí)可以理解為一共可維護(hù)多少個(gè)長連接來節(jié)約連接建立的成本。


          • 最長空閑時(shí)間: 連接池中連接使用完畢后會等到新的請求到來,表明了連接池中的連接在空閑時(shí)能在池子里摸魚多久,如果長時(shí)間沒有請求到來,說明請求量非常小,此時(shí)就需要釋放掉連接來節(jié)省資源,等待多久,就是由該參數(shù)決定,本牛的建議是通常情況下10-20s就足夠了。


          • 最小連接數(shù): 連接池中最小空閑連接數(shù),當(dāng)連接數(shù)少于此值時(shí),連接池會創(chuàng)建新的連接來進(jìn)行補(bǔ)充,作用主要是保持連接池始終處于就緒狀態(tài),如果需要的長連接特別多,且請求是周期性的,比如晚上才有的情況下,可以考慮使用該參數(shù)。


          • 初始化連接數(shù):初始化連接數(shù)目,實(shí)際意義不大,由最小連接數(shù)補(bǔ)齊即可。


          可以看到,最大連接數(shù)最大空閑連接數(shù)以及最大空閑時(shí)間,這三個(gè)參數(shù)是起決定作用的。最大連接數(shù)保證了長連接?短連接的上限,避免了單一程序耗盡mysql的連接資源。最大空閑連接數(shù)決定了長連接的個(gè)數(shù),最大空閑時(shí)間則決定了長連接的持續(xù)性。






          參數(shù)正交



          回到該題目上看,我們利用控制變量來分析,最大連接數(shù)和最大空閑時(shí)間我們假設(shè)足夠大,以保證mysql的正常響應(yīng)和長連接的可持續(xù)性。剩下的就是mysql本身消費(fèi)能力,和最大空閑連接數(shù)即長連接數(shù)兩個(gè)維度的正交了,我們分如下情況:


          1. 處理能力足夠,且連接能完全復(fù)用:請求速度為100每秒,如果我們的最大空閑連接參數(shù)設(shè)置為100,而mysql處于正常狀態(tài),每秒能完成100個(gè)請求·,則一共建立了100個(gè)連接。


          2. 處理能力不足,最大空閑連接數(shù)足夠大:請求以100每秒,如果我們的最大空閑連接數(shù)設(shè)置為100, 而mysql有負(fù)載壓力,每秒完成50個(gè)請求,這里我們假設(shè)mysql處理都是按先入先出,即同一秒產(chǎn)生的請求,因?yàn)闀葟?fù)用連接池,所以連接池那部分會先處理完畢,處理流程如圖所示:



          圓圈中50:x表示這50個(gè)連接是在第x秒產(chǎn)生;長連接中doing表示準(zhǔn)備處理中,done表示做完;短連接默認(rèn)都是doing;紅色字體表示下一秒就會處理,連線表明某個(gè)連接的前世今生。


          第一秒
          由于連接池為空
          產(chǎn)生100個(gè)
          第二秒
          復(fù)用連接池的50個(gè)
          產(chǎn)生50個(gè)
          第三秒
          復(fù)用連接池的50個(gè)
          產(chǎn)生50個(gè)
          第四秒
          復(fù)用連接池的50個(gè)
          產(chǎn)生50個(gè)
          第五秒
          連接池都在忙綠中
          新產(chǎn)生100個(gè)


          1. 處理能力足夠,但連接池最大空閑連接數(shù)較小:請求速度為100每秒,如果我們的最大空閑連接數(shù)設(shè)置為50,而mysql處于正常狀態(tài),每秒完成100個(gè)請求,則100?4?50


          2. 處理能力不足,且連接池最大空閑連接數(shù)較小:請求速度為100每秒,如果我們的最大空閑連接數(shù)設(shè)置為50, 而mysql有負(fù)載壓力,每秒只能完成50個(gè)請求。這種情況可按照場景2進(jìn)行分析,歡迎有興趣的讀者在留言區(qū)交流。






          小結(jié)


          簡簡單單一個(gè)問題,牽引出的其實(shí)是mysql連接池的本質(zhì),這也是面試官面試時(shí)想考察的能力。


          這個(gè)問題至少能考察出面試者兩方面的能力,一是看面試者的思路是否清晰,在實(shí)際業(yè)務(wù)場景中提出來的需求,大多需要仔細(xì)思考來判斷存在哪些影響因素,而在面試中留給面試者思考的時(shí)間并不多,大家的能力高下立判;第二點(diǎn)則是了解面試者對這些基本知識點(diǎn)的掌握情況,這也是對面試者的知識儲備進(jìn)行考察。


          牛牛比較認(rèn)可這種結(jié)合實(shí)際場景的面試題目,希望閱讀完本篇文章之后大家能有所收獲。

          瀏覽 96
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲国产精品久久 | 青娱乐无码视频 | 日本三级网址 | 一级A片色情大片视频我和少妇 | 丁香五月激情综合 |