CPU和內存監測
vmstat命令的VM模式
vmstat可以監測給定時間間隔的服務器的狀態值,包括CPU的使用率,內存的使用,虛擬內存的交換情況,IO讀寫情況。
主要從/proc/meminfo,/proc/stat和/proc/*/stat中獲取數據
常用手段vmstat [採樣的時間間隔秒數] [採樣的次數],舉例如下:
[root@dtbase-master-2 /root]
#vmstat 5 10
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 4126684 314132 58308212 0 0 0 637 0 0 2 1 97 0 0
1 0 0 4256016 314132 58308420 0 0 0 42898 19349 35174 3 2 95 0 0
4 0 0 4010396 314132 58474112 0 0 0 68072 19846 37088 4 2 93 0 0
1 0 0 4180556 314132 58308800 0 0 0 67730 19228 34979 4 2 94 0 0
1 0 0 4158408 314140 58313740 0 0 1 36034 19217 39319 4 2 94 0 0
2 0 0 4185816 314144 58313892 0 0 0 43252 19071 33302 3 2 95 0 0
2 0 0 4237076 314144 58314180 0 0 0 43059 18850 36224 3 2 95 0 0
1 0 0 4174432 314144 58314432 0 0 0 29495 18353 35612 3 2 95 0 0
2 0 0 4168024 314144 58318984 0 0 0 49652 19954 38394 3 2 94 0 0
0 0 0 4241088 314144 58319304 0 0 0 36272 17563 32637 2 1 97 0 0
上述命令表示每5秒採樣一次,採樣10次,因此輸出10條記錄,如果不指定採樣次數的話,就一直採集直到用戶手動停止採集。
上述顯示中每一列的含義介紹如下:
*procs部分
* r 表示運行隊列,表示Runnable狀態的進程數,表示等待CPU的進程數量,越高意味着CPU越忙。
* b 表示阻塞的進程,表示uninterruptible sleep狀態的進程數,通常可以認爲表示等待IO的進程數量。
* memory部分
* swpd 表示已使用的交換空間大小,如果大於0,表示內存不足了。
* free 表示空閒的物理內存大小,單位是KB,上面表示還剩4G物理內存空閒
* buff 表示要輸出到塊設備但還緩存在內存中的數據
* cache 表示從塊設備讀入到內存中,緩存在內存中的數據,不包括tmpfs消耗的內存大小
* swap部分
* si 表示每秒有多少塊從磁盤換入內存,如果這個值大於0,表示物理內存耗盡了
* so 表示每秒有多少塊從內存換入磁盤,如果這個值大於0,表示物理內存耗盡了
* io部分
* bi 表示從塊設備每秒收到的塊數量,單位爲blocks/s
* bo 表示每秒發到塊設備的塊數量,單位爲blocks/s
* system部分
* in 表示每秒CPU的中斷次數,包括時間中斷
* cs 表示每秒上下文切換次數,越小越好
* cpu部分
* us 表示用戶cpu時間,就是非內核態運行的CPU時間,單位是百分比
* sy 表示系統cpu時間,就是內核代碼運行時間,單位是百分比
* id 表示空閒CPU時間,單位是百分比
* wa 表示等待IO的CPU時間,單位是百分比
* st 虛機佔用的時間,單位是百分比
上述內存、交換區、IO統計的單位是塊數,通常在Linux中一個塊是1K字節。
free命令
參數和用法
free命令用於查看系統整體的內存使用情況,它的參數如下:
* -b/-k/-m/-g,調整顯示單位,分別表示以字節/千字節/兆字節/吉字節爲單位顯示,默認是-k
* -t,增加一行顯示內存總量,包括總內存量、總已用內存量和總空閒內存量
* -o,不顯示buffer/cache調整行,就是-/+ buffers/cache行
* -l,增加兩行顯示低端和高端內存統計
* -s/-c,表示採樣時間和採樣次數
free命令的信息從/proc/meminfo中獲取,meminfo函數可以解析meminfo的信息
輸出分析
free命令輸出舉例如下:
#free -l -t
total used free shared buffers cached
Mem: 99174024 95247820 3926204 0 314920 58382632
Low: 99174024 95247820 3926204
High: 0 0 0
-/+ buffers/cache: 36550268 62623756
Swap: 2097144 0 2097144
Total: 101271168 95247820 6023348
上述各行含義分別是:
* Mem:這行是表示從OS角度看系統內存的使用情況。
* total表示物理內存總量
* used表示
* free
* shared表示幾個進程共享的內存,目前已經廢棄,總是0。
* buffers,表示被OS buffer的內存,也就是緩衝要輸出到塊設備的數據
* cahced,表示被OS cache的內存,是OS從磁盤讀出緩存到內存中的數據
* Low:表示從OS角度看的低端內存使用情況
* High:表示從OS角度看的高端內存使用情況,上面因爲是64位系統,因此高端內存部分爲0。
* -/+ buffers/cache:
* used,表示從一個應用程序的角度看,系統有多少內存被用掉了。
* free,表示從一個應用程序的角度看,系統還要多少剩餘內存可用。
* Swap:表示交換區信息。
* Total:表示總量。
一般爲了提高性能,操作系統總是會將磁盤的數據預先讀到內存,而要寫入磁盤的數據則先緩存在內存中,因此會看到free列比較小,而buffers/cache列比較大。
top命令
top命令用來實時監控系統的CPU、內存等負載狀態,可以按照進程實時輸出各進程佔用的資源狀態。
參數和用法
啓動參數如下:
* -p 指定進程號,僅監控某個進程
* -c 顯示整個命令行,而不僅僅是命令名
交互命令如下:
* h,輸出幫助
* k,殺死進程,需要根據提示輸入PID
* i,忽略閒置和殭屍進程,就是忽略掉不佔用CPU的進程
* f,選擇顯示的列,是交互設置的,新版本還可以設置按照哪一列排序,老版本支持的字段較少。
* q,退出程序
輸出分析
top - 16:44:59 up 3 days, 30 min, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.3 st
KiB Mem: 1883984 total, 1797296 used, 86688 free, 169388 buffers
KiB Swap: 2097148 total, 0 used, 2097148 free. 230428 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
15597 root 20 0 2809456 721308 9592 S 0.0 38.3 28:37.43 java
- 首行顯示系統負載和系統運行時間,當前登錄用戶數
- Tasks行顯示當前系統進程按狀態的統計數
- %Cpus顯示當前系統的CPU消耗百分比
- Kib Mem顯示內存使用量
- Kib Swap顯示交換空間使用了量
ps命令
用於顯示進程信息,有兩種參數格式,一種是標準格式ps -opt,一種是BSD格式ps opts
典型用法
- 查看所有進程
- ps aux / ps ax
- ps -eF / ps -ef / ps -ely / ps -e
- 顯示線程信
- ps -eLf
- ps axms
- 樹形結構顯示
- ps -ejH
- ps axjf
- 格式化輸出列,格式化輸出支持的選項,具體可以查看man ps的
STANDARD FORMAT SPECIFIERS
部分
- ps -eo [column1], [column2]
- ps axo [column1], [column2]
- 按用戶輸出
- ps U [username]
- 排序支持,使用–sort選項,–sort spec,這裏的spec格式爲[+|-]key[,[+|-]key],默認是+排序,表示升序
- ps -e –sort=uid,-pid,表示按照uid升序,pid降序排序輸出
輸出分析
- USER 用戶名
- UID 用戶ID(User ID)
- PID 進程ID(Process ID)
- PPID 父進程的進程ID(Parent Process id)
- SID 會話ID(Session id)
- %CPU 進程的cpu佔用率
- %MEM 進程的內存佔用率
- VSZ 進程所使用的虛存的大小(Virtual Size)
- RSS 進程使用的駐留集大小或者是實際內存的大小,Kbytes字節。
- TTY 與進程關聯的終端(tty)
- STAT 進程的狀態:進程狀態使用字符表示的(STAT的狀態碼)
- R 運行 Runnable (on run queue)
- S 睡眠 Sleeping
- I 空閒 Idle
- Z 僵死 Zombie(a defunct process) 進程已終止, 但進程描述符存在, 直到父進程調用wait4()系統調用後釋放。
- D 不可中斷 Uninterruptible sleep (ususally IO) 收到信號不喚醒和不可運行, 進程必須等待直到有中斷髮生。
- T 終止 Terminate,進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號後停止運行運行。
- P 等待交換頁
- W 無駐留頁 has no resident pages,沒有足夠的內存分頁可分配。
- X 死掉的進程
- < 高優先級進程 高優先序的進程
- N 低優先 級進程 低優先序的進程
- L 內存鎖頁 Lock 有記憶體分頁分配並縮在記憶體內
- s 進程的領導者(在它之下有子進程);
- l 多進程的(使用 CLONE_THREAD, 類似 NPTL pthreads)
- 位於後臺的進程組
- START 進程啓動時間和日期
- TIME 進程使用的總cpu時間
- COMMAND 正在執行的命令行命令
- NI 優先級(Nice)
- PRI 進程優先級編號(Priority)
- WCHAN 進程正在睡眠的內核函數名稱;該函數的名稱是從/root/system.map文件中獲得的。
- FLAGS 與進程相關的數字標識
IO監測
iostat
參數和用法
iostat命令的參數介紹如下
* -c,顯示CPU利用率,默認啓用,單獨指定後默認不輸出設備利用率
* -d,顯示設備利用率,默認啓用,單獨指定後默認不輸出cpu利用率
* -h,配合-n選項使用,使NFS系統的報告更human readable
* -k/-m,調整輸出單位,千字節每秒或者兆字節每秒,默認單位是塊每秒
* -N,顯示磁盤陣列信息
* -n,顯示NFS網絡文件系統的IO報告
* -p,可指定分區查看,格式爲-p [{device [,…]} | ALL]
* -t,輸出時打印時間
* -x,輸出擴展信息,就是輸出更詳細的信息,一般都使用該參數。
* -z,忽略沒有活動的設備的輸出
用法如下
iostat [參數] [採樣時間秒數] [採樣次數]
iostat -c 2 每隔2秒顯示1次CPU統計信息
iostat -d 2 每隔2秒顯示1次設備統計信息
iostat -d -x 2 10每隔2秒顯示1次設備擴展統計信息,共顯示10次。
iostat -d sda sdb -x 2 10 每隔2秒顯示1次設備sda和sdb的擴展統計信息,共顯示10次。
輸出分析
#iostat -x 1 6
Linux 2.6.32-220.23.2.ali878.el6.x86_64 (dtbase-master-2) 07/08/2016 _x86_64_ (32 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
2.03 0.00 1.14 0.01 0.00 96.82
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.01 3964.69 0.17 591.78 7.41 41068.15 69.39 0.14 0.24 0.03 1.75
#iostat -d 5 1
Linux 2.6.32-220.23.2.ali878.el6.x86_64 (dtbase-master-2) 07/08/2016 _x86_64_ (32 CPU)
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 593.11 7.39 41159.65 5836572 32509188906
上述輸出中各部分信息描述如下:
* avg-cpu部分,對應-c輸出的內容
* %user,表示用戶CPU時間百分比
* %nice,表示用戶態CPU的nice操作消耗的CPU時間百分比
* %system,表示內核CPU時間百分比
* %iowait,表示CPU花在io等待上的時間百分比
* %steal,表示虛機佔用的CPU時間百分比
* %idle,表示CPU空閒時間百分比
* device部分,對應-d輸出的內容
* rrqm/s,表示每秒這個設備有多少讀取請求被Merge了,當系統調用讀取數據時,VFS將請求發給各個FS,各個FS會根據請求是否是讀取相同的block來合併讀請求。
* wrqm/s,表示每秒這個設備有多少寫請求被Merge了。
* r/s,表示每秒發送到設備的讀取請求數
* w/s,表示每秒發送到設備的寫入請求數
* rsec/s,表示每秒讀取的扇區數量
* wsec/s,表示每秒寫入的扇區數量
* avgrq-sz,表示發送到設備的請求的平均大小,單位是扇區
* avgqu-sz,表示發送到設備的請求的平均隊列長度
* await,表示IO請求的平均執行時間,包括髮送請求和執行的時間,但是爲毫秒
* svctm,表示發送到設備的IO請求的平均執行時間,單位是毫秒,這裏僅包含執行時間,不包含發送請求的時間
* %util,表示設備帶寬利用率,實際是IO請求發送到設備期間佔用的CPU時間的百分比。
* tps,表示該設備每秒的傳輸次數,一次傳輸是一次IO,多個邏輯IO可能被合併爲一次物理IO,一次IO的大小未知。
* blk_read/s,表示每秒讀入塊的數量
* blk_wrtn/s,表示每秒寫入塊的數量
* blk_read,表示系統啓動以來讀入塊的總數
* blk_wrtn,表示系統啓動以來寫入塊的總數
vmstat的disk和partition模式
disk模式
vmstat -d [採樣時間] [採樣次數],列出所有塊設備的讀寫情況,每個塊設備一行。
[root@iZ2371imwx3Z ~]# vmstat -d 5 2
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
xvda 2143955 51246 98066178 79024080 787667 454849 30875448 26476350 0 2937
xvda 2143955 51246 98066178 79024080 787668 454849 30875456 26476352 0 2937
上述命令中各個字段的含義是:
* reads部分
* total,表示系統啓動到現在完成讀的總次數
* merged,表示系統啓動到現在group讀的次數,group read是反映爲一次IO
* sectors,表示系統啓動到現在讀了多少個扇區
* ms,表示系統啓動到現在讀消耗的毫秒數
* writes部分
* total,表示系統啓動到現在完成寫的總次數
* merged,表示系統啓動到現在group寫的次數,group write反映爲一次IO
* sectors,表示系統啓動到現在寫了多少個扇區
* ms,表示系統啓動到現在寫消耗的毫秒數
* IO部分
* cur:正在處理的IO數
* sec,表示系統啓動到現在IO消耗的時間
partition模式
vmstat -p 設備分區 [採樣時間] [採樣次數],列出指定分區的讀寫情況
[root@iZ2371imwx3Z ~]# vmstat -p /dev/xvda1 5 2
xvda1 reads read sectors writes requested writes
2143776 98064746 788481 30893256
2143776 98064746 788482 30893288
上述命令中各個字段的含義如下:
* reads,表示系統啓動到現在此分區上總的讀次數
* read sectors,表示系統啓動到現在此分區上讀的扇區總數
* writes,表示系統啓動到現在此分區上總的寫次數
* requested writes,表示系統啓動到現在對此分區的寫請求總數
網絡監測
netstat
netstat命令用來顯示網絡連接狀態信息,這個命令官方已經廢棄,可以用ss代替
參數和用法
- -r, 顯示路由表信息,現在由ip route命令替代。
- -g,顯示組播信息,現在由ip maddr命令替代。
- -i,顯示接口信息,包括接口的MTU、二層包統計,接口標籤信息。現在由ip -s link替代
- -s,顯示各協議的總的統計信息
- -v,顯示詳細信息
- -W,寬顯示,不會截斷ip地址
- -n,以數字形式顯示地址端口用戶,而不是以DNS、協議名、用戶名顯示
- –protocol=family,指定協議族,包括inet, inet6, unix, ipx, ax25, netrom, econet, ddp,可以簡寫爲-4, -6 -x
- -c,每秒連續輸出
- -e,顯示擴展信息,目前主要是增加了user和inode列顯示
- -o,增加一列顯示定時器信息
- -p,增加一列顯示該socket所屬的進程號和進程信息
- -l,僅顯示監聽端口,監聽端口默認是不輸出的
- -a,顯示監聽和非監聽的端口
- -r -F,輸出FIB的路由信息,內核路由表
- -r -C,輸出路由緩存的路由信息,內核路由緩存
- delay 整數參數,指定每個多少秒輸出一次
典型用法:
netstat -anp
輸出分析
[root@iZ2371imwx3Z ~]# netstat --protocol=inet -a -W -e -o -v -p
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name Timer
tcp 0 0 0.0.0.0:https 0.0.0.0:* LISTEN root 315002 15597/java off (0.00/0/0)
tcp 0 0 localhost:mxi 0.0.0.0:* LISTEN root 315068 15597/java off (0.00/0/0)
tcp 0 0 0.0.0.0:8009 0.0.0.0:* LISTEN root 314999 15597/java off (0.00/0/0)
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN root 314998 15597/java off (0.00/0/0)
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN root 13009 780/sshd off (0.00/0/0)
tcp 1 0 iZ2371imwx3Z:http iZ2371imwx3Z:55825 CLOSE_WAIT root 906801 15597/java off (0.00/0/0)
tcp 0 0 iZ2371imwx3Z:45708 69.172.201.153:http ESTABLISHED root 734431 15597/java off (0.00/0/0)
tcp 0 0 iZ2371imwx3Z:45613 69.172.201.153:http ESTABLISHED root 882000 15597/java off (0.00/0/0)
tcp 1 0 iZ2371imwx3Z:http iZ2371imwx3Z:42164 CLOSE_WAIT root 890885 15597/java off (0.00/0/0)
#netstat -x -e -o -p
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ] DGRAM 23365 9251/java @alimonitor9251
unix 2 [ ] DGRAM 15468 2820/java @alimonitor2820
unix 2 [ ] DGRAM 26408 9670/java @alimonitor9670
unix 2 [ ] DGRAM 9514 1108/udevd @/org/kernel/udev/udevd
unix 3 [ ] STREAM CONNECTED 62870049 19964/syslog-ng /dev/log
unix 3 [ ] STREAM CONNECTED 62870048 17807/pickup
- Inet和Inet6域Socket的輸出
- Proto,當前socket的協議類型,tcp、udp、udpl、raw
- Recv-Q
- ESTABLISHED狀態表示用戶程序還沒有從這個socket讀取的字節數
- LISTENING狀態表示當前的syn backlog
- Send-Q
- ESTABLISHED狀態表示對端沒有ACK的字節數
- LISTENING狀態表示syn backlog的最大size
- Local Address:本地地址和端口
- Foreign Address:對端地址和端口
- State,表示socket狀態,一般僅在TCP下才有效,對應TCP的各個狀態
- User,表示這個socket的屬主
- PID/Program name,表示這個socket所屬進程的PID和進程名
- UNIX域socket的輸出
- Proto,當前協議類型,unix
- RefCnt,當前socket關聯的進程數
- Flags,socket選項
- Type,socket類型,包括數據報、流類型、RAW類型、RDM、SEQPACKET類型、SOCK_PACKET
- State,Free未分配,CONNECTING表示連接建立,空表示未連接
- Path,表示該socket路徑
ss
ss用於替代netstat命令,用於輸出socket的統計信息,輸出類似netstat,可以顯示更詳細的TCP狀態信息。
參數和用法
大部分參數和netstat一樣,下面描述幾個特有的參數
* -i,輸出TCP內部的一些信息,包括各個連接的水位、選項的值。
* -m,輸出socket的一些內存使用信息
* -s,按協議輸出統計信息
* -D filename,dump socket原始信息到文件,這裏是二進制信息。
* -t/-u/-4/-6/-x/-w/-0,指定協議的快捷選項,分別表示tcp、udp、ip、ipv6、unix、raw、packet
ifconfig
顯示接口信息,目前ip命令可以實現其所有功能,這個命令正逐步被廢棄。
參數和用法
- -a,顯示所有接口,包括down的接口,默認down接口不顯示
- -s,簡要顯示,類似netstat -i
- up/down 啓用/禁用接口
- arp/-arp 在指定接口上啓用/禁用ARP
- promisc/-promisc 在指定接口上啓用/禁用混雜模式
- allmulti/-allmulti,在指定接口上啓用/禁用組播
- mtu N,設置MTU
- dstaddr addr,點對點鏈路配置遠端地址
- netmask addr,設置網絡掩碼
- add addr/prefixlen,添加地址
- del addr/prefixlen,刪除地址
- media type,設置接口媒體類型
- broadcast addr,設置或者取消接口廣播地址
- pointopoint [addr],設置接口爲點對點模式,addr表示遠端的協議層地址
- hw class address,設置接口硬件地址,class包括ether、ax25、ARCnet、netrom
典型用法
ifconfig [接口名] 選項
ifconfig eth0 add 192.168.1.1/24
輸出分析
[root@iZ2371imwx3Z ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.252.100.80 netmask 255.255.248.0 broadcast 10.252.103.255
ether 00:16:3e:00:85:43 txqueuelen 1000 (Ethernet)
RX packets 27674 bytes 5689074 (5.4 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 33051 bytes 4136017 (3.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ip
ip是顯示和管理網絡設備、路由、鄰接表、策略路由、隧道的命令,功能強大。
參數和用法
鏈路管理
ip link
地址管理
ip addr
路由管理
ip route
ARP和鄰接表管理
ip neigh
ip ntable
路由策略管理
ip rule
TCP Metric管理
ip tcp_metrics
ip隧道管理
ip tunnel