Linux 系統效能 log 採集方案

Polin Chen
bimap
Published in
7 min readMay 26, 2017

利用 Linux 系統自帶的系統命令,啓動 Linux 系統效能日誌的持續收集,再 經由 BigData 的運算處理、圖形化展示、和專業團隊的判讀,提出系統調優 和維運的依據,以保證核心業務系統高效穩定的運行。

2. OS 效能日誌收集內容:

利用系統自帶的命令進行收集,無需額外安裝軟體,不會影響應用系統的 正常運行和安全性。

  • 使用 sar 命令收集CPU 資訊
  • 使用 vmstat 命令收集 Memory 和 Paging 資訊
  • 使用 iostat 命令收集 LUN(邏輯分區)的 I/O 負載
  • 使用 df 命令收集 mount point 容量的使用情形
  • 使用 mpstat 命令收集 CPU 所有核數的負載
  • 使用 netstat 收集 network 的負載資訊
  • 使用 top、ps 命令收集 process 的負載

3.採集頻率:

每 60 秒採集一次,每天採集 1400 次,不會增加系統的額外負載

4.效能日誌輸出的内容:

採集產生的日誌檔,為系統效能的資料日誌,不會造成系統中其它資料的 外泄,不存在資料安全問題

5.效能日誌收集流程和步驟

  • 收集 OS 每天產生的效能日誌,並且在本地保留 3–7 天壓縮後的 log
  • 通過 ftp 傳輸方式,將壓縮後的 log,自動發送到 ftp server 上

6.系統效能日誌相關程式:

  • Linux OS log 的收集測試程式: collect_linux5.sh
  • Linux OS log 的收集程式: collect_linux.sh
  • OS log 的壓縮、發送、刪除程式:zip_oslog.sh

7.設定定時任務每天自動產生效能 log

  • 每天0 點0分執行OSlog的收集
  • 每天0點10分執行OSlog 的壓縮和ftp 發送 (每天天發送一次)
  • 每天0點10分執行OSlog 的壓縮和ftp 發送 (一小時發送一次)
crontab - l
0 0 * * * /home/ipoc/collect_linux.sh
10 * * * * /home/ipoc/zip_oslog.sh (每小時發送一次)
# 10 0 * * * /home/ipoc/zip_oslog.sh (每天發送一次)

8. 效能日誌首次收集命令測試和内容驗證:

在首次啓動系統的收集命令,爲了驗證收集命令對系統的負載影響和資料的準確性,把收集總次數 1440 次更改為 5 次,並以人工啓動的方式,進行 效能 log 的收集,如果内容和格式確認沒有問題,便可以設定每天自動收集的步驟和流程。

  • log 收集測試shell script (只有收集5分鐘)
$cat collect_linux5.sh#!/bin/bash
LogDir="/home/ipoc" ### need to change
HOST=`hostname`
DAY=`date +%Y%m%d`
cd $LogDir
vmstat 60 5 > $HOST-mem.$DAY &
sar -urdb 60 5 > $HOST-cpu.$DAY &
sar -P ALL 60 5 > $HOST-mp.$DAY &
iostat -tkdx 60 5 > $HOST-disk.$DAY &
sar -n DEV 60 5 > $HOST-network.$DAY &
top -d 60 -n 5 -b -i > $HOST-process.$DAY &
ps aux | head -n 1 > $HOST-ps.$DAY
for k in `seq 1 5`;do
echo "disk-free: $k `date`" >> $HOST-dkfree.$DAY
df -k >> $HOST-dkfree.$DAY
echo "process: $k `date`" >> $HOST-ps.$DAY
ps aux | awk '{if ($3 ~/[0-9]/ && $3 > 1) print $0}' >> $HOST-ps.$DAY
sleep 60
done
exit

9. 正式收集的shell script

$cat collect_linux.sh#!/bin/bash
LogDir="/home/ipoc" ### need to change
HOST=`hostname`
DAY=`date +%Y%m%d`
cd $LogDir
vmstat 60 1440 > $HOST-mem.$DAY &
sar -urdb 60 1440 > $HOST-cpu.$DAY &
sar -P ALL 60 1440 > $HOST-mp.$DAY &
iostat -tkdx 60 1440 > $HOST-disk.$DAY &
sar -n DEV 60 1440 > $HOST-network.$DAY &
top -d 60 -n 1440 -b -i > $HOST-process.$DAY &
ps aux | head -n 1 > $HOST-ps.$DAY
for k in `seq 1 1440`;do
echo "disk-free: $k `date`" >> $HOST-dkfree.$DAY
df -k >> $HOST-dkfree.$DAY
echo "process: $k `date`" >> $HOST-ps.$DAY
ps aux | awk '{if ($3 ~/[0-9]/ && $3 > 1) print $0}' >> $HOST-ps.$DAY
sleep 60
done
exit

10. 壓縮並通過ftp 方式發送log 到ftp server

$cat zip_oslog.sh#!/bin/bash
HOST=`hostname`
LogDir="/home/ipoc"
Yesterday=`date -d "yesterday" +%Y%m%d`
Today=`date +%Y%m%d`
Day7=`date -d "-7 day" +%Y%m%d`
######################################
###### compress log to zip file
######################################
if [ ! -d $LogDir/backup ] ; then
mkdir $LogDir/backup
fi
cd $LogDir
tar czf $HOST-$Today.tar.gz $HOST-*.$Today
######################################
###### zip yesterday log ###
######################################
ls $LogDir | grep -q $Yesterday
if [[ $? -eq 0 ]] ; then
tar czf $HOST-$Yesterday.tar.gz $HOST-*.$Yesterday
fi
######################################
###### put zip file to ftpserver #####
######################################
FTPserver="113.196.YY.XX"
FTPUSER="ABCD" ### need change
FTPPASS="EFGH" ### need change
ftp -inv $FTPserver << EOF
user $FTPUSER $FTPPASS
binary
mput $HOST-*.tar.gz
bye
EOF
######################################
###### delete 7days ago log & zip ###
######################################
ls $LogDir | grep -q $Yesterday
if [[ $? -eq 0 ]] ; then
mv $LogDir/*.$Yesterday $LogDir/backup
mv $LogDir/$HOST-$Yesterday.tar.gz $LogDir/backup
rm -f $LogDir/backup/$HOST-*.$Day7
rm -f $LogDir/backup/$HOST-$Day7.tar.gz
fi
exit

--

--