網頁

搜尋此網誌

2014年6月25日 星期三

自我監控分析報告技術 監控工具 smartmontools

現代的磁碟機都有自我監控分析報告技術 (Self-Monitoring, Analysis and Reporting Technology, 簡稱 SMART),利用 SMART 的資訊我們可以取得磁碟衰退 (degradation) 和故障 (failure) 的警告,提早更換有問題的磁碟機以避免資料損毀。

在 Linux 平台上,我們可以使用 smartmontools 套件讀取磁碟的 SMART 資訊,
Ubuntu 上安裝的指令是  sudo apt-get -y install smartmontools,
以下說明皆以 Ubuntu distribution 為主。在smartmontools 套件中包含兩個公用程式 (utility programs):
  • smartctl
    控制和讀取磁碟的 SMART 資訊,與執行 SMART 的測試,指令的最後一個引數是裝置名稱 (例如 /dev/sda ),記得執行 smartctl 需要 root 的權限。
  • smartd
    監控 (monitor) SMART 磁碟的服務程式 (daemon),smartd設定檔位於 /etc/smartd.conf,預設是每1800秒 (30分鐘) 檢查磁碟的 SMART 資訊。
smartctl 和 smartd 的使用方法可以參考說明文件,沒有什麼困難的地方。比較需要注意的是 SMART 中有三種測試,這些「測試」的意義和我們認知不太一樣!(下面的 device 是指你的磁碟機位置,例如 /dev/sda )
  • 線上測試 (online-testing)
    磁碟的 SMART 功能開啟時就會進行的「測試」,對效能沒有影響,利用 smartctl -s on device 指令可以開啟線上測試功能。
  • 離線測試 (offline-testing)
    每隔4小時進行的「測試」,若磁碟忙碌中則延後執行,對效能可能有影響,利用 smartctl -o on device 指令可以開啟自動離線測試的功能,或是使用 smartctl -t offline device 立即執行離線測試。
  • 自我測試 (self-testing)
    分成簡短自我測試 (short self-test)擴充自我測試 (extended self-test) 兩種,擴充自我測試也稱為完整自我測試 (long self-test) ,自我測試需要花費數分鐘至數百分鐘進行,其測試結果會在 SMART 日誌 (Log) 上顯示。使用 smartctl -t short device 或 smartctl -t long device 執行自我測試,再使用 smartctl -l selftest device 查看檢查結果。
嚴格來說,SMART 的線上測試離線測試不能稱為「測試」,線上和離線測試事實上只是更新磁碟 SMART 屬性的數值,因此應該稱為資料收集 (data collection) 較為貼切,在 smartctl 的說明文件提到使用「測試」一詞是個不幸,容易讓人們混淆。在 smartctl 的「Test」一詞都是指離線測試,而「Self-Test」 則是指自我測試。

如果要使用 smartd 當我們監控磁碟狀態,建議安裝 smartmontools 套件執行 sudo service smartd start 啟動服務程式,另外執行 sudo update-rc.d smartd defaults 讓系統啟動時執行 smartd 服務程式。

最後說明 SMART 的屬性 (Attributes), 每個屬性有個 ID 和名稱,ID 是從 1 至 253 的整數。屬性有 3 個重要的數值:
  • RAW_VALUE
    屬性的原始數值
  • VALUE
    正規化 (Normalized) 的數值,各磁碟製造商利用自家的演算法將 RAW_VALUE 轉換成 1 至 254 的整數
  • THRESH
    門檻 (Threshold) 值,範圍從 0 至 255 的整數。當 VALUE 小於或等於 THRESH 則代表故障 (failure)。
另外說明屬性的 TYPE 和 UPDATED 欄位。
  • TYPE 代表屬性的意義,有兩種類型:
    • Pre-failure
      預先故障的屬性,當VALUE 低於 THRESH 表示磁碟即將故障。
    • Old age
      已使用的屬性,當VALUE 低於 THRESH 表示磁碟超出使用期限與設計的耗損次數。
  • UPDATED 代表屬性的更新方式,有兩種類型:
    • Always
      正常運作下,或是執行離線測試時都會更新數值。
    • Offline
      只有在離線測試時才會更新數值。

講了這麼多,不如直接看執行的結果會比較清楚,在我的電腦上執行 sudo smartctl -A /dev/sda,得到下列的屬性結果。

