B i M A P

Linux|How to collect Linux Performance Log with Njmon

njmon 為新一代的 nmon 版本,比起 nmon 可以收集更多的性能和配置數據,並以 json 格式輸出,另外也可以輸出 .influxlp 格式保存到 InfluxDB,再經由 BiMAP 大數據分析平台 BigData 的運算處理、視覺化展示,配合專業團隊進行 Linux 系統全面分析與判讀,提出系統調優和維運的依據,以保證核心業務系統高效穩定的運行。

第一步:安裝 njmon

1. 下載 njmon  安裝

$ wget http://sourceforge.net/projects/nmon/files/njmon_linux_binaries_v80.zip

2. 解壓縮 njmon

• 依據用戶實際的 linux 實際的環境和版本,下載到 linux

 解壓縮需要有安裝 zip 命令,sudo apt install zip

$ unzip njmon_linux_binaries_v80.zip

$ ls
ninstall                  njmon_SLES15_ppc64le_v80
njmon.1.gz                njmon_SLES15_x86_64_v80
njmon_RHEL8_ppc64le_v80   njmon_Ubuntu20_ppc64le_v80
njmon_RHEL8_x86_64_v80    njmon_Ubuntu21_x86_64_v80
njmon_SLES12_ppc64le_v80  njmon_Ubuntu22_x86_64_v80

3. 安裝 njmon 在 server 上

 • 執行 ninstall 匹配版本

$ chmod +x ninstall
$ ./ninstall

 有匹配到就會將 njmon 執行檔自動移至 /usr/local/bin  , 出現畫面如下圖所示

HW=x86_64
osname=Ubuntu
osversion=22
Files being installed njmon_Ubuntu22_x86_64_v80
Installing to /usr/local/bin
Set up njmon and nimon commands
No documentation for beta 1

 沒有完全匹配的系統版本,也可以選擇接近的版號,複製到 /usr/local/bin 底下,重新命名為 njmon
• 本文以 OS 版本 Ubuntu22 為例,安裝 njmon_Ubuntu22_x86_64_v80 版本
• 如果是 Centos 7 版本,可以安裝 njmon_RHEL8_x86_64_v80 版本

$ sudo mv njmon_Ubuntu22_x86_64_v80 /usr/local/bin/njmon
$ sudo chmod +x /usr/local/bin/njmon

4. 建立 njmon 要存放的目錄

$ mkdir /home/bimap/njmondata

5. 測試 njmon 的文件輸出

• 驗證 njmon 功能,先設定參數 -s 5 -c 2 代表每5秒收集1筆、要收集2次, -m 後面是日誌存放的目錄路徑,如下面的指令,請手動執行一次

/usr/local/bin/njmon -M -P -b -t 1 -s 5 -c 2 -f -m /home/bimap/njmondata

• 產生兩個文件分別如下:

(1) bimap_20221228_2200.json - 實際收集的日誌

(2) bimap_20221228_2200.err - 錯誤紀錄

•  上面測試是收集2次,所以 json檔會產生2筆資料

•  其中 bimap_20221228_2200.err 資料筆數顯示應為 0 ,代表運行正常無錯誤

$ ll /home/bimap/njmondata
-rw-rw-r-- 1 bimap bimap 23348 Dec 28 22:00 bimap_20221228_2200.json
-rw-rw-r-- 1 bimap bimap     0 Dec 28 22:00 bimap_20221228_2200.err

第二步:建立自動化收集腳本

1. 編輯 ipoc_njmon.sh 

ipoc_njmon.sh 內容如下,請依據實際的環境做修改:

#!/bin/bash
export LC_ALL=C
######################################
###             set env            ###
######################################
Host=`hostname`
# ScpPath="[email protected]:~/ipoc/uploadDir" #需要上傳到遠端server的設定
Seconds=60
Count=60
RetentionDays=30 # 超過30天的檔案不做保留
Yesterday=`date -d "yesterday" +%Y%m%d`
HourAgo=`date -d "1 hour ago" +%Y%m%d_%H`
LogDir="/home/bimap/njmondata" # 日誌存放路徑資料夾
#################################################
########         collect command         ########
#################################################
/usr/local/bin/njmon -M -P -b -t 1 -s $Seconds -c $Count -f -m $LogDir > /dev/null 2>&1

#################################################
########   sent HourAgoLog to uploadDir  ########
#################################################
sleep 60s
cd $LogDir

# 需要上傳到遠端server的話要建立一個sent資料夾
# if [ ! -d $LogDir/sent ] ; then
#    mkdir $LogDir/sent
#fi

if [ ! -d $LogDir/backup ] ; then
    mkdir $LogDir/backup
fi

