CPU和內存監測

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章