返回文章列表

網路效能監控指令碼設計與實作

本文探討如何利用 Shell 指令碼解析 Netstat 輸出,實作網路效能監控和程式優先順序調整。文章解析了 getstats 和 netperf 指令碼的運作機制,並提供程式碼範例和改進建議,例如使用人類可讀時間格式、增強報表功能以及加入報警機制。此外,文章也探討了 OS X 系統中檔案換行問題的解決方案,以及

系統管理 網路管理

在網路管理中,有效監控 TCP 協定流量和效能至關重要。本文介紹如何利用 Shell 指令碼解析 netstat 輸出,計算封包傳輸失敗率,並在異常時發出警告。指令碼分為兩部分:第一部分定期記錄網路統計資料,第二部分解析日誌檔案並分析效能趨勢。getstats 指令碼利用 netstat -s -p tcp 命令取得 TCP 統計資料,並將其格式化輸出到日誌檔案。netperf 指令碼則解析日誌檔案,計算重傳率、逾時率等關鍵指標,並與預設閾值比較,在異常時發出警告。此外,文章也討論瞭如何利用 renicenamewatch_and_nice 指令碼調整程式優先順序,以及解決 OS X 系統中檔案換行問題的方法,以提升系統管理效率。

網路狀態監控指令碼解析與實作

在 Unix 系統管理中,netstat 是一個非常有用的工具,用於監控網路流量和效能。然而,由於其輸出資訊量龐大且複雜,本篇文章將介紹如何撰寫指令碼來分析 TCP 協定流量,計算封包傳輸失敗率,並在數值異常時發出警告。

指令碼功能與設計

該指令碼主要分為兩個部分:第一部分負責定期記錄網路統計資料到日誌檔案;第二部分則解析日誌檔案,報告典型的效能資料以及任何異常或遞增的數值。

第一部分:記錄網路統計資料

該指令碼使用 netstat -s -p tcp 命令來取得 TCP 協定的統計資料,並將結果記錄到暫存檔案中。接著,它會從暫存檔案中提取所需的統計資料,包括傳送的封包數、重傳的封包數、接收的封包數、重複的 ACK 數、亂序封包數以及連線請求數。

#!/bin/bash
# getstats--每 'n' 分鐘,抓取 netstats 數值(透過 crontab)
logfile="/Users/taylor/.netstatlog" # 根據您的組態進行更改。
temp="/tmp/getstats.$$.tmp"
trap "$(which rm) -f $temp" 0
if [ ! -e $logfile ] ; then # 第一次執行?
    touch $logfile
