Linux中的衝突問題及其應對策略(轉)

ba發表於2007-08-10
Linux中的衝突問題及其應對策略(轉)[@more@]Linux系統的穩定性成為很多評論家們反對沖突不斷的Windows系統的一個很好的武器。然而,Linux系統的衝突問題雖然比較少,但是一旦在意想不到的情況下出現,也很容易使人們陷入困境。學習一些常用手段來預防這些這些衝突問題的發生是十分重要的,它可以幫助Linux的系統管理員們避免那些困境情況的出現。
  
  在本站的採訪中,Mark Wilding和Dan Behman對於Linux系統衝突問題的預防及修復提供了一種比較簡捷明瞭的方法。他們兩人共同出版了一本新書——《Self-Service Linux: Mastering the Art of Problem Determination》。
  
  一般認為,Linux伺服器系統是不存在衝突的,然而些許時候該系統的衝突、停滯問題的確存在。對於應用軟體層面的衝突或者停滯問題,與核心層面有何不同呢?
  
  Mark Wilding: 應用軟體層面的衝突或者停滯問題只是限制於一個特定的執行緒或者程式。這種衝突或者停滯問題不會導致在該相同系統上執行的其他執行緒或者程式的衝突或者停滯。然而,如果是在核心層面上發生,那麼它將影響到該系統中執行的所有程式。
  
  系統的衝突和停滯,這二者有什麼區別呢?
  
  Dan Behman: 在任何一個層面,衝突和停滯這二者的屬性基本上是相同的。停滯發生在程式或執行緒受阻的時候,此時是由於某種鎖定或者某些硬體資源的繁忙,從而該程式或執行緒不得不等待。等待某些鎖定或資源的情況是經常發生的,但是隻有當這種鎖定或者資源最終無法實現的時候,才會引起系統停滯。
  
  還有很重要的一點需要注意的是,停滯問題有時候可以提早的診斷出來。我的意思是,例如,某種資源的某個特定的時刻非常的繁忙,這是需要這種資源的程式或執行緒就需要等待非常長的一段時間,直至該資源空閒下來。使用者經常不瞭解資源的這種繁忙狀況,而只看到該程式在等待,所以他就認為系統發生了停滯,但實際上此時系統仍然在按照既定的工作流程進行,只是速度比較慢。
  
  而系統的衝突問題與上述的停滯是不同的,它主要是由於某種不可知的硬體或軟體錯誤而導致的。當這種錯誤發生時,特殊的錯誤處理程式將很可能會呼叫那些診斷資訊及報告,從而有希望能夠追蹤到這種錯誤的原因。
  
  衝突問題可以看作是某種致命的問題,它需要完結後才能夠進行分析。而停滯問題可以看作是實時的問題,它可以即時的進行分析、解決。
  
  我知道Linux有一個最大的優勢就是在於它的原始碼的開放性;除此之外,還有別的原因致使Linux比其他作業系統的衝突問題容易解決嗎?
  
  Behman: 伴隨著這種原始碼的開放性,在Linux系統的每一個層面都有著相當多的參閱檔案。同時,既然原始碼是開放的,那麼它的開發團隊也同樣是開放的。這樣以來,你就可以把所遇到的問題向Linux核心的開發者求助,當然包括最初的那些開發人員,甚至Linus Torvalds本人,而這所有的求助程式也僅僅是傳送一封電子郵件就可以了。而據我所知,Linux的這種能力是那些不開放原始碼的作業系統所缺少的。
  
  處理停滯問題有那些困難和挑戰呢?
  
  Wilding: 一個應用軟體的停滯問題是有著多種原因的,也包括那些可能由於核心空間的問題所引起的停滯。這意味著有時候這些問題不是開發者所能夠控制的。但是這正是Linux的優勢所在。所有的原始碼都是開放的,所以如果你遇到了某種程式的核心阻滯狀況,那麼就可以聯絡其原始碼,從而檢視該程式在核心中是如何作用的。然而,在大部分情況下,是沒有必要進行這麼深層次研究的。為了探究程式停滯的原因到底何在?應用軟體的開發者需要認真的研究這些軟體層面的狀況及證據(例如,堆疊的路徑等)。
  
  對於使用者或者維護人員而言,他們一般不會了解應用軟體的具體工作程式,也不會沒有能力進入到原始碼層面進行測試,這是遇到系統停滯問題可以靈活的進行處理。例如,在某種情況下,程式A在等待程式B結束後所釋放的資源,而程式B又在等待程式A佔有的資源。這就是所謂的“死鎖”,這也正是複雜應用軟體中經常出現的問題,可以作為停滯問題的一種診斷方案。
  
  如果你不清楚程式A及程式B的具體等待原因,那麼你甚至不需要明白這到底是不是“死鎖”的情況,而別無選擇的關掉這兩個程式後重新開啟。正是這種類似情況,因此對於應用軟體而言,進行完全的資源及上鎖情況的跟蹤是十分重要的,這可以幫助解決這種比較棘手的問題。
  
  Behman: 關於停滯問題的另一個挑戰在於,當停滯問題發生時,程式或者執行緒經常不知道它被停滯了或者何時將被停滯。這種情況和衝突問題是不同的,當衝突問題發生時,程式可以擷取大部分的訊號,並且訊號處理程式可以新增到平臺系統中來處理這些特殊情況,例如清理記憶體,堆疊跟蹤等等。但是,當停滯問題發生時,這種特殊的處理程式雖然不是完全不可能進行,但是往往比較靈活,不太固定。
  
  停滯問題發生時,往往去重新啟動該系統或者應用軟體。有一點需要切記的是,發生停滯問題時,診斷該問題的一些資料和證據經常被活動的核心及應用軟體所捕獲。如果你不收集這些重要的資訊而立即重新啟動,那麼你永遠不知道如何去診斷這種問題,從而也就不可能阻止其將來的再次發生。
  
  對於一些特殊重要的環境而言,系統的穩定性及可靠性是與問題診斷及解決速度緊密相連。因此,需要堅持一種合理的思路,那就是“先收集錯誤資訊,然後重新啟動”。
  
  與衝突問題對比,當遇到停滯問題時,首先要做的事情是什麼呢?
  
  Behman: 處理核心層面的停滯問題與處理應用軟體層面的停滯是有著很大不同的。
  
  如果你問的是關於應用軟體層面。當衝突問題發生時,有著一種稱為“訊號處理”的特殊功能來呼叫處理各種各樣的資訊,例如記憶體中的資訊,堆疊的跟蹤反饋等。所以一般情況下,遇到衝突問題時,首要的問題就是收集、整理、分析這些資料。
  
  而在停滯問題發生時,這種資料不會自動的收集,而這往往是一種人工的操作過程。收集停滯狀態資料的兩個關鍵點在於追蹤輸出結果以及堆疊的跟蹤反饋。這種追蹤輸出結果的方式能夠得出該程式作用情況的資訊,因為它在一直的監視該程式;這些資訊例如,該程式是否仍然在作用等等。而堆疊的跟蹤反饋可以給出目前程式作用的原始碼部分。這對於開發人員是非常重要的,這樣以來他們就可以研究該程式停滯問題產生的原因。
  
  對於衝突及停滯問題,其最主要的原因是什麼呢?
  
  Wilding: 對於衝突問題而言,我們可以把它的主要原因分為兩種,一種是預防型的,另一種是錯誤處理型的。預防型衝突是核心或應用軟體由於遇到了嚴峻的形勢而產生衝突問題的情況。而軟體意識到這種問題,併產生一種“自殺式”的方法以阻止錯誤的進一步發生,從而避免更加嚴重的問題出現。而對於錯誤處理型的衝突,它意味著記憶體中有著某些不合法的內容進入,幾乎都是一些程式的錯誤。在這種情況下,硬體探測到這種應用軟體,然後傳送訊號去阻止該軟體的程式。
  
  對於停滯問題而言,也一般存在著兩種原因狀況。一種是程式或執行緒等待資源的情況,這不一定能否解決。而其他的程式或執行緒約束著該資源(例如,上鎖),這樣該程式或執行緒在等待時,其還佔據著資源,從而其他程式或執行緒也只能等待。一個例子就是某個程式對佔據的重要資源上鎖,而其自身在漫無目的接收因特網的資訊。第二中比較常見的原因就是一種“依賴迴路式”的等待,在此兩個或者多個程式在互相等待它方的資源,從而陷入“死鎖”。這種情況的解決方法可以是釋放一個鎖,或者在某個空間中共享記憶體等。
  
  在這些衝突以及停滯的情形之下,管理者們有哪些基本的調查研究規則可以應用呢?
  
  Wilding: 一個最好的基本準則就是有組織的參加工作。很重要的一點就是把收集的資料有規則的放在一個明確的地點,這樣將來能夠很容易的找到。這對於那些同時遇到多個問題的情況尤為有用。
  
  Behman: 另一個基本的準則就是要定量的收集資料,而不是定性的收集資料。例如,“昨天晚上6點,系統記憶體利用較低”,這是定性的觀測。這在問題處理中的作用不大。關於該例子的定量的版本應該要收集並儲存那些所有的輸出的資料命令,以及其他一些相關的診斷命令。目的就是在於收集足夠的資料,這樣就可以儘可能的避免問題的再次發生;這就是“一次到位式”的方法,而不需要問題重複出現後,多次收集才能夠得到比較完整的資料。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-941751/,如需轉載,請註明出處,否則將追究法律責任。

相關文章