Linux中國

系統管理員入門:排除故障

我通常會嚴格保持此博客的技術性,將觀察、意見等內容保持在最低限度。但是,這篇和接下來的幾篇文章將介紹剛進入系統管理/SRE/系統工程師/sysops/devops-ops(無論你想稱自己是什麼)角色的常見的基礎知識。

請跟我來!

「我的網站很慢!」

我只是隨機選擇了本文的問題類型,這也可以應用於任何與系統管理員相關的故障排除。我並不是要炫耀那些可以發現最多的信息的最聰明的「金句」。它也不是一個詳盡的、一步步指導的、並在最後一個方框中導向「利潤」一詞的「流程圖」。

我會通過一些例子展示常規的方法。

示例場景僅用於說明本文目的。它們有時會做一些不適用於所有情況的假設,而且肯定會有很多讀者在某些時候說「哦,但我覺得你會發現……」。

但那可能會讓我們錯失重點。

十多年來,我一直在從事於支持工作,或在支持機構工作,有一件事讓我一次又一次地感到震驚,這促使我寫下了這篇文章。

有許多技術人員在遇到問題時的本能反應,就是不管三七二十一去嘗試可能的解決方案。

「我的網站很慢,所以」,

  • 我將嘗試增大 MaxClients/MaxRequestWorkers/worker_connections
  • 我將嘗試提升 innodb_buffer_pool_size/effective_cache_size
  • 我打算嘗試啟用 mod_gzip(遺憾的是,這是真實的故事)

「我曾經看過這個問題,它是因為某種原因造成的 —— 所以我估計還是這個原因,它應該能解決這個問題。」

這浪費了很多時間,並會讓你在黑暗中盲目亂撞,胡亂鼓搗。

你的 InnoDB 的緩衝池也許達到 100% 的利用率,但這可能只是因為有人運行了一段時間的一次性大型報告導致的。如果沒有排除這種情況,那你就是在浪費時間。

開始之前

在這裡,我應該說明一下,雖然這些建議同樣適用於許多角色,但我是從一般的支持系統管理員的角度來撰寫的。在一個成熟的內部組織中,或與規模較大的、規範管理的或「企業級」客戶合作時,你通常會對一切都進行檢測、測量、繪製、整理(甚至不是文字),並發出警報。那麼你的方法也往往會有所不同。讓我們在這裡先忽略這種情況。

如果你沒有這種東西,那就隨意了。

澄清問題

首先確定實際上是什麼問題。「慢」可以是多種形式的。是收到第一個位元組的時間嗎?從糟糕的 Javascript 載入和每頁載入要拉取 15 MB 的靜態內容,這是一個完全不同類型的問題。是慢,還是比通常慢?這是兩個非常不同的解決方案!

在你著手做某事之前,確保你知道實際報告和遇到的問題。找到問題的根源通常很困難,但即便找不到也必須找到問題本身。

否則,這相當於系統管理員帶著一把刀去參加槍戰。

唾手可得

首次登錄可疑伺服器時,你可以查找一些常見的嫌疑對象。事實上,你應該這樣做!每當我登錄到伺服器時,我都會發出一些命令來快速檢查一些事情:我們是否發生了頁交換(free / vmstat),磁碟是否繁忙(top / iostat / iotop),是否有丟包(netstat / proc/net/dev),是否處於連接數過多的狀態(netstat),有什麼東西佔用了 CPU(top),誰在這個伺服器上(w / who),syslog 和 dmesg 中是否有引人注目的消息?

如果你從 RAID 控制器得到 2000 條抱怨直寫式緩存沒有生效的消息,那麼繼續進行是沒有意義的。

這用不了半分鐘。如果什麼都沒有引起你的注意 —— 那麼繼續。

重現問題

如果某處確實存在問題,並且找不到唾手可得的信息。

那麼採取所有步驟來嘗試重現問題。當你可以重現該問題時,你就可以觀察它。當你能觀察到時,你就可以解決。如果在第一步中尚未顯現出或覆蓋了問題所在,詢問報告問題的人需要採取哪些確切步驟來重現問題。

對於由太陽耀斑或只能運行在 OS/2 上的客戶端引起的問題,重現並不總是可行的。但你的第一個停靠港應該是至少嘗試一下!在一開始,你所知道的是「某人認為他們的網站很慢」。對於那些人,他們可能還在用他們的 GPRS 手機,也可能正在安裝 Windows 更新。你在這裡挖掘得再深也是浪費時間。

嘗試重現!

檢查日誌

我對於有必要包括這一點感到很難過。但是我曾經看到有人在運行 tail /var/log/... 之後幾分鐘就不看了。大多數 *NIX 工具都特別喜歡記錄日誌。任何明顯的錯誤都會在大多數應用程序日誌中顯得非常突出。檢查一下。

縮小範圍