smartctl 5.41 2011-06-09 r3365 [x86_64-linux-3.11.0-24-generic] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x0033   120   120   050    Pre-fail  Always       -       0
  5 Reallocated_Sector_Ct   0x0033   100   100   003    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0032   099   099   000    Old_age   Always       -       132766029055628
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       249
171 Unknown_Attribute       0x000a   000   000   000    Old_age   Always       -       0
172 Unknown_Attribute       0x0032   000   000   000    Old_age   Always       -       0
174 Unknown_Attribute       0x0030   000   000   000    Old_age   Offline      -       23
177 Wear_Leveling_Count     0x0000   000   000   000    Old_age   Offline      -       0
181 Program_Fail_Cnt_Total  0x000a   000   000   000    Old_age   Always       -       0
182 Erase_Fail_Count_Total  0x0032   000   000   000    Old_age   Always       -       0
187 Reported_Uncorrect      0x0012   100   100   000    Old_age   Always       -       0
194 Temperature_Celsius     0x0022   038   089   000    Old_age   Always       -       38 (Min/Max 15/89)
195 Hardware_ECC_Recovered  0x001c   120   120   000    Old_age   Offline      -       0
196 Reallocated_Event_Count 0x0033   100   100   003    Pre-fail  Always       -       0
201 Soft_Read_Error_Rate    0x001c   120   120   000    Old_age   Offline      -       0
204 Soft_ECC_Correction     0x001c   120   120   000    Old_age   Offline      -       0
230 Head_Amplitude          0x0013   100   100   000    Pre-fail  Always       -       100
231 Temperature_Celsius     0x0013   100   100   010    Pre-fail  Always       -       0
233 Media_Wearout_Indicator 0x0032   000   000   000    Old_age   Always       -       1010
234 Unknown_Attribute       0x0032   000   000   000    Old_age   Always       -       569
241 Total_LBAs_Written      0x0032   000   000   000    Old_age   Always       -       569
242 Total_LBAs_Read         0x0032   000   000   000    Old_age   Always       -       472

補充說明,這個 /dev/sda 是 SSD,所以有些屬性不會在硬碟上出現。

###

2014年6月18日 星期三

collectd 系統資訊收集服務

collectd 是收集與統計系統資訊的一個服務程式 (daemon),並將這些資訊儲存成不同方式,如 RRD 檔案或資料庫等。這些統計資料 (statistics) 有什麼用途呢?可以用來做效能分析 (performance analysis),找出系統的瓶頸,也可以用作容量規劃 (capacity planning),預測系統的負載。

在 Ubuntu 上安裝 collectd 相當容易,指令是:sudo apt-get -y install collectd,官方目前最新的是 5.4版,不過目前在 Ubuntu 12.04 上的版本是 collectd 4.10。安裝完成之後,有3個設定檔位於:
  • /etc/collectd/collectd.conf:主要設定檔。
  • /etc/collectd/filters.conf:過濾器的設定檔,用於4.6版新增的規則鍊 (chain) 功能。
  • /etc/collectd/thresholds.conf:門檻值的設定檔,用於4.3版新增的監控 (monitoring) 功能。
collectd 是採用外掛架構 (plug-in architecture) 的設計,因此設定檔大部分都是設定 plugin 如何運作。目前官方總共有111個外掛,這些 plugins 主要分成輸入和輸出兩大類,說明如下:
  • 輸入外掛 (Input plugins)
    在 collectd 中屬於讀取 (read) 類型,定期從系統查詢 (query) 資訊,並將這些數值資訊派送 (dispatch) 回 collectd 服務程式,這類外掛佔了絕大多數。
  • 輸出外掛 (Output plugins)
    在 collectd 中屬於寫入 (write) 類型,處理 collectd 派送的資訊,一般而言是將這些資訊寫入 RRD 或 CSV 檔案,或是透過網路送至遠端。
某些外掛兼具輸入與輸出兩種功能,如AMQP, Network, UnixSock 這類通訊用途的外掛程式,提供資訊的讀取和寫入。除了上述兩大類外,還有下列三種類型 (占少數):
  • 日誌外掛 (Logging plugins)
    將訊息寫入系統日誌 (syslog) 中,或是自訂的日誌檔。
  • 通知外掛 (Notification plugins)
    在監控功能中,當門檻值超出設定範圍後, collectd 將發出的通知訊息,這類外掛將接收通知訊息進行處理,通常是發出 email 告知系統管理員。
  • 繫結外掛 (Binding plugins)
    在 collectd 中執行 Java, Perl, Python 的程式,通常是用來開發自己的外掛程式,透過繫結外掛載入並執行。

這些外掛是以 Shared Object 的方式存在 ( .so 檔案),位於 /usr/lib/collectd 路徑之下。在設定檔中,Interval 設定是比較重要的參數,Interval 參數決定 collectd 多久從輸入外掛讀取資料,預設是 10 秒查詢系統資訊一次,你也可以各別設定每個外掛的 Interval 參數,例如 df 外掛用於統計磁碟使用量,我們就可以將 df 的 Interval 設大一點,因為磁碟空間的變化量不會太大。

