Njmon 日誌收集說明
Njmon 是 Nmon 的改進版,適用於 Linux 系統,提供了更豐富的性能數據收集和分析功能。它能夠收集 CPU、記憶體、磁碟、網路等多方面的即時系統性能數據,並支持將數據發送到各種數據庫,如 InfluxDB。Njmon 特別適合現代化系統環境,提供了更多靈活性和擴展性。
大多數 IBM 機器內建了 Nmon,如果需要另外安裝,我們建議使用改進版的 njmon。請參考以下步驟來安裝和配置 njmon。
1. 安裝 Njmon
根據您的 Linux 實際環境和版本,下載適合的 Njmon 版本。
下載並安裝 Njmon:
wget http://sourceforge.net/projects/nmon/files/njmon_linux_binaries_v80.zip mkdir njmon_files unzip njmon_linux_binaries_v80.zip -d njmon_files
注意: 如果您的系統尚未安裝 zip
解壓工具,請先執行以下命令安裝:
sudo apt install zip
解壓縮後的目錄結構如下,根據您的 Linux 版本選擇適合的 Njmon 版本進行安裝。本文以 Ubuntu 22 為例,安裝 njmon_Ubuntu22_x86_64_v80
版本。如果是 CentOS 7 版本,可以選擇 njmon_RHEL8_x86_64_v80
版本。
njmon_files/ ├── ninstall ├── njmon.1.gz ├── njmon_RHEL8_ppc64le_v80 ├── njmon_RHEL8_x86_64_v80 ├── njmon_SLES12_ppc64le_v80 ├── njmon_SLES15_ppc64le_v80 ├── njmon_SLES15_x86_64_v80 ├── njmon_Ubuntu20_ppc64le_v80 ├── njmon_Ubuntu21_x86_64_v80 ├── njmon_Ubuntu22_x86_64_v80 └── njmon_linux_binaries_v80.zip
執行安裝腳本:
cd njmon_files chmod +x ninstall ./ninstall
如果沒有完全匹配的系統版本,可以選擇接近的版本,複製到 /usr/local/bin
,重新命名為 njmon
:
sudo mv njmon_files/${your_version_filename} /usr/local/bin/njmon sudo chmod +x /usr/local/bin/njmon
2. 建立 Njmon 日誌存放目錄
mkdir -p /home/bimap/njmondata
3. 建立自動化收集腳本
編輯腳本文件:
mkdir -p /home/bimap/bin vim /home/bimap/bin/ipoc_njmon.sh
需要調整的參數
Seconds
: 每次收集間隔的秒數。默認為60秒,可以根據需要進行修改。Count
: 每次收集數據的次數。默認為60次,可以根據需要進行修改。RetentionDays
: 日誌保留的天數。默認為30天,超過這個天數的檔案將被刪除。LogDir
: 日誌存放目錄。默認為/home/bimap/njmondata
。UploadDir
: 日誌上傳目錄。默認為/home/sftpuser/master
。SCP_TARGET
: SCP 上傳目標路徑。FTPURL
,FTPUSER
,FTPPASS
: FTP 伺服器地址、使用者名和密碼。UPLOAD_METHOD
: 上傳方法。可以選擇ftp
、mv
或scp
,默認為scp
。
ipoc_njmon.sh
內容如下:
#!/bin/bash export LC_ALL=C ################################################# ######## 設定環境變數 ######## ################################################# Host=$(hostname) Seconds=${1:-60} # 默認每次間隔60秒,可以通過參數傳遞修改 Count=${2:-60} # 默認每60次收集數據,可以通過參數傳遞修改 RetentionDays=30 # 超過30天的檔案不做保留,需要的話請開啟尾段的註解 Yesterday=$(perl -MPOSIX -le 'print strftime "%y%m%d", localtime(time()-86400)') LogDir="/home/bimap/njmondata" SentDir="$LogDir/sent" BackupDir="$LogDir/backup" UploadDir="/home/sftpuser/master" # 日誌上傳路徑 # SCP 目標路徑設定 SCP_TARGET="[email protected]:$UploadDir" # FTP 設定參數 FTPURL="10.99.1.106" FTPUSER="sftpuser" FTPPASS="1qaz2wsx" # 上傳方法選擇:可選 "ftp"、"mv" 或 "scp" UPLOAD_METHOD="scp" if [[ ! " ftp mv scp " =~ " ${UPLOAD_METHOD} " ]]; then echo "未知的上傳方式: $UPLOAD_METHOD. 請選擇 'ftp', 'mv' 或 'scp'." exit 1 fi echo "上傳方式: $UPLOAD_METHOD" echo "收集間隔: $Seconds 秒, 收集次數: $Count 次" ################################################# ######## 執行收集命令 ######## ################################################# mkdir -p $SentDir mkdir -p $BackupDir mkdir -p $LogDir cd $LogDir # 獲取舊的nmon文件 Files=$(ls *.json 2> /dev/null) if [ -z "$Files" ]; then echo "沒有舊的 njmon 文件需要移動" else # 將舊文件移動到SentDir mv $Files $SentDir fi # 收集新的nmon文件 /usr/local/bin/njmon -M -P -b -t 1 -s $Seconds -c $Count -f -m $LogDir > /dev/null 2>&1 sleep 10 rm -rf *.err ################################################# ######## 根據選擇的方式上傳文件 ######## ################################################# cd $SentDir case $UPLOAD_METHOD in "ftp") if [ "$(ls -A $SentDir)" ]; then ftp -inv $FTPURL << EOF > $LogDir/ftplog.txt user $FTPUSER $FTPPASS binary mput * bye EOF msg=$(grep "complete" $LogDir/ftplog.txt) if [ -n "$msg" ]; then mv $SentDir/*.* $BackupDir fi rm -rf $LogDir/ftplog.txt fi ;; "mv") if [ "$(ls -A $SentDir)" ]; then mv $SentDir/* $UploadDir fi ;; "scp") if [ "$(ls -A $SentDir)" ]; then scp * $SCP_TARGET if [ $? -eq 0 ]; then mv $SentDir/*.* $BackupDir fi fi ;; *) echo "未知的上傳方式: $UPLOAD_METHOD" exit 1 ;; esac ################################################# ######## 壓縮並備份 ######## ################################################# # 1. 檢查並將昨天的檔案,保存成一份壓縮檔 cd $BackupDir if ls *$Yesterday*.json 1> /dev/null 2>&1; then # 如果存在,將該檔案壓縮起來 tar -czvf "${Host}-${Yesterday}.tar.gz" *$Yesterday*.json && rm -rf *$Yesterday*.json fi # 2. 定期將檔案清除,需要的話請開啟註解並檢查RetentionDays參數設定 # find $BackupDir/*.tar.gz -maxdepth 1 -mtime +$RetentionDays -type f -delete exit
授予腳本執行權限:
chmod +x /home/bimap/bin/ipoc_njmon.sh
4. 測試腳本
第一次測試執行腳本會顯示沒有舊的 .njmon
文件需要移動,這是正常的,因為在第一次執行時還沒有舊的文件。
root@bimap-ipoc-2:/home/bimap/bin# ./ipoc_njmon.sh 5 2 上傳方式: mv 收集間隔: 5 秒, 收集次數: 2 次 沒有舊的 njmon 文件需要移動
第二次執行時應該會正常移動和上傳文件:
root@bimap-ipoc-2:/home/bimap/bin# ./ipoc_njmon.sh 5 2 上傳方式: mv 收集間隔: 5 秒, 收集次數: 2 次
成功後,再設定 crontab 定期執行自動化收集腳本。
5. 設定 crontab 定期執行
編輯 crontab:
crontab -e
添加以下行,設定每60分鐘執行一次自動化收集腳本:
0 * * * * /home/bimap/bin/ipoc_njmon.sh 60 60 > /dev/null 2>&1
日誌檔案範例
執行當下小時會產生 Njmon 日誌檔案,並且每天將日誌檔案壓縮儲存:
[root@bimap nmondata]$ ls /home/bimap/njmondata/backup bimap-230301.tar.gz bimap-230302.tar.gz bimap-230303.tar.gz bimap-230304.tar.gz
6. 如何停止或修改 njmon 收集指令
在使用 Njmon 進行數據收集時,您可能需要停止或修改收集指令。以下是相關步驟:
-
檢查運行中的 Njmon 任務
正常情況下,應該只有一個 Njmon 任務在運行。若發現有多個重複任務,請使用以下命令檢查並停止:ps -ef | grep njmon
-
停止 Njmon 任務
如果重複運行的任務導致報錯,請確保先停止所有運行中的 Njmon 任務,再重新執行指令:sudo kill -9
-
修改 Njmon 收集指令
如果需要修改收集指令,請先停止舊的 Njmon 任務,然後重新啟動帶有新參數的指令。
Njmon 參數說明
-A
:自定義 hostname(不給代表默認採用 os.hostname())-s
:採集間隔時間,單位秒,默認為60秒-c
:採集次數,默認為永久-f
:輸出為檔案,數據內容為hostname__.json
,錯誤內容為hostname__.err
-m
:文件存儲目錄-I
:切換 nimon 模式,輸出格式改為.influxlp
檔案-M
:按掛載點列出的文件系統而不是文件系統名稱-P
:添加 processes 統計信息(佔用 CPU 週期和大量統計信息)-t
:設置忽略 process CPU 使用百分比閾值(默認 0.01%)-b
:不併 pid 的 process_name(若需將數據寫入 InfluxDB,務必添加此參數以避免 high cardinality)