如果沒有明顯的問題,但你可以重現所報告的問題,那也很棒。所以,你現在知道網站是慢的。現在你已經把範圍縮小到:瀏覽器的渲染/錯誤、應用程序代碼、DNS 基礎設施、路由器、防火牆、網卡(所有的)、乙太網電纜、負載均衡器、資料庫、緩存層、會話存儲、Web 伺服器軟體、應用程序伺服器、內存、CPU、RAID 卡、磁碟等等。

根據設置添加一些其他可能的罪魁禍首。它們也可能是 SAN,也不要忘記硬體 WAF!以及…… 你明白我的意思。

如果問題是接收到第一個位元組的時間,你當然會開始對 Web 伺服器去應用上已知的修復程序,就是它響應緩慢,你也覺得幾乎就是它,對吧?但是你錯了!

你要回去嘗試重現這個問題。只是這一次,你要試圖消除儘可能多的潛在問題來源。

你可以非常輕鬆地消除絕大多數可能的罪魁禍首:你能從伺服器本地重現問題嗎?恭喜,你剛剛節省了自己必須嘗試修復 BGP 路由的時間。

如果不能,請嘗試使用同一網路上的其他計算機。如果可以的話,至少你可以將防火牆移到你的嫌疑人名單上,(但是要注意一下那個交換機!)

是所有的連接都很慢嗎?雖然伺服器是 Web 伺服器,但並不意味著你不應該嘗試使用其他類型的服務進行重現問題。netcat 在這些場景中非常有用(但是你的 SSH 連接可能會一直有延遲,這可以作為線索)! 如果這也很慢,你至少知道你很可能遇到了網路問題,可以忽略掉整個 Web 軟體及其所有組件的問題。用這個知識(我不收 200 美元)再次從頂部開始,按你的方式由內到外地進行!

即使你可以在本地復現 —— 仍然有很多「因素」留下。讓我們排除一些變數。你能用普通文件重現它嗎? 如果 i_am_a_1kb_file.html 很慢,你就知道它不是資料庫、緩存層或 OS 以外的任何東西和 Web 伺服器本身的問題。

你能用一個需要解釋或執行的 hello_world.(py|php|js|rb..) 文件重現問題嗎?如果可以的話,你已經大大縮小了範圍,你可以專註於少數事情。如果 hello_world 可以馬上工作,你仍然學到了很多東西!你知道了沒有任何明顯的資源限制、任何滿的隊列或在任何地方卡住的 IPC 調用,所以這是應用程序正在做的事情或它正在與之通信的事情。

所有頁面都慢嗎?或者只是從第三方載入「實時分數數據」的頁面慢?

這可以歸結為:你仍然可以重現這個問題所涉及的最少量的「因素」是什麼?

我們的示例是一個緩慢的網站,但這同樣適用於幾乎所有問題。郵件投遞?你能在本地投遞嗎?能發給自己嗎?能發給<常見的服務提供者>嗎?使用小的、純文本的消息進行測試。嘗試直到遇到 2MB 擁堵時。使用 STARTTLS 和不使用 STARTTLS 呢?按你的方式由內到外地進行!

這些步驟中的每一步都只需要幾秒鐘,遠遠快於實施大多數「可能的」修復方案。

隔離觀察

到目前為止,當你去除特定組件時無法重現問題時,你可能已經偶然發現了問題所在。

但如果你還沒有,或者你仍然不知道為什麼:一旦你找到了一種方法來重現問題,你和問題之間的「東西」(某個技術術語)最少,那麼就該開始隔離和觀察了。

請記住,許多服務可以在前台運行和/或啟用調試。對於某些類別的問題,執行此操作通常非常有幫助。

這也是你的傳統武器庫發揮作用的地方。stracelsofnetstatGDBiotopvalgrind、語言分析器(cProfile、xdebug、ruby-prof ……)那些類型的工具。

一旦你走到這一步,你就很少能擺脫剖析器或調試器了。

strace 通常是一個非常好的起點。

你可能會注意到應用程序停留在某個連接到埠 3306 的套接字文件描述符上的特定 read() 調用上。你會知道該怎麼做。

轉到 MySQL 並再次從頂部開始。顯而易見:「等待某某鎖」、死鎖、max_connections ……進而:是所有查詢?還是只寫請求?只有某些表?還是只有某些存儲引擎?等等……

你可能會注意到調用外部 API 資源的 connect() 需要五秒鐘才能完成,甚至超時。你會知道該怎麼做。

你可能會注意到,在同一對文件中有 1000 個調用 fstat()open() 作為循環依賴的一部分。你會知道該怎麼做。

它可能不是那些特別的東西,但我保證,你會發現一些東西。

如果你只是從這一部分學到一點,那也不錯;學習使用 strace 吧!真的學習它,閱讀整個手冊頁。甚至不要跳過歷史部分。man 每個你還不知道它做了什麼的系統調用。98% 的故障排除會話以 strace 而終結。

via: http://northernmost.org/blog/troubleshooting-101/index.html

作者:Erik Ljungstrom 譯者:wxy 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國