棠梨的魚 106.89.211.* 2021-03-02 17:30:02 |
作為一個(gè)穩(wěn)定的系統(tǒng)是不會(huì)崩潰的,這輩子都不會(huì),要不怎么能叫穩(wěn)定呢。那為什么實(shí)踐中我們確實(shí)會(huì)遇到訪問量過大而服務(wù)器趴窩呢?因?yàn)閷?shí)際情況比較復(fù)雜。**個(gè)是內(nèi)存的問題。服務(wù)每個(gè)請求都是要吃內(nèi)存的,請求越多內(nèi)存用量越大,但內(nèi)存畢竟是有限的,可能是物理內(nèi)存確實(shí)用光了,也可能是OS或者中間層的限制。但不管怎樣,一旦發(fā)生后果嚴(yán)重。daemon大概率會(huì)被os殺死,或者內(nèi)部出現(xiàn)了問題導(dǎo)致完全失去響應(yīng)。服務(wù)器就趴窩了。第二個(gè)是設(shè)計(jì)上的局限。有些東西設(shè)計(jì)上就不是為大負(fù)載高并發(fā)來做的。比如早年的服務(wù)器速度快不快?飛快。但一定數(shù)據(jù)庫大到一定程度,性能就會(huì)直線下降。雖然在這個(gè)階段還只是反應(yīng)慢,服務(wù)器沒有趴窩,但這種慢并非是線性增長的,而是近似于指數(shù)那這樣增長方式。比如100個(gè)請求的時(shí)候每個(gè)請求1秒,200個(gè)請求的時(shí)候每個(gè)1.5秒,300個(gè)請求的時(shí)候每個(gè)5秒,到了1000個(gè)的時(shí)候就每個(gè)一個(gè)小時(shí)了。就像高速公路,車少的時(shí)候大家都能跑到法定速度。車一旦增多就會(huì)堵車。更嚴(yán)重的是即使堵車之后即使進(jìn)入的車流沒有繼續(xù)增加,因?yàn)槌龈咚俚能嚵髟絹碓铰萝囈矔?huì)越來越嚴(yán)重,**堵到所有人都堵死。到這個(gè)程度就可以認(rèn)為是事實(shí)上的趴窩了,因?yàn)閹缀跛腥说恼埱蠖紩?huì)因?yàn)槌瑫r(shí)而掛掉。第三個(gè)是設(shè)計(jì)上的缺陷其實(shí)說第二個(gè)問題的時(shí)候已經(jīng)提到這個(gè)問題了,雖然擁堵本身是等一等就能消解,但一旦系統(tǒng)負(fù)荷增大到遠(yuǎn)超預(yù)期,那就不一定會(huì)發(fā)生什么事。比如大量的擁堵導(dǎo)致緩沖區(qū)爆了,導(dǎo)致了一連串連鎖反應(yīng),比如前面提過的內(nèi)存也爆了,進(jìn)而引發(fā)一些不可逆的后果,**導(dǎo)致服務(wù)器宕機(jī)。現(xiàn)實(shí)生活中,情況可能會(huì)更復(fù)雜,宕機(jī)可能是多重作用的結(jié)果。比如一個(gè)系統(tǒng)有4個(gè)節(jié)點(diǎn)做負(fù)載分散,哪怕4個(gè)死了3個(gè)也不會(huì)完全宕機(jī)。結(jié)果一波高峰導(dǎo)致其中兩個(gè)節(jié)點(diǎn)暫時(shí)負(fù)荷變高,反映變慢。然后導(dǎo)致接下來短時(shí)間所有的流量都被導(dǎo)入剩下的兩個(gè)節(jié)點(diǎn),把剩下兩個(gè)節(jié)點(diǎn)搞到完全不動(dòng)了。這個(gè)時(shí)候雖然前兩個(gè)反應(yīng)過來了,但面對(duì)海量的求情也很快就趴窩了。畢竟是是需要四個(gè)人才能搞定的活,現(xiàn)在兩個(gè)兄弟趴了,剩下兩個(gè)孤軍奮戰(zhàn)趴也是遲早的事。這樣服務(wù)器就全趴了。 |