重要性能監測工具:top、vmstat、w、uptime、ps、free、iostat、netstat、/proc等
需要監視Linux伺服器的性能?大多數Linux發行版都內建了一些監視工具。這些工具可以擷取有關系統活動的資訊的詳細名額。通過這些工具,你可以發現産生系統性能問題可能存在原因。下面讨論的是一些最基本的指令,它涉及到系統分析和調試伺服器等一些問題,如:
1. 找出系統瓶頸問題.
2. 磁盤 (儲存) 瓶頸問題.
3. CPU和記憶體瓶頸問題.
4. 網絡瓶頸問題.
# 1: top – 檢視活動程序的指令########################################
TOP工具能夠實時顯示系統中各個程序的資源占用狀況。預設情況下,它将顯示系統中CPU最“敏感”的任務清單.該指令可以按CPU/記憶體的使用情況和執行時間對任務進行排序,并每五秒鐘更新一次。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuUTM3cnRwNVWrRmeBFUQLVnV4R0RJNVbaFTbvl2S39CX1QzLcdzNvwFMw00LcJDMzZWe39CXt92Yu8GdjFTNuMzcvw1LcpDc0RHaiojIsJye.png)
常用的快捷鍵
Top指令為我們提供了很多有用的快捷鍵,如:
快捷鍵 用法
t 切換顯示程序和CPU狀态資訊。
m 切換顯示程序和CPU狀态資訊。
A 分類顯示各種系統資源的消耗情況。可用于快速識别系統的性能要求極高的任務。
o 改變顯示項目的順序。
r 重新設定程序的優先級别。(系統提示使用者輸入需要改變的程序PID以及需要設定的優先級值。)
k 終止一個程序。(系統将提示使用者輸入需要終止的程序PID)
s 改變重新整理的時間間隔。
u 檢視指定使用者的程序。
# 2: vmstat – 系統活動、硬體以及系統資訊
這個指令用來報告關于核心線程、虛拟記憶體、磁盤、陷阱和CPU活動的統計資訊。
# vmstat 3
輸出樣例:
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 2540988 522188 5130400 0 0 2 32 4 2 4 1 96 0 0
1 0 0 2540988 522188 5130400 0 0 0 720 1199 665 1 0 99 0 0
0 0 0 2540956 522188 5130400 0 0 0 0 1151 1569 4 1 95 0 0
0 0 0 2540956 522188 5130500 0 0 0 6 1117 439 1 0 99 0 0
0 0 0 2540940 522188 5130512 0 0 0 536 1189 932 1 0 98 0 0
0 0 0 2538444 522188 5130588 0 0 0 0 1187 1417 4 1 96 0 0
0 0 0 2490060 522188 5130640 0 0 0 18 1253 1123 5 1 94 0 0
顯示記憶體使用情況:
# vmstat –m
# 3: w – 找到已登陸的使用者并且檢視他們做了什麼操作
W指令用來顯示機器上最近登陸的使用者資訊以及他們的程序資訊。
# 4: uptime – 系統已運作的時間
Uptime指令可以檢視系統已經運作了多長時間。截止目前時間日期,系統已經運作了多長時間,目前登入的使用者有哪些,已經在過去的1,5,15分鐘,系統的平均負載值情況。
# uptime
18:02:41 up 41 days, 23:42, 1 user, load average: 0.00, 0.00, 0.00
通常被認為是最佳的負載值。系統負載值根據系統的不同而不同。對于單CPU的系統,負載值在1-3為正常,SMP的系統,負載值在6-10之間也是可以接受的。
# 5: ps – 顯示程序
ps指令用來報告目前程序的快照。要選擇所有程序,使用-ef選項:
隻顯示lighttpd的程序樹:
# pgrep lighttpd
Or
# pgrep -u vivek php-cgi
顯示pid為55977的程序名:
# ps -p 55977 -o comm=
找出最耗費記憶體的前10個程序:
# ps -auxf | sort -nr -k 4 | head -10
找出最耗費CPU的前10個程序:
# ps -auxf | sort -nr -k 3 | head -10
# 6: free – 檢視記憶體的使用情況
free指令會顯示記憶體的使用情況,包括實體記憶體,虛拟的交換檔案記憶體,共享記憶體區段,以及系統核心使用的緩沖區.
free的輸出一共有四行,第四行為交換區的資訊,分别是交換的總量(total),使用量(used)和有多少空閑的交換區(free)。
第二行和第三行是比較讓人迷惑的。這兩行都是說明記憶體使用情況的。第一列是總量(total),第二列是使用量(used),第三列是可用量(free)。第一行的輸出時從作業系統(OS)來看的。
# 7: iostat – 監視CPU平均負載值,I/O狀态
該指令用于報告CPU和輸入/輸出裝置,分區和網絡檔案系統(NFS)的詳細統計資料。
基本使用如下:
參數 -d 表示,顯示裝置(磁盤)使用狀态;-k某些使用block為機關的列強制使用Kilobytes為機關;1 10表示,資料顯示每隔1秒重新整理一次,共顯示10次。
# 8: mpstat – 實時系統監視工具
mpstat是MultiProcessor Statistics的縮寫,是實時系統監控工具。其報告與CPU的一些統計資訊,這些資訊存放在/proc/stat檔案中。在多CPUs系統裡,其不但能檢視所有CPU的平均狀況資訊,而且能夠檢視特定CPU的資訊。
下面隻介紹mpstat與CPU相關的參數,mpstat的文法如下:
Usage: mpstat [ options... ] [ <interval> [ <count> ] ]
Options are:
[ -P { <cpu> | ALL } ] [ -V ]
顯示每個程序對CPU的平均使用率:
# mpstat -P ALL
#9: pmap – 檢視程序使用記憶體的情況
pmap指令用來報告程序使用對于的相應記憶體的情況。使用下面指令可以查出某些記憶體瓶頸問題的原因。
# pmap -d PID
顯示程序号為47394的程序所用記憶體的資訊,最後一行非常重要。
# pmap -d 47394
#11 & #12 : netstat 和 ss – 檢視網絡情況
netstat指令顯示網絡連接配接,路由表,網絡接口統計,僞裝連接配接,多點傳播成員身份。ss指令類似netstat指令的資訊。
#13: iptraf – 實時網絡狀況監視工具
iptraf是一款彩色的互動式的IP區域網路監控工具。這是一個基于ncurses的IP LAN監視工具,它會統計網絡中産生的各種資料,包括TCP資訊,UDP連接配接數,ICMP和OSPF資訊,以太網負載資訊,節點統計,IP校驗和錯誤,以及其他資訊。并且提供:
Network traffic statistics by TCP connection
IP traffic statistics by network interface
Network traffic statistics by protocol
Network traffic statistics by TCP/UDP port and by packet size
Network traffic statistics by Layer2 address
#14: tcpdump – 網絡狀況分析工具
tcpdump用來抓包的一個的簡單指令。但是,要使用該工具,你需熟悉TCP /IP協定。例如:顯示網絡中有關DNS的資訊,請輸入:
# tcpdump -i eth1 'udp port 53'
顯示去往202.54.1.5的所有ftp會話資訊:
# tcpdump -i eth1 'dst 202.54.1.5 and (port 21 or 20'
顯示去往192.168.1.5的所有HTTP會話資訊:
# tcpdump -ni eth0 'dst 192.168.1.5 and tcp and port http'
使用Wireshark檢視tcpdump抓封包件的詳細資訊,輸入:
# tcpdump -n -i eth1 -s 0 -w output.txt src or dst port 80
#15: strace – 系統調用工具
strace是Linux環境下的一款程式調試工具,用來監察一個應用程式所使用的系統呼叫及它所接收的系統資訊。strace是一個有用的小工具,它可以通過跟蹤系統調用來讓你知道一個程式在背景所做的事情。Strace是一個基礎的調試工具,在大多數 Linux系 統上預設已經安裝;但是即便你不是在跟蹤一個問題的時候它也是一個極好的軟體。它能告訴你很多關于一個Linux程式怎樣工作的資訊。
#16: /Proc 檔案系統
Linux 核心提供了一種通過 /proc 檔案系統,在運作時通路核心内部資料結構、改變核心設定的機制。幾個例子:
# cat /proc/cpuinfo
# cat /proc/meminfo
# cat /proc/zoneinfo
# cat /proc/mounts
#17: Nagios – 伺服器和網絡資訊監視工具
Nagios是一款很流行的開源系統和網絡監控應用軟體。你可以很輕松地用它監控所有的主機,網絡裝置和服務。在系統或服務狀态異常時會第一時間通知網站運維人員(發出郵件或短信報警),在狀态恢複正常後發出郵件或短信通知。
#18: Cacti -基于WEB的監視工具
Cacti是通過 snmpget來擷取資料,使用 RRDtool繪畫圖形,而且你完全可以不需要了解RRDtool複雜的參數。它提供了非常強大的資料和使用者管理功能,可以指定每一個使用者能檢視樹狀結構、host以及任何一張圖,還可以與LDAP結合進行使用者驗證,同時也能自己增加模闆,功能非常強大完善。界面友好。CACTI軟體Cacti 的發展是基于讓 RRDTool 使用者更友善使用該軟體,除了基本的 Snmp 流量跟系統資訊監控外,Cacti 也可外挂 Scripts 及加上 Templates 來作出各式各樣的監控圖。
#19: KDE System Guard – 圖形化的系統監視工具
KDE System Guard (KSysguard)是KDE的任務管理和性能監控工具。它采用client/server架構,可以監控本機也可以監控遠端主機。
一篇51CTOblog博文,對KDE System Guard的介紹很詳細:http://linuxshow.blog.51cto.com/1572053/371657
#sar - 收集和報告系統狀态資訊
使用 sar -d 可以得到當天磁盤活動的情況彙總
sar -n DEV 則能給出網絡接口的統計資訊
sar -A 可以報告所有的資訊
sar 适用于快速粗略了解曆史資訊。
sar 指令行的常用格式: sar [options] [-o file] t [n]
options 為指令行選項,sar指令的選項很多,下面隻列出常用選項:
-A:所有報告的總和。
-u:CPU使用率
-v:程序、I節點、檔案和鎖表狀态。
-d:硬碟使用報告。
-r:沒有使用的記憶體頁面和硬碟塊。
-g:序列槽I/O的情況。
-b:緩沖區使用情況。
-a:檔案讀寫情況。
-c:系統調用情況。
-R:程序的活動情況。
-y:終端裝置活動情況。
-w:系統交換活動。
可以參考:http://linuxtools-rst.readthedocs.org/zh_CN/latest/tool/sar.html
其他工具:
nmap – 掃描主機的端口開放情況.
lsof - 列出系統目前打開的檔案,網絡連接配接以及更多資訊。
ntop web based tool – Ntop是一款監控網絡流量工具,它顯示的網絡狀況更加直覺、詳細。Ntop甚至可以列出每個節點計算機的網絡帶寬使用率。它是一個靈活的、功能齊全的,用來監控和解決區域網路問題的工具;可以自動從網絡中識别有用的資訊;将截獲的資料包轉換成易于識别的格式;對網絡環境中通信失敗的情況進行分析;探測網絡通信的時間和過程等。
Conky - Conky是x-window下,一款免費的,輕量級系統監控的工具。它能夠監控許多系統環境的狀态,其中包括的CPU,記憶體,交換空間,磁盤存儲,溫度,程序,網絡接口,電池電量,系統消息,電子郵件收件箱等。
GKrellM – 它來用于監測CPU狀态,記憶體,硬碟,網絡接口,本地和遠端郵箱,以及其他的東西等。
vnstat – vnstat是一個基于控制台的網絡流量監控軟體,它會保持每月,每天,每小時,監視并記錄所標明網絡接口的網絡通信狀況。
htop – htop是一個增強版本的top,同時也是一個互動式程序檢視器,它可以以樹狀結構來顯示程序清單。
mtr – mtr在單一的網絡診斷工具上,結合了traceroute和ping程式的功能。
性能監控腳本
[root@testredis scripts]# cat performance.sh
#!/bin/bash
#監控cpu系統負載
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`
cpu_num=`grep -c 'model name' /proc/cpuinfo`
count_uptime=`uptime |wc -w`
load_15=`uptime | awk '{print $'$count_uptime'}'`
average_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc`
average_int=`echo $average_load | cut -f 1 -d "."`
load_warn=0.70
if [ $average_int -gt 0 ]
then
echo "$IP伺服器單個核心15分鐘的平均負載為$average_load,超過警戒值1.0,請立即處理!!!$(date +%Y%m%d/%H:%M:%S)" >>/usr/monitor/performance/performance_$(date +%Y%m%d).log
echo "$IP伺服器單個核心15分鐘的平均負載為$average_load,超過警戒值1.0,請立即處理!!!$(date +%Y%m%d/%H:%M:%S)" | mail -s "$IP伺服器系統負載嚴重告警" [email protected]
else
echo "$IP伺服器單個核心15分鐘的平均負載值為$average_load,負載正常 $(date +%Y%m%d/%H:%M:%S)">>/usr/monitor/performance/performance_$(date +%Y%m%d).log
fi
#監控cpu使用率
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."`
if [ $cpu_idle -lt 20 ]
then
echo "$IP伺服器cpu剩餘$cpu_idle%,使用率已經超過80%,請及時處理。">>/usr/monitor/performance/performance_$(date +%Y%m%d).log
echo "$IP伺服器cpu剩餘$cpu_idle%,使用率已經超過80%,請及時處理!!!" | mail -s "$IP伺服器cpu告警" [email protected]
else
echo
"$IP伺服器cpu剩餘$cpu_idle%,使用率正常">>/usr/monitor/performance/performance_$(date +%Y%m%d).log
fi
程序監控
[root@testredis scripts]# cat process.sh
#!/bin/bash
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`
tomcat_dir="/opt/apache-tomcat-7.0.8"
mysql_dir="/usr/local/mysql/bin/mysqld_safe"
vsftp_dir="/usr/sbin/vsftpd"
ssh_dir="/usr/sbin/sshd"
for dir in $tomcat_dir $mysql_dir $vsftp_dir $ssh_dir
do
process_count=$(ps -ef | grep "$dir" | grep -v grep | wc -l)
for service in tomcat mysql vsftp ssh
do
echo "$dir" |grep -q "$service"
if [ $? -eq 0 ]
then
if [ $process_count -eq 0 ]
then
echo "$service is down at $(date +%Y%m%d%H:%M:%S)" >>/usr/monitor/process/process_$(date +%Y%m%d).log
echo "$service is down at $(date +%Y%m%d%H:%M:%S)" | mail -s "$IP伺服器 $service服務關閉告警" [email protected]
else
echo "$service is running at $(date +%Y%m%d%H:%M:%S)" >>/usr/monitor/process/process_$(date +%Y%m%d).log
fi
else
continue
fi
done
done
流量監控
#!/bin/bash
#
R1=`cat /sys/class/net/eth0/statistics/rx_bytes`
T1=`cat /sys/class/net/eth0/statistics/tx_bytes`
sleep 1
R2=`cat /sys/class/net/eth0/statistics/rx_bytes`
T2=`cat /sys/class/net/eth0/statistics/tx_bytes`
TBPS=`expr $T2 - $T1`
RBPS=`expr $R2 - $R1`
TKBPS=`expr $TBPS / 1024`
RKBPS=`expr $RBPS / 1024`
echo "上傳速率 eth0: $TKBPS kb/s 下載下傳速率 eth0: $RKBPS kb/s at $(date +%Y%m%d%H:%M:%S)" >>/usr/monitor/network/network_$(date +%Y%m%d).log
流量分析統計
[root@testredis scripts]# cat tongji.sh
#!/bin/bash
TX=0;
RX=0;
MAX_TX=0;
MAX_RX=0;
while read line
do
a=`echo $line | grep "eth0" |awk '{print $3}'`
if [ $a -ge 0 ]
then
TX=$a
if [ $TX -ge $MAX_TX ]
then
MAX_TX=$TX
fi
fi
b=`echo $line | grep "eth0" |awk '{print $7}'`
if [ $b -ge 0 ]
then
RX=$b
if [ $RX -ge $MAX_RX ]
then
MAX_RX=$RX
fi
fi
done < /usr/monitor/network/network_$(date +%Y%m%d).log
echo "最高上傳速度為 $MAX_TX kb/s at $(date +%Y%m%d)">>/usr/monitor/network/tongji.log
echo "最高下載下傳速度為 $MAX_RX kb/s at $(date +%Y%m%d)">>/usr/monitor/network/tongji.log
記憶體硬碟登入使用者數監控
[root@Test scripts]# cat sys-warning.sh
#!/bin/bash
#監控系統負載與CPU、記憶體、硬碟、登入使用者數,超出警戒值則發郵件告警。
#提取本伺服器的IP位址資訊
IP=`ifconfig eth0 | grep "inter addr" | cut -f 2 -d ":" | cut -f 1 -d " "`
# 1、監控系統負載的變化情況,超出時發郵件告警:
#抓取cpu的總核數
cpu_num=`cat /proc/cpuinfo | grep -c "model name"`
#抓取目前系統15分鐘的平均負載值
load_15=`uptime | awk '{print $12}'`
#計算目前系統單個核心15分鐘的平均負載值,結果小于1.0時前面個位數補0。
average_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc`
#取上面平均負載值的個位整數
average_int=`echo $average_load | cut -f 1 -d "."`
#設定系統單個核心15分鐘的平均負載的告警值為0.70(即使用超過70%的時候告警)。
load_warn=0.70
#當單個核心15分鐘的平均負載值大于等于1.0(即個位整數大于0) ,直接發郵件告警;如果小于1.0則進行二次比較
if [ $average_int > 0 ]; then
echo "$IP伺服器單個核心15分鐘的系統平均負載為$average_load,超過警戒值1.0,請立即處理." | mutt -s "$IP 伺服器系統負載嚴重告警." [email protected]
else
#目前系統15分鐘平均負載值與告警值進行比較(當大于告警值0.70時會傳回1,小于時會傳回0)
load_now=`expr $average_load \> $load_warn`
#如果系統單個核心15分鐘的平均負載值大于告警值0.70(傳回值為1),則發郵件給管理者
if [ $load_now == 1 ]; then
echo "$IP伺服器單個核心15分鐘的系統平均負載為$average_load,超過警戒值0.70,請及時處理." | mutt -s "$IP 伺服器系統負載告警" [email protected]
fi
fi
# 2、監控系統cpu的情況,當使用超過80%的時候發告警郵件:
#取目前空閑cpu百份比值(隻取整數部分)
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."`
#設定空閑cpu的告警值為20%,如果目前cpu使用超過80%(即剩餘小于20%),立即發郵件告警
if (($cpu_idle < 20)); then
echo "$IP伺服器cpu剩餘$cpu_idle%,使用率已經超過80%,請及時處理。" | mutt -s "$IP伺服器CPU告警" [email protected]
fi
# 3、監控系統交換分區swap的情況,當使用超過80%的時候發告警郵件:
#系統配置設定的交換分區總量
swap_total=`free -m | grep Swap | awk '{print $2}'`
#目前剩餘的交換分區free大小
swap_free=`free -m | grep Swap | awk '{print $4}'`
#目前已使用的交換分區used大小
swap_used=`free -m | grep Swap | awk '{print $3}'`
if (($swap_used != 0)); then
#如果交換分區已被使用,則計算目前剩餘交換分區free所占總量的百分比,用小數來表示,要在小數點前面補一個整數位0
swap_per=0`echo "scale=2;$swap_free/$swap_total" | bc`
#設定交換分區的告警值為20%(即使用超過80%的時候告警)。
swap_warn=0.20
#目前剩餘交換分區百分比與告警值進行比較(當大于告警值(即剩餘20%以上)時會傳回1,小于(即剩餘不足20%)時會傳回0 )
swap_now=`expr $swap_per \> $swap_warn`
#如果目前交換分區使用超過80%(即剩餘小于20%,上面的傳回值等于0),立即發郵件告警
if (($swap_now == 0)); then
echo "$IP伺服器swap交換分區隻剩下 $swap_free M 未使用,剩餘不足20%,使用率已經超過80%,請及時處理。" | mutt -s "$IP 伺服器記憶體告警" | [email protected]
fi
fi
# 4、監控系統硬碟根分區使用的情況,當使用超過80%的時候發告警郵件:
#取目前根分區(/dev/sda3)已用的百份比值(隻取整數部分)
disk_sda3=`df -h | grep /dev/sda3 | awk '{print $5}' | cut -f 1 -d "%"`
#設定空閑硬碟容量的告警值為80%,如果目前硬碟使用超過80%,立即發郵件告警
if (($disk_sda3 > 80)); then
echo "$IP 伺服器 /根分區 使用率已經超過80%,請及時處理." | mutt -s "$IP 伺服器硬碟告警" [email protected]
fi
#5、監控系統使用者登入的情況,當使用者數超過3個的時候發告警郵件:
#取目前使用者登入數(隻取數值部分)
users=`uptime | awk '{print $6}'`
#設定登入使用者數的告警值為3個,如果目前使用者數超過3個,立即發郵件告警
if (($users >= 3)); then
echo "$IP 伺服器使用者數已經達到$users個,請及時處理。" | mutt -s "$IP 伺服器使用者數告警" [email protected]
fi
[root@Test scripts]# cat check_linux.sh
#!/bin/bash
os_check() {
if [ -e /etc/redhat-release ]; then
REDHAT=`cat /etc/redhat-release |cut -d' ' -f1`
else
DEBIAN=`cat /etc/issue |cut -d' ' -f1`
fi
if [ "$REDHAT" == "CentOS" -o "$REDHAT" == "Red" ]; then
P_M=yum
elif [ "$DEBIAN" == "Ubuntu" -o "$DEBIAN" == "ubutnu" ]; then
P_M=apt-get
else
Operating system does not support.
exit 1
fi
}
if [ $LOGNAME != root ]; then
echo "Please use the root account operation."
exit 1
fi
if ! which vmstat &>/dev/null; then
echo "vmstat command not found, now the install."
sleep 1
os_check
$P_M install procps -y
echo "-----------------------------------------------------------------------"
fi
if ! which iostat &>/dev/null; then
echo "iostat command not found, now the install."
sleep 1
os_check
$P_M install sysstat -y
echo "-----------------------------------------------------------------------"
fi
while true; do
select input in cpu_load disk_load disk_use disk_inode mem_use tcp_status cpu_top10 mem_top10 traffic quit; do
case $input in
cpu_load)
#CPU使用率與負載
echo "---------------------------------------"
i=1
while [[ $i -le 3 ]]; do
echo -e "\033[32m 參考值${i}\033[0m"
UTIL=`vmstat |awk '{if(NR==3)print 100-$15"%"}'`
USER=`vmstat |awk '{if(NR==3)print $13"%"}'`
SYS=`vmstat |awk '{if(NR==3)print $14"%"}'`
IOWAIT=`vmstat |awk '{if(NR==3)print $16"%"}'`
echo "Util: $UTIL"
echo "User use: $USER"
echo "System use: $SYS"
echo "I/O wait: $IOWAIT"
i=$(($i+1))
sleep 1
done
echo "---------------------------------------"
break
;;
disk_load)
#硬碟I/O負載
echo "---------------------------------------"
i=1
while [[ $i -le 3 ]]; do
echo -e "\033[32m 參考值${i}\033[0m"
UTIL=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$NF"%"}'`
READ=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$6"KB"}'`
WRITE=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$7"KB"}'`
IOWAIT=`vmstat |awk '{if(NR==3)print $16"%"}'`
echo -e "Util:"
echo -e "${UTIL}"
echo -e "I/O Wait: $IOWAIT"
echo -e "Read/s:\n$READ"
echo -e "Write/s:\n$WRITE"
i=$(($i+1))
sleep 1
done
echo "---------------------------------------"
break
;;
disk_use)
#硬碟使用率
DISK_LOG=/tmp/disk_use.tmp
DISK_TOTAL=`fdisk -l |awk '/^Disk.*bytes/&&/\/dev/{printf $2" ";printf "%d",$3;print "GB"}'`
USE_RATE=`df -h |awk '/^\/dev/{print int($5)}'`
for i in $USE_RATE; do
if [ $i -gt 90 ];then
PART=`df -h |awk '{if(int($5)=='''$i''') print $6}'`
echo "$PART = ${i}%" >> $DISK_LOG
fi
done
echo "---------------------------------------"
echo -e "Disk total:\n${DISK_TOTAL}"
if [ -f $DISK_LOG ]; then
echo "---------------------------------------"
cat $DISK_LOG
echo "---------------------------------------"
rm -f $DISK_LOG
else
echo "---------------------------------------"
echo "Disk use rate no than 90% of the partition."
echo "---------------------------------------"
fi
break
;;
disk_inode)
#硬碟inode使用率
INODE_LOG=/tmp/inode_use.tmp
INODE_USE=`df -i |awk '/^\/dev/{print int($5)}'`
for i in $INODE_USE; do
if [ $i -gt 90 ]; then
PART=`df -h |awk '{if(int($5)=='''$i''') print $6}'`
echo "$PART = ${i}%" >> $INODE_LOG
fi
done
if [ -f $INODE_LOG ]; then
echo "---------------------------------------"
rm -f $INODE_LOG
else
echo "---------------------------------------"
echo "Inode use rate no than 90% of the partition."
echo "---------------------------------------"
fi
break
;;
mem_use)
#記憶體使用率
echo "---------------------------------------"
MEM_TOTAL=`free -m |awk '{if(NR==2)printf "%.1f",$2/1024}END{print "G"}'`
USE=`free -m |awk '{if(NR==3) printf "%.1f",$3/1024}END{print "G"}'`
FREE=`free -m |awk '{if(NR==3) printf "%.1f",$4/1024}END{print "G"}'`
CACHE=`free -m |awk '{if(NR==2) printf "%.1f",($6+$7)/1024}END{print "G"}'`
echo -e "Total: $MEM_TOTAL"
echo -e "Use: $USE"
echo -e "Free: $FREE"
echo -e "Cache: $CACHE"
echo "---------------------------------------"
break
;;
tcp_status)
#網絡連接配接狀态
echo "---------------------------------------"
COUNT=`netstat -antp |awk '{status[$6]++}END{for(i in status) print i,status[i]}'`
echo -e "TCP connection status:\n$COUNT"
echo "---------------------------------------"
;;
cpu_top10)
#占用CPU高的前10個程序
echo "---------------------------------------"
CPU_LOG=/tmp/cpu_top.tmp
i=1
while [[ $i -le 3 ]]; do
#ps aux |awk '{if($3>0.1)print "CPU: "$3"% -->",$11,$12,$13,$14,$15,$16,"(PID:"$2")" |"sort -k2 -nr |head -n 10"}' > $CPU_LOG
ps aux |awk '{if($3>0.1){{printf "PID: "$2" CPU: "$3"% --> "}for(i=11;i<=NF;i++)if(i==NF)printf $i"\n";else printf $i}}' |sort -k4 -nr |head -10 > $CPU_LOG
#循環從11列(程序名)開始列印,如果i等于最後一行,就列印i的列并換行,否則就列印i的列
if [[ -n `cat $CPU_LOG` ]]; then
echo -e "\033[32m 參考值${i}\033[0m"
cat $CPU_LOG
> $CPU_LOG
else
echo "No process using the CPU."
break
fi
i=$(($i+1))
sleep 1
done
echo "---------------------------------------"
break
;;
mem_top10)
#占用記憶體高的前10個程序
echo "---------------------------------------"
MEM_LOG=/tmp/mem_top.tmp
i=1
while [[ $i -le 3 ]]; do
#ps aux |awk '{if($4>0.1)print "Memory: "$4"% -->",$11,$12,$13,$14,$15,$16,"(PID:"$2")" |"sort -k2 -nr |head -n 10"}' > $MEM_LOG
ps aux |awk '{if($4>0.1){{printf "PID: "$2" Memory: "$3"% --> "}for(i=11;i<=NF;i++)if(i==NF)printf $i"\n";else printf $i}}' |sort -k4 -nr |head -10 > $MEM_LOG
if [[ -n `cat $MEM_LOG` ]]; then
echo -e "\033[32m 參考值${i}\033[0m"
cat $MEM_LOG
> $MEM_LOG
else
echo "No process using the Memory."
break
fi
i=$(($i+1))
sleep 1
done
echo "---------------------------------------"
break
;;
traffic)
#檢視網絡流量
while true; do
read -p "Please enter the network card name(eth[0-9] or em[0-9]): " eth
#if [[ $eth =~ ^eth[0-9]$ ]] || [[ $eth =~ ^em[0-9]$ ]] && [[ `ifconfig |grep -c "\<$eth\>"` -eq 1 ]]; then
if [ `ifconfig |grep -c "\<$eth\>"` -eq 1 ]; then
break
else
echo "Input format error or Don't have the card name, please input again."
fi
done
echo "---------------------------------------"
echo -e " In ------ Out"
i=1
while [[ $i -le 3 ]]; do
#OLD_IN=`ifconfig $eth |awk '/RX bytes/{print $2}' |cut -d: -f2`
#OLD_OUT=`ifconfig $eth |awk '/RX bytes/{print $6}' |cut -d: -f2`
OLD_IN=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $4;else if(NR==5)print $6}'`
#CentOS6和CentOS7 ifconfig輸出進出流量資訊位置不同,CentOS6中RX與TX行号等于8,CentOS7中RX行号是5,TX行号是5,是以就做了個判斷.
OLD_OUT=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $9;else if(NR==7)print $6}'`
sleep 1
NEW_IN=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $4;else if(NR==5)print $6}'`
NEW_OUT=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $9;else if(NR==7)print $6}'`
IN=`awk 'BEGIN{printf "%.1f\n",'$((${NEW_IN}-${OLD_IN}))'/1024/128}'`
OUT=`awk 'BEGIN{printf "%.1f\n",'$((${NEW_OUT}-${OLD_OUT}))'/1024/128}'`
echo "${IN}MB/s ${OUT}MB/s"
i=$(($i+1))
sleep 1
done
echo "---------------------------------------"
break
;;
quit)
exit 0
;;
*)
echo "---------------------------------------"
echo "Please enter the number."
echo "---------------------------------------"
break
;;
esac
done
done