混沌系列 | 其实制造“假死”很容易
點擊上方“朱小廝的博客”,選擇“設為星標”
回復”1024“獲取獨家整理的學習資料
歡迎跳轉到本文的原文鏈接:https://honeypps.com/chaos/how-to-play-dead/
?
?
這篇也是混沌工程相關的,之前寫了《看我如何作死| 將CPU、IO打爆》和《看我如何作死| 網絡延遲、網絡丟包、網絡中斷一個都沒落下》這兩篇,不過這次不用作死,只是假死。^-^
假死,有機器假死、進程假死和線程假死這幾種。讓機器、進程之類的假死本身沒有多大意義,探索當機器、進程之類的假死之后,其上游調用所接收到的狀態(或者說得到的反饋)才有意義。上游通過評估下游假死之后其本身所觸發的動作反應以及導致的結果來分析其服務本身的質量,如果未達預期,那么就需要做進一步的整改優化。
現象
機器假死一般所表現的現象為機器本身可以ping通,但是任何其它操作沒有反應,包括ssh無法登陸、內部部署的服務進程無法對外提供服務等。
對于某一臺機器,首先可以開啟一個服務進程,可以對外提供服務,這里假設服務端口是6666。這個時候你可以啟動一個腳本去fork 100個進程,這樣來直接(如果100不夠就多加一點)導致機器假死,最終ssh也登錄不了這臺機器。如果還想要知道對于上游來說,下游的機器假死會得到什么樣的現象的話,可以在這個時候去訪問以下假死的這臺機器的6666端口的服務。這里就不賣關子了,最終上游所接收到的狀態應該是會出現超時,即timeout。
一個進程結束后,它并不會立刻從內存中消失,它的進程控制塊還駐留在內存中,此刻這個進程的狀態變成EXIT_ZOMBIE,并且會給它的父進程發送SIGCHLD信號。父進程收到信號后會做一些處理,然后子進程才會徹底被移除。假死一般的進程并不會占用太多的系統資源,只會占用很少的內存。不過,假死進程會占用PID,而Linux中的PID的數量是由限制的。為了向下兼容,Linux中一般設定PID的上限為32767。
進程假死可以總結為不提供服務,但是還駐留在內存中。我們可以在某臺機器上運行一個主進程和一個子進程,子進程開啟7777端口,對外正常提供服務。之后關閉子進程,然后讓主進程sleep一段時間,在這段時間里,子進程處于假死狀態。此時上游去訪問這個7777端口的服務又會出現什么現象呢?上游會發生connection refused。
線程假死會釋放所使用的資源,但在進程表中還會保留其條目。線程假死的時候上游會是timeout。
上面我直接告訴了各種假死場景下的測試結果,有興趣的同學可以自行測試一下。
模擬
總結一下,假死之后上游得到的反饋要么是timeout,要么是connection refused。這個可以讓我們聯想到iptables的reject和drop,他們彼此所呈現出來的狀態是一樣的。
模擬timeout:
iptables?-A?OUTPUT?-p?tcp?--dport?6666?-j?DROP模擬connection refused:
iptables?-A?OUTPUT?-p?tcp?--dport?7777?-j?REJECT我們在做故障注入或者故障演練的時候,并不是所有的時候都需要真的對某個下游服務做一些“出格”的動作。有些故障場景下,我們可以事先測試出這個服務處于某種故障下時,上游所得到的反饋,然后通過其他的方式去模擬出同樣的反饋即可。這樣當要終止故障的時候也容易快速恢復。比如機器假死的故障,如果直接讓機器假死,然后實驗之后恢復時需要重啟機器,反之只需要簡單的撤銷iptables的策略即可。
混沌工程知識補充
“故障是注定的,隨著時間的流逝,一切終將歸于失敗”。我們必須接受故障發生是新常態的想法,處在部分故障的系統正常運行是完全可行的。當我們處理多達幾十個服務實例的小型系統時,100%的健康運行通常是正常狀態,故障則是一種特殊情況。然而,在處理大規模系統時,即100%的健康運行幾乎是不可能實現的。因此,運維的新常態便是接受部分故障。處在部分故障中的系統要求仍能正常運行對外提供服務,這就需要架構本身具備 Resilient 能力,這里的Resilient即為韌性(具備恢復能力)。
混沌工程就是利用實驗提前探知系統風險,通過架構優化和運維模式的改進來解決系統風險,真正實現上述韌性架構,降低企業損失,提高故障免疫力。
韌性架構的重要特征:
?
歡迎跳轉到本文的原文鏈接:https://honeypps.com/chaos/how-to-play-dead/
想知道更多?掃描下面的二維碼關注我
相關推薦:
?
?
>>>Learn More<<
?
點個"在看"唄^_^
總結
以上是生活随笔為你收集整理的混沌系列 | 其实制造“假死”很容易的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 干货!Elasticsearch性能优化
- 下一篇: 总结缓存使用过程中的几种策略以及优缺点组