歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

Linux中的沖突問題及其應對策略

  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點,系統內存利用較低”,這是定性的觀測。這在問題處理中的作用不大。關於該例子的定量的版本應該要收集並保存那些所有的輸出的數據命令,以及其他一些相關的診斷命令。目的就是在於收集足夠的數據,這樣就可以盡可能的避免問題的再次發生;這就是“一次到位式”的方法,而不需要問題重復出現後,多次收集才能夠得到比較完整的數據。



  Wilding: 一個最好的基本准則就是有組織的參加工作。很重要的一點就是把收集的數據有規則的放在一個明確的地點,這樣將來能夠很容易的找到。這對於那些同時遇到多個問題的情況尤為有用。

  Behman: 另一個基本的准則就是要定量的收集數據,而不是定性的收集數據。例如,“昨天晚上6點,系統內存利用較低”,這是定性的觀測。這在問題處理中的作用不大。關於該例子的定量的版本應該要收集並保存那些所有的輸出的數據命令,以及其他一些相關的診斷命令。目的就是在於收集足夠的數據,這樣就可以盡可能的避免問題的再次發生;這就是“一次到位式”的方法,而不需要問題重復出現後,多次收集才能夠得到比較完整的數據。



Copyright © Linux教程網 All Rights Reserved