fi
( netstat -s -p tcp > $temp
  # 檢查您第一次執行此指令碼時的 log 檔案:某些版本的 netstat
  # 回報多於一行,這就是為什麼這裡使用 "| head -1"。
  sent="$(grep 'packets sent' $temp | cut -d\ -f1 | sed 's/[^[:digit:]]//g' | head -1)"
  resent="$(grep 'retransmitted' $temp | cut -d\ -f1 | sed 's/[^[:digit:]]//g')"
  received="$(grep 'packets received$' $temp | cut -d\ -f1 | sed 's/[^[:digit:]]//g')"
  dupacks="$(grep 'duplicate acks' $temp | cut -d\ -f1 | sed 's/[^[:digit:]]//g')"
  outoforder="$(grep 'out-of-order packets' $temp | cut -d\ -f1 | sed 's/[^[:digit:]]//g')"
  connectreq="$(grep 'connection requests' $temp | cut -d\ -f1 | sed 's/[^[:digit:]]//g')"

內容解密:

  1. logfiletemp 變數設定logfile 用於儲存長期網路統計資料,而 temp 用於暫存每次執行的 netstat 結果。
  2. trap 命令:確保在指令碼離開時刪除暫存檔案,避免佔用系統資源。
  3. netstat -s -p tcp 命令:取得 TCP 協定的詳細統計資訊。
  4. grepcutsed 命令組合:用於從 netstat 的輸出中提取所需的統計資料,例如傳送的封包數和重傳的封包數。

第二部分:解析日誌檔案

第二部分的指令碼負責解析由第一部分產生的日誌檔案,分析網路效能趨勢,並在發現異常時發出警告。雖然這部分的指令碼程式碼未在給定的內容中提供,但其主要功能是讀取日誌檔案中的統計資料,計算相關指標(如封包丟失率),並與歷史資料進行比較,以檢測任何異常。

程式碼範例與解說

假設第二部分的指令碼如下:

#!/bin/bash
# analyze_logs--解析網路統計日誌檔案,報告效能和異常。
logfile="/Users/taylor/.netstatlog"
# 解析日誌檔案,計算相關指標。
while IFS= read -r line; do
    # 處理每一行日誌資料。
    echo "$line"
done < "$logfile"

內容解密:

  1. logfile 變數:指定要解析的日誌檔案路徑。
  2. while 迴圈:逐行讀取日誌檔案,並對每一行進行處理。
  3. echo "$line":簡單地輸出每一行,實際應用中可以在此處新增邏輯來分析資料。

網路效能分析指令碼:getstats 與 netperf 詳解

在管理網路伺服器時,瞭解網路效能的關鍵指標至關重要。本文將探討兩個用於分析 netstat 輸出的指令碼:getstatsnetperf。這兩個指令碼共同工作,以提供網路效能的詳細資訊和歷史趨勢分析。

getstats 指令碼解析

getstats 指令碼的主要任務是從 netstat -s -p tcp 的輸出中提取關鍵的網路效能統計資料。這些資料包括封包傳送數量、重傳次數、接收到的封包數量等。

程式碼片段:

connectacc="$(grep 'connection accepts' $temp | cut -d\ -f1 | sed 's/[^[:digit:]]//g')"
retmout="$(grep 'retransmit timeouts' $temp | cut -d\ -f1 | sed 's/[^[:digit:]]//g')"
/bin/echo -n "time=$(date +%s);"
/bin/echo -n "snt=$sent;re=$resent;rec=$received;dup=$dupacks;"
/bin/echo -n "oo=$outoforder;creq=$connectreq;cacc=$connectacc;"
echo "reto=$retmout"

內容解密:

  1. 資料提取:使用 grepcut 命令從 netstat 輸出中提取特定的統計資料,並透過 sed 移除非數字字元,確保輸出的純淨性。
  2. 格式化輸出:將提取的資料格式化為 var=value 的形式,並附加時間戳記,然後輸出到日誌檔案 netstat.log 中。
  3. eval 命令的準備:這種輸出格式使得後續可以使用 eval 命令將日誌檔案中的每一行解析為 shell 變數。

netperf 指令碼詳解

netperf 指令碼負責解析 netstat.log 檔案,並報告最新的網路效能資料和任何異常情況。

程式碼片段:

eval $(tail -1 $log) # 所有值變成 shell 變數
rep="$(scriptbc -p 3 $re/$snt\*100)"
# ...
echo "Netstat 目前報告如下:"
/bin/echo -n " $snt 封包已傳送,其中 $re 重傳 ($rep%) "
echo "和 $reto 重傳逾時 ($retop%)"
# ...
if [ $repn -ge 5 ] ; then
    echo "*** 警告:重傳率 >= 5% 表示存在問題 "
fi

內容解密:

  1. 最新資料分析:讀取 netstat.log 的最後一行,使用 eval 將其內容轉換為 shell 變數,然後計算各種效能指標的百分比。
  2. 效能報告:輸出最新的網路效能資料,包括封包傳送數量、重傳率等。
  3. 異常檢測:檢查是否出現重傳率、逾時率等超出閾值(5%)的情況,並給出警告訊息。

指令碼協同工作流程

  1. getstats 蒐集資料:定期執行 netstat -s -p tcp,並將關鍵統計資料寫入 netstat.log
  2. netperf 分析資料:讀取 netstat.log,解析最新的網路效能資料,進行歷史趨勢分析,並報告任何異常情況。

網路效能監控與程式優先順序調整指令碼解析

網路效能監控指令碼(netperf)

網路效能監控是系統管理中的重要環節。本文將深入解析 netperf 指令碼的工作原理及其改進方法。

1. 資料收集指令碼(getstats)

getstats 指令碼負責定期收集網路統計資料並儲存於 .netstatlog 檔案中。該指令碼通常由 crontab 定時執行。

*/15 * * * * /home/taylor/bin/getstats

2. 網路效能分析指令碼(netperf)

netperf 指令碼負責分析 .netstatlog 中的資料,提供網路效能的詳細資訊。

$ netperf
Netstat is currently reporting the following:
52170128 packets sent, with 16927 retransmits (0%) and 2722 retransmit timeouts (0%)
20290926 packets received, with 129910 dupes (.600%) and 18064 out of order (0%)
39841 total connection requests, of which 123 were accepted
Analyzing trends...
(Analyzed 6 netstat log entries for calculations)

程式碼解析

netperf 指令碼使用 while 迴圈處理 .netstatlog 中的每一行資料,計算關鍵的網路效能指標,如重傳率、逾時率等。這些資料被寫入 $stats 暫存檔中,然後使用 awk 對其進行匯總和分析。

while read line; do
    # 解析資料並計算網路效能指標
done < .netstatlog

改進建議

  1. 使用人類可讀的時間格式:目前 .netstatlog 使用 epoch 時間,可改為人類可讀的日期格式,便於直接閱讀和分析。
  2. 增強報表功能:可增加圖表生成功能,直觀展示網路效能趨勢。
  3. 報警機制:當檢測到異常網路活動時,自動傳送警示通知管理員。

程式優先順序調整指令碼(renicename)

renicename 指令碼允許管理員根據程式名稱調整其優先順序,從而最佳化系統資源分配。

使用方法

renicename [-n niceval] [-u user|-t tty] [-p] pattern
  • -n niceval:指定新的優先順序值。
  • -u user-t tty:根據使用者或終端篩選程式。
  • -p:僅顯示匹配的程式 ID。

程式碼解析

指令碼使用 getopts 解析命令列引數,並根據指定的模式匹配程式 ID。然後,使用 renice 命令調整這些程式的優先順序。

while getopts "n:u:t:p" opt; do
    case $opt in
        n ) niceval="$OPTARG"; ;;
        # 其他選項處理
    esac