整體來說,collectd 內建大量外掛,加上繫結功能方便開發自己的外掛,可以補足內建不足的部分,設定方式也相當簡單 (主要是 collectd.conf ),非常適合用來收集與統計系統資訊。collectd 的缺點大概是監控功能稍弱 (這不是 collectd 的強項),缺乏應用服務的監控,畢竟 collectd 主要是收集數據用途 (所以才叫做 collect daemon ),不是用來判別系統是否正常或異常。

若是要求監控功能,建議使用 Nagios 這套軟體。可以另外安裝 collectd-utils 套件,此套件中有 collectd-nagios 程式,可以將 Nagios 結合 collectd 一起運作。利用 collectd 的 unixsock 外掛配合 collectd-nagios 程式,Nagios 可以擷取 collectd 的統計資料進行系統監控。

###

2014年6月13日 星期五

即時串流通信協定 RTSP

即時串流通信協定 (Real Time Streaming Protocol, RTSP) 是應用層的通訊協定,定義在 RFC 2326 規範中,RTSP 是用來控制具有即時與同步特性的資料,如音訊和視訊的媒體,資料來源包含現場即時轉播和儲存的片段剪輯,媒體資料與控制資料是採用交錯式 (interleaving) 的方式傳送。

RTSP 沒有連線的概念,而是在伺服器維護 ID 以識別對話 (session),RTSP 也沒有限制底下傳輸層的通訊協定,你可以用 TCP 或 UDP 來傳送 RTSP 訊息,一個用戶端可以建立多個連線傳送一個 RTSP 對話。RTSP 控制多個傳送之間的對話,包含選擇傳送通道的方式,以及資料傳送的機制。

媒體來源用URL識別,例如 rtsp://example.com/live.sdp 或 rtspu://example.com/live.sdp,rtsp是以TCP傳輸,而rtspu則是以UDP傳輸,沒有指定埠號的話,RTSP 預設是用 port 554

RTSP 與 HTTP 有些相似,通訊協定的觀念上八九不離十,如果你知道 HTTP ,那麼認識 RTSP 會更容易一些。不過,RTSP 與 HTTP 差異的地方如下:
  • RTSP 增加許多新的方法 (method),還有不同的識別ID。
  • RTSP 伺服器需要維護狀態,但 HTTP 本質上就是無狀態 (stateless)。
    (所以開發一個 RTSP伺服器會比 HTTP 伺服器還要複雜...)
  • RTSP 中,伺服端和用戶端都可以發出請求 ( request)。
  • RTSP 的資料是載於不同協定上 (通常使用 RTP 通訊協定),但 HTTP 是在 HTTP 協定本身的 Message Body中。
  • RTSP 的訊息是用 UTF-8 編碼,而 HTTP 是用 ISO-8859-1 編碼。
  • RTSP 的請求總是包含絕對的 URI,而 HTTP 請求則是絕對路徑和主機位置分開在 Header 中。
相同的地方有:
  • 都是以文字為基礎 (text-based) 的通訊協定,易於擴充。也都是以 CR LF 結尾。
  • 都是用 Message 的方式請求和回應,信息包含 Header 和 Body 兩個部分。
  • 都定義 5 大類的狀態碼 (Status Code),分類也相同:
    • 1xx: 資訊 (Informational)
    • 2xx: 成功 (Success)
    • 3xx: 轉向 (Redirection)
    • 4xx: 用戶端錯誤 (Client Error)
    • 5xx: 伺服端錯誤 (Server Error)
如果你對於 HTTP 已經有相當的認識,那麼了解 RSTP 也不是一件困難的事。在 RTSP 當中有幾個術語比較重要,這裡特別提出來說明。
  • 媒體串流 (Media stream)
    或稱串流,是單一的媒體實體。當串流使用的是 RTP 通訊協定時,串流則是指由 RTP 和 RTCP 封包建立的媒體。
  • 呈現 (Presentation)
    由一個或多個串流所組成,在用戶端足以構成完整的媒體。
  • 呈現描述 (Presentation description)
    定義一個呈現中串流的資訊,包含編碼方式、網路位置和內容資訊。通常是用 SDP (Session Description Protocol) 規範所定義的資訊。
  • 聚集控制 (Aggregate control)
    在伺服器上使用單一時間軸控制多個串流,意思是用戶端送出單一個播放訊息就可以同時控制音訊和視訊兩種串流的輸出。
總結來說,RTSP 像是串流媒體的遙控器,或是遠端控制多媒體伺服器的方法,至於串流媒體是用哪種協定規範,這就不在 RTSP 定義之中。(串流媒體的協定參考 RTP,定義在 RFC 3550)

###

熱門文章