# 本機收集不需上傳的話,檔案直接移到backup資料夾存放
mv $LogDir/*$HourAgo* $LogDir/backup

# 需要上傳到遠端主機的話,先移到sent資料夾,傳送成功後再移到backup資料夾存放
# mv $LogDir/*$HourAgo* $LogDir/sent
# scp -i ~/.ssh/server.key $LogDir/sent/*$HourAgo*.json $ScpPath && mv $LogDir/sent/* $LogDir/backup

#################################################
########          zip and backup         ########
#################################################
# 1. 檢查將昨天的檔案,保存成一份壓縮檔
cd $LogDir/backup
ls | grep -q $Yesterday_[0-9]
if [ $? -eq 0 ]; then
    rm *.err
    zip -r $Host"-"$Yesterday.zip *$Yesterday* && rm *$Yesterday*.json
fi
# 2. 定期將檔案清除,需要的話請開啟註解並檢查RetentionDays參數設定
#find $LogDir/backup/*.tar.gz -maxdepth 1 -mtime +$RetentionDays -type f -delete
exit

2. 授予腳本執行權限

$ chmod +x ipoc_njmon.sh

3. 在crontab設定自動化排程

• 每個小時整點啟動 njmon 的收集程序, 設定採樣間隔為 60 秒, 每小時收集 60 次

$ crontab -e
0 * * * * /home/bimap/bin/ipoc_njmon.sh

4. 驗證設定成功結果

• 一天共產生24個日誌文件、24個錯誤紀錄(壓縮會不做保存)

$ ls -al
bimap_20221229_0000.json     bimap_20221229_0000.err
bimap_20221229_0100.json     bimap_20221229_0100.err
bimap_20221229_0200.json     bimap_20221229_0200.err
bimap_20221229_0300.json     bimap_20221229_0300.err
bimap_20221229_0400.json     bimap_20221229_0400.err
bimap_20221229_0500.json     bimap_20221229_0500.err
bimap_20221229_0600.json     bimap_20221229_0600.err
bimap_20221229_0700.json     bimap_20221229_0700.err
bimap_20221229_0800.json     bimap_20221229_0800.err
bimap_20221229_0900.json     bimap_20221229_0900.err
bimap_20221229_1000.json     bimap_20221229_1000.err
bimap_20221229_1100.json     bimap_20221229_1100.err
bimap_20221229_1200.json     bimap_20221229_1200.err
bimap_20221229_1300.json     bimap_20221229_1300.err
bimap_20221229_1400.json     bimap_20221229_1400.err
bimap_20221229_1500.json     bimap_20221229_1500.err
bimap_20221229_1600.json     bimap_20221229_1600.err
bimap_20221229_1700.json     bimap_20221229_1700.err
bimap_20221229_1800.json     bimap_20221229_1800.err
bimap_20221229_1900.json     bimap_20221229_1900.err
bimap_20221229_2000.json     bimap_20221229_2000.err
bimap_20221229_2100.json     bimap_20221229_2100.err
bimap_20221229_2200.json     bimap_20221229_2200.err
bimap_20221229_2300.json     bimap_20221229_2300.err

backup 備份資料夾中,當凌晨整點啟動時會將昨日收集的 24 個 .json 檔壓縮成一個 tar.gz 檔保存

$ ls /home/bimap/njmondata/backup
bimap-221228.tar.gz

如何停止或修改 njmon 收集指令

• 正常應該只有一個 pid 正在執行收集,如果有重複請 kill

• 有時候重複執行會報錯,請 kill 乾淨再重新下指令

• 指令如果設定錯誤需要修改,請先 kill 舊的 pid 

$ ps -ef | grep njmon
$ sudo kill -9 ${njmon pid}

njmon 參數說明

  • -A : 自定義 hostname (不給代表默認採用 os.hostname())
  • -s : 採集間隔時間,單位秒,不給代表默認60秒
  • -c : 採集次數,不給代表默認永久
  • -f : 輸出為檔案,數據內容:hostname__.json,錯誤內容:hostname__.err
  • -m : 文件存儲目錄
  • -I : 切換 nimon 模式,輸出格式會改為 .influxlp 檔案
  • -M : 按掛載點 mount 列出的文件系統(如 AIX njmon)而不是文件系統名稱
  • -P : 添加 processes 統計信息(佔用 CPU 週期和大量統計信息)
  • -t : 設置忽略 process CPU 使用百分比閾值(默認 0.01%)
  • -b  process_name 不要併 pid(如果需要寫進 influxDB 保存的話,務必添加此參數避免high cardinality)
延伸閱讀
zoe的大頭照
Bimap 助教

在大數據時代的到來,協助企業擁抱數位轉型,提供易於使用和快速的監控解決方案,並結合教育培訓人才願景,為企業知識創新的貢獻,建立良好的企業夥伴關係。