done

改進建議

  1. 增加正規表示式支援:允許使用者使用正規表示式匹配程式名稱,提高靈活性。
  2. 互動式介面:開發互動式介面,簡化指令碼的使用流程。
  3. 日誌記錄:記錄每次優先順序調整的操作,便於稽核和故障排除。

修正OS X檔案換行問題與實用指令碼解析

在Unix與類別Unix系統的世界中,蘋果的OS X系統是一個重要的里程碑。根據BSD Unix的Darwin核心為OS X提供了堅實的基礎,讓使用者在終端機中可以享受到完整的Unix體驗。然而,OS X與Linux/Unix之間存在一些差異,瞭解這些差異並善用一些小技巧,可以大大提升日常操作的效率。

OS X中的換行問題

在OS X中處理由圖形介面建立的檔案時,使用者可能會遇到換行字元不相容的問題。OS X使用的是回車符號(\r),而Unix系統則使用的是換行符號(\n)。這種差異會導致在終端機中檢視Mac檔案時出現不正確的換行。

問題範例

假設有一個名為mac-format-file.txt的檔案,在使用cat指令輸出其內容時,可能會看到以下結果:

$ cat mac-format-file.txt
$

檔案看似空白,但事實上它並非空檔案。使用cat-v選項可以顯示隱藏的控制字元:

$ cat -v mac-format-file.txt
The rain in Spain^Mfalls mainly on^Mthe plain.^MNo kidding. It does.^M$

這裡的^M代表回車符號(\r)。

解決方案

利用tr指令可以輕鬆地將回車符號轉換為換行符號:

$ tr '\r' '\n' < mac-format-file.txt > unix-format-file.txt

轉換後,檔案內容即可正確顯示:

$ tr '\r' '\n' < mac-format-file.txt
The rain in Spain
falls mainly on
the plain.
No kidding. It does.

實用指令碼:renicename與watch_and_nice

除了處理換行問題,OS X的使用者還可以利用一些實用的指令碼來提升系統管理的效率。

renicename指令碼

renicename指令碼允許使用者根據行程名稱調整行程的優先順序。它會先找到符合指定模式的行程ID(PID),然後使用renice指令調整其優先順序。

#!/bin/bash
# renicename--Changes the priority of a process by name
if [ $# -eq 0 ] ; then
  echo "Usage: $(basename $0) [-n niceval] pattern" >&2
  exit 1
fi

# 程式碼邏輯解說:

#### 內容解密:
1. 檢查是否有輸入引數,若無則顯示用法並離開。
2. 解析命令列引數,包括`-n`選項指定的nice值。
3. 使用`ps``awk`指令找到符合指定模式的行程ID。
4. 若找到多個符合的行程,則提示使用者縮小搜尋範圍。
5. 使用`renice`指令調整指定行程的優先順序。

$ renicename "vi"
renicename: more than one process matches pattern vi:
user taylor pid 6584 job vi
user taylor pid 10949 job vi
Use -u user or -t tty to narrow down your selection criteria.

watch_and_nice指令碼

watch_and_nice指令碼則進一步擴充套件了renicename的功能,用於監視特定行程名稱並在發現時自動調整其優先順序。

#!/bin/bash
# watch_and_nice--Watches for the specified process name and renices it to the desired value when seen.
if [ $# -ne 2 ] ; then
  echo "Usage: $(basename $0) desirednice jobname" >&2
  exit 1
fi

pid="$(renicename -p "$2")"
if [ "$pid" == "" ] ; then
  echo "No process found for $2"
  exit 1
fi

currentnice="$(ps -lp $pid | tail -1 | awk '{print $6}')"
if [ $1 -gt $currentnice ] ; then
  echo "Adjusting priority of $2 to $1"
  renice $1 $pid
fi
exit 0

程式碼邏輯解說:

內容解密:

  1. 檢查輸入引數是否正確,若否則顯示用法並離開。
  2. 使用renicename指令碼找到指定行程名稱對應的行程ID。
  3. 查詢該行程目前的nice值。
  4. 若指定的nice值大於目前的nice值,則使用renice調整行程優先順序。