?Linux進程管理與性能分析

Linux進程管理與性能分析

概述

系統維護的一個重要工作就是監控Linux系統的運行狀態是否正常,分析系統資源的使用情況,進而對系統進行優化,提高其性能。在實際環境中,系統穩定性尤為重要,可以說系統的穩定性關系到企業的存亡。因此,第一時間掌握CPU、Memory、IO、Network的等系統資源的狀態則可以在系統出現問題時及時解決,把損失降到最低。 
本篇主要介紹Linux下性能監控的常用工具,進程管理的有效辦法,做到以下幾點:

  • 查看所有運行中的進程

  • 查看進程消耗資源

  • 定位個別進程并且對其執行指定操作

  • 改變進程的優先級

  • 殺死指定進程

  • 限制進程可用的系統資源等

進程

  • 進程的概念 

    • 程序是指令的集合,進程是程序執行的基本單元。進程是由程序運行時創建的,是被載入內存的指令集合、數據以及一些用于存放程序命令行參數、環境變量的棧空間等內容。 
      因此,程序是靜態的,進程則是動態的。 
      在Linux中通過fork(),clone()創建同一程序的多個進程,并且每個進程由PID來標記,同時執行不會互相干擾。 
      Linux中的一切皆文件思想決定了進程對文件系統的存取和訪問權限通常繼承自程序發起者。

    • 進程的優先級: 
      系統優先級(system):0 – 139,共140個優先級數字越優先級越高。 
      實時優先級(realtime):99 – 0 對應系統優先級的0-99,數值越優先級高。這些優先級都要高于正常進程的優先級(nice值)。 
      Nice優先級(man nice):-20 ~ +19 對應系統優先級中的100 – 139或99。正值表示低優先級,負值表示高優先級,值為零則表示不會調整該進程的優先級。具有最高優先級的程序,其nice值最低,所以在LINUX系統中,值-20使得一項任務變得非常重要;與之相反,如果任務的nice為+19,則表示它是一個高尚的、無私的任務,允許所有其他任務比自己享有寶貴的CPU時間的更大使用份額,這也就是nice的名稱的來意。

01進程優先級.jpg

    • 進程的上下文: 

    • 上下文切換(Context Switch)是多任務操作系統的基石,每個進程都有自己的執行環境就是進程的上下文,這些上下文就是當前進程使用的寄存器,比如PC、棧指針%esp、幀指針%ebp等。 
      當系統執行進程調度時會進行進程的上下文保存與恢復,因此,當系統中的進程繁多的情況下,頻繁的上下文切換會消耗CPU時間

    • 進程間通信 
      在同一主機上通過signal、共享空間(shm)、信號量(semophore)實現 
      在不同主機上:rpc(remote procedure call)、socket機制

    • 內存資源 
      Linux系統中的內存采取分頁機制進行管理,頁框用來存儲頁面數據,大小為4k 
      Linux系統中內存回收算法用的是LRU(Least Recently Used) 最近最少使用算法進行輪詢釋放內存的。 
      通常程序執行從邏輯上的“0地址”開始的,所以必須把物理內存地址映射為邏輯地址,由CPU上的內存管理單元(MMU)負責轉換線地址與物理地址的轉換。

    • 進程的類型: 
      守護進程:daemon,在系統引導過程中啟動的進程,和終端無關進程 
      前臺進程:依賴終端,通過終端啟動的進程 
      注意:兩者可相互轉換

    • 進程狀態: 

      02.jpg

    • 進程的分類: 

    • CPU密集型:CPU開銷很高的程序,如高并發的 web服務、圖形圖像處理、科學計算等類型的程序 
      IO密集型:IO相關的程序通常處理大量數據,需要大量內存和存儲,頻繁IO讀寫數據,對CPU要求較小,如數據庫服務、文件服務等 
      交互型、非交互型

【SIGNAL】信號機制

信號(signal)是一種軟中斷,信號機制是進程間通信的一種方式 
數值1~31為不可靠信號也稱為非實時信號,信號可能會丟失, 比如發送多次相同的信號, 進程只能收到一次。

  • man 7 signal

  • kill -l #信號列表 
    1) SIGHUP(HUP): 無須關閉進程而讓其重讀配置文件 
    2) SIGINT(INT): 中止正在運行的進程;相當于Ctrl+c 
    9) SIGKILL(KILL): 殺死正在運行的進程 
    15) SIGTERM(TERM):終止正在運行的進程,kill pid 默認發送的信號,非正常退出 
    18) SIGCONT(CONT):繼續運行 
    19) SIGSTOP(STOP):后臺休眠

nice 、renice進程優先級調整

nice – run a program with modified scheduling priority

  • nice [OPTION] [COMMAND [ARG]…] 

    • -n [+|-]# #執行時設置優先級最大為-20,如果不加-n設置負值為–n

  • renice – alter priority of running processes 

    • top — r — pid — nice值 #同top設置pid的NI值

    • 普通user只能調整進程大于當前nice且為正數的nice值,如用戶自己用renice調整為5,下次調整必須大于5,最大為19,超了還是19。

    • renice [-n] priority [-gpu] identifier…

    • renice [+|-]# pid

    • -g # as GID

    • -u # as usernames or UIDs 

rtprio實時優先級調整

  • chrt #顯示所有選項

[root@cent7]~>chrt

chrt - manipulate real-time attributes of a process

Set policy:
 chrt [options] [-policy] <priority> [-p <pid> | <command> <arg> ...]

Get policy:
 chrt [options] -p <pid>

Scheduling policies:
 -b | --batch         set policy to SCHED_BATCH
 -f | --fifo          set policy to SCHED_FIFO
 -i | --idle          set policy to SCHED_IDLE
 -o | --other         set policy to SCHED_OTHER
 -r | --rr            set policy to SCHED_RR (default)

Scheduling flags:
 -R | --reset-on-fork set SCHED_RESET_ON_FORK for FIFO or RR

Options:
 -a | --all-tasks     operate on all the tasks (threads) for a given pid
 -h | --help          display this help
 -m | --max           show min and max valid priorities
 -p | --pid           operate on existing given pid
 -v | --verbose       display status information
 -V | --version       output version information
  • chrt # comm #以0-99的優先級范圍執行命令,值越大優先級越高

  • chrt -p $$ #顯示當前bash 的調度策略,實時優先級

前、后臺作業管理

  • 前臺作業:通過終端啟動,且啟動后一直占據終端;

  • 后臺作業:可通過終端啟動,但啟動后即轉入后臺運行(釋放終端)

  • 并行任務 

    1. 腳本調用多個腳本,加上&使之在后臺運行 
      parallel.sh 
      a.sh& 
      b.sh& 
      c.sh&

    2. 以子進程方式執行 
      (f1.sh&);(f2.sh&);(f3.sh&)

    3. 無名函數

    4. { f1.sh& f2.sh& f3.sh& }

  • 后臺運行作業 

    • COMMAND & #后臺,Running態

    • Ctrl + z #后臺,Stopped態 
      #執行命令終端退出,進程也將關閉

  • 剝離進程與終端的關系 

    • nohup comm& #如法和screen那樣再切回來

    • screen ;comm #中斷可恢復,常用選項 -S -ls -x -r

  • 管理當前終端的后臺進程(運行、終止態) 

    • jobs -l #作業號,pid,stat,comm

    • jobs #查看所有作業,如果有標準輸出則正常輸出,但是屏蔽了標準輸入 

    • fg[[%]JOB_NUM]:把指定的后臺作業調回前臺;

    • bg[[%]JOB_NUM]:后臺作業在后臺繼續運行;手動調入后臺的進程為Stopped態

    • kill [%JOB_NUM]:終止指定的作業;

    • killall comm #-9強制kill,comm的所有進程都kill

    • pkill -t pts/x #kill終端產生的進程,建議先用ps看看終端或bash產生的進程,以免誤殺其他重要進程

進程管理工具

  • kill [-SIGNAL] pid…

  • killall[-SIGNAL] comm…

  • pkill[options] pattern 
    -SIGNAL 
    -u uid: effective user,生效者 
    -U uid: real user,真正發起運行命令者 
    -t terminal: 與指定終端相關的進程 
    -l: 顯示進程名 
    -a: 顯示完整格式的進程名 
    -P pid: 顯示父進程為此處指定的進程的進程列表

進程查看工具

pgrep

pgrep[options] pattern

  • -u uid: effective user,生效者euser

  • -U uid: real user,真正發起運行命令者ruser

  • -t terminal: 與指定終端相關的進程

  • -l: 顯示進程名

  • -a:顯示進程名和參數

  • -P pid: 顯示指定進程的子進程列表,與pidof的結果互逆

[root@cent7]~>pgrep -t pts/3
2701
3053
3112
[root@cent7]~>pgrep -t pts/3 -l
2701 bash
3053 vim
3112 ping
[root@cent7]~>pgrep -P 2701
3053
3112
[root@cent7]~>pgrep -P 2701 -l
3053 vim
3112 ping
[root@cent7]~>pgrep -P 2701 -a
3053 vim
3112 ping 127.0.0.1

pidof

find the process ID of a running program

  • pidof comm #逆序顯示comm產生的子進程,comm的pid在最后

  • pidof -s comm #顯示上面的第一個pid,即最后一個子進程的pid

pstree

display a tree of processes #打印系統進程調用樹,可以非常清楚地看到當前系統中所有活動進程之間的調用關系

  • -a顯示每個進程的參數或選項,如─ping 127.0.0.1

  • pstree pid #指定pid的進程樹

[root@cent7]~>pstree -a 3160
bash
 └─vim f1.txt
  • pstree #默認從init(pid=1)輸出整個進程樹

init-+-getty
    |-getty
    |-getty
    `-getty

ps

ps [options] #默認顯示當前終端的進程,查看系統中瞬間進程信息,來自/proc下的pid文件

  • UNIX選項:-A -e

  • BSD選項:a f

  • GNU選項:–help

  • [option] 不帶 – 的BSD格式 
    ?a:選項包括所有終端的依賴進程,包括會話發起者 
    ?-a:所有終端的依賴進程,不包括會話發起者 
    ?-e = -A:所有進程=ax 
    ?x:包括所有不鏈接終端的進程 
    ?u:選項顯示進程所有者的信息 
    ?f:顯示進程的父進程,進程樹,pstree更直接 
    l:長格式顯示,最全的輸出 
    ?o:屬性… 選項顯示定制的信息 
    ?pid , comm , %cpu , %mem , state , tty , euser , ruser , nice 
    ?[VSZ]:Virtual memory SiZe,虛擬內存集,線性內存,給每個進程最大3G 
    ?[RSS]:ReSidentSize, 常駐內存集,實際分配的內存 
    ?[STAT]: 進程的狀態,zombie狀態時會造成資源不可回收 

    003.jpg

  • 常用組合:-ef,區別于ef(父子進程關系及參數) 
    -e: 顯示所有進程 
    -f: 顯示完整格式程序信息

    [root@cent7]~>ps -ef
   UID         PID   PPID  C  STIME TTY          TIME CMD
  • 常用組合:-eFH 
    -F: 顯示更完整格式的進程信息 
    -H: 以進程層級格式顯示進程相關信息

    [root@cent7]~>ps -eFH | head -2
   UID         PID   PPID  C    SZ   RSS PSR STIME TTY          TIME CMD

004.jpg

ps通過進程名過濾,顯示效果優于pgrep、pidof

[root@cent7]~>ps -C vim
PID TTY          TIME CMD
3689 pts/0    00:00:00 vim

[root@cent7]~>pgrep -a vim
3689 vim

[root@cent7]~>ps aux | grep [v]im
root       3053  0.0  1.2 152332  6048 pts/3    T    Sep09   0:00 vim

[root@cent7]~>ps aux | grep -v grep | grep vim
root       3053  0.0  1.2 152332  6048 pts/3    T    Sep09   0:00 vim

常用組合:自定義在o之后

  • -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm

  • -axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

性能監控

  • 查看和管理工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill,pkill, job, bg, fg, nohup

性能指標

  • CPU 
    CPU 利用率,如果 CPU 有 100% 利用率,那么應該到達這樣一個平衡:65%-70% User Time,30%-35% System Time,0%-5% Idle Time; 
    上下文切換,上下文切換應該和 CPU 利用率聯系起來看,如果能保持上面的 CPU 利用率平衡,大量的上下文切換是可以接受的; 
    可運行隊列,每個可運行隊列不應該有超過1-3個線程(每處理器),比如:雙處理器系統的可運行隊列里不應該超過6個線程。

  • Memroy 
    內存不足:free memory 急劇減少,回收buffer和cache也無濟于事,大量使用交換分區(swpd),頁面交換(swap)頻繁,讀寫磁盤數量(io)增多,缺頁中斷(in)增多,上下文切換(cs)次數增多,等待IO的進程數(b)增多,大量CPU時間用于等待IO(wa)。

  • SWAP 
    當系統沒有足夠物理內存來應付所有請求的時候就會用到 swap 設備,swap 設備可以是一個文件,也可以是一個磁盤分區。 
    使用 swap 的代價非常大,如果系統沒有物理內存可用,就會頻繁 swapping,如果 swap 設備和程序正要訪問的數據在同一個文件系統上,那會碰到嚴重的 IO 問題,最終導致整個系統遲緩,甚至崩潰。 
    swap 設備和內存之間的 swapping 狀況是判斷 Linux 系統性能的重要參考,我們已經有很多工具可以用來監測 swap 和 swapping 情況,比如:top、cat /proc/meminfo、vmstat 等

  • network 
    網絡的監測是所有 Linux 子系統里面最復雜的,有太多的因素在里面,比如:延遲、阻塞、沖突、丟包等,更糟的是與 Linux 主機相連的路由器、交換機、無線信號都會影響到整體網絡并且很難判斷是因為 Linux 網絡子系統的問題還是別的設備的問題,增加了監測和判斷的復雜度。使用ethtool可以查看網口的信息。

  • IOPS 
    IO 可分為順序 IO 和 隨機 IO 兩種,性能監測前需要弄清楚系統偏向順序 IO 的應用還是隨機 IO 應用。 

    • 順序 IO 是指同時順序請求大量數據,比如數據庫執行大量的查詢、流媒體服務等,順序 IO 可以同時很快的移動大量數據。

    • 隨機 IO 是指隨機請求數據,其 IO 速度不依賴于數據的大小和排列,依賴于磁盤的每秒能 IO 的次數,比如 Web 服務、Mail 服務等每次請求的數據都很小,隨機 IO 每秒同時會有更多的請求數產生,所以磁盤的每秒能 IO 多少次是關鍵。 

top – Linux Process Monitoring

top可以實時監控系統和進程的狀態,相比瞬時的結果可以實時的變化,但是不能清晰顯示數據隨時間變動的情況。相較而言,vmstat和pidstat的輸出不會覆蓋掉之前的結果,因此更適合查看數據隨時間的變動情況。另外,如果你不能及時暫停top的輸出(Ctrl-s 暫停,Ctrl-q 繼續),也許某些關鍵線索會湮滅在新的輸出中。

top - 03:53:00 up 12:56,  4 users,  load average: 0.00, 0.01, 0.05
Tasks: 371 total,   2 running, 368 sleeping,   1 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 s
KiB Mem :   485252 total,    23704 free,   132008 used,   329540 buff/cache
KiB Swap:  2098172 total,  2098172 free,        0 used.   304324 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND  
    4109 root      20   0  146276   2268   1420 R  0.3  0.5   0:00.25 top  
  • CPU欄目信息: 
    us:用戶空間 
    sy:內核空間 
    ni:調整nice時間 
    id:空閑 
    wa:等待IO時間 
    hi:硬中斷 
    si:軟中斷(模式切換) 
    st:虛擬機偷走的時間

  • 進程欄目信息 
    PID (Process Id):任務的進程ID 
    PPID (Parent Process Pid):父任務的進程ID 
    RUSER (Real User Name):任務的所有者真實名稱 
    UID (User Id):任務所有者ID 
    USER (User Name):任務所有者名稱 
    GROUP (Group Name):任務所有者群組名 
    TTY (Controlling Tty):終端 
    PR (Priority):優先級 
    %CPU (CPU usage):CPU使用率 
    %MEM (Memory usage (RES)):內存使用率 
    S (Process Status):進程狀態 
    TIME+ (CPU Time, hundredths):CPU時間,精確到秒

  • 暫停與恢復 
    Ctrl s 
    Ctrl q

  • 常用內置命令 

    • 排序:(shiht + p m t) 
      P:以占據的CPU百分比,%CPU 
      M:占據內存百分比,%MEM 
      T:累積占據CPU時長,TIME+

    • 首部信息開關顯示: 
      uptime信息:l 
      tasks及cpu信息:t 
      cpu切換顯示各核心(默認為總和):1 (數字) 
      memory信息:m

    • 退出命令:q

    • 修改刷新時間間隔:s

    • 終止指定進程:k

    • 保存文件/root/.toprc:W

  • 命令選項 
    -d #: 指定刷新時間間隔,默認為3秒 
    -b: 以批次方式 
    -n #: 顯示多少批次

htop

interactive process viewer,更容易被理解,色彩豐富 
htop 1

  CPU[|                        0.1%]     Tasks: 47, 20 thr; 2 running
 Mem[||||||||||||||||||||219/473MB]     Load average: 0.00 0.01 0.05
 Swp[                     0/2048MB]     Uptime: 13:23:53

   PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
  4223 root       20   0  119M  2080  1428 R  0.1  0.4  0:00.05 htop

F1Help  F2Setup F3SearchF4FilterF5Tree  F6SortByF7Nice -F8Nice +F9Kill  F10Quit
htop 1.0.3 - (C) 2004-2012 Hisham Muhammad
  • 選項: 
    -d #: 指定延遲時間; 
    -u UserName: 僅顯示指定用戶的進程; 
    -s COLUME: 以指定字段進行排序;

  • 內置命令: 
    s: 跟蹤選定進程的系統調用; 
    l: 顯示選定進程打開的文件列表; 
    a:將選定的進程綁定至某指定CPU核心; 
    t: 顯示進程樹 
    F1 – F9:F7和F8改變優先級,F9殺死進程

uptime

這個命令顯示了要運行的任務(進程)數,通過它能夠快速了解系統的平均負載。在 Linux 上,這些數值既包括正在或準備運行在 CPU 上的進程,也包括阻塞在不可中斷 I/O(通常是磁盤 I/O)上的進程。它展示了資源負載(或需求)的大致情況,不過進一步的解讀還有待其它工具的協助。

$ uptime
23:51:26 up 21:31,  1 user,  load average: 30.02, 26.43, 19.02

最右的三個數值分別是1分鐘、5分鐘、15分鐘系統負載的移動平均值。它們共同展現了負載隨時間變動的情況。舉個例子,假設你被要求去檢查一個出了問題的服務器,而它最近1分鐘的負載遠遠低于15分鐘的負載,那么你很可能已經撲了個空。 
在上面的例子中,負載均值最近呈上升態勢,其中1分鐘值高達30,而15分鐘值僅有19。這種現象有許多種解釋,很有可能是對 CPU 的爭用;——vmstat和mpstat——可以幫助我們進一步確定問題所在。

vmstat – Virtual Memory Statistics

Report virtual memory statistics

  • vmstat[options] [delay [count]]

  • 選項: 
    -s: 顯示內存的統計數據

[root@cent7]/home/nethogs>vmstat 1 5
procs ---------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
34  0    0 200889792  73708 591828    0    0     0     5    6   10 96  1  3  0  0
32  0    0 200889920  73708 591860    0    0     0   592 13284 4282 98  1  1  0  0
32  0    0 200890112  73708 591860    0    0     0     0 9501 2154 99  1  0  0  0
  • procs: 
    r:等待運行的進程的個數,和核心數有關 
    b:處于不可中斷睡眠態的進程個數(被阻塞的隊列的長度)

  • memory: 
    swpd: 交換內存的使用總量 
    free:空閑物理內存總量 
    buffer:用于buffer的內存總量 
    cache:用于cache的內存總量

  • swap: 
    si:從磁盤交換進內存的數據速率(kb/s),不為0,性能已經急劇下降 
    so:從內存交換至磁盤的數據速率(kb/s) 
    -io: 
    bi:從塊設備讀入數據到系統的速率(kb/s) 
    bo: 保存數據至塊設備的速率

  • system: 
    in: interrupts, 中斷速率,包括時鐘 
    cs: context switch, 進程切換速率,超過幾十萬次則不正常

  • cpu: 
    us:Timespent running non-kernel code,用戶空間 
    sy: Time spent running kernel code,內核空間 
    id: Time spent idle. 空閑 #Linux 2.5.41前,包括IO-wait time. 
    wa: Time spent waiting for IO.等待IO時間 2.5.41前,包括in idle. 
    st: Time stolen from a virtual machine.虛擬化 2.6.11前, unknown.

  • 總結 
    通過相加 us 和 sy 的百分比,你可以確定 CPU 是否處于忙碌狀態。一個持續不變的 I/O 等待意味著瓶頸在硬盤上,這種情況往往伴隨著 CPU 的空閑,因為任務都卡在磁盤 I/O 上了。你可以把 I/O 等待當作 CPU 空閑的另一種形式,它額外給出了 CPU 空閑的線索。 
    I/O 處理同樣會消耗系統時間。一個高于20%的平均系統時間,往往值得進一步發掘:也許系統花在 I/O 的時間太長了。 
    在上面的例子中,CPU 基本把時間花在用戶態里面,意味著跑在上面的應用占用了大部分時間。此外,CPU 平均使用率在90%之上。這不一定是個問題;檢查下“r”列,看看是否飽和了。

pidstat

類似于top,但數據不會被覆蓋,pidstat的輸出則添加在之前的輸出的后面。這有利于觀察數據隨時間的變動情況,也便于把你看到的內容復制粘貼到調查報告中。

$ pidstat 1
Linux 3.13.0-49-generic (titanclusters-xxxxx)  09/6/2016    _x86_64_    (32 CPU)

09:41:02 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
09:41:03 PM     0      6521 1596.23    1.89    0.00    1.94     1  nginx

07:41:03 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
07:41:04 PM     0      6521 1596.23    1.89    0.00    1.94    15  mesos-slave

上面的例子表明,CPU 主要消耗在兩個 Java 進程上。%CPU列是在各個 CPU 上的使用量的總和;1591%意味著 nginx 進程消耗了將近2個 CPU。

iostat – Input/Output Statistics

監控磁盤的狀況,包括工作負載和處理性能

[root@cent7]~>iostat -xz 1
Linux 3.10.0-327.el7.x86_64 (cent7)     09/10/2016  _x86_64_    (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          0.17    0.00    0.91    0.01    0.00   98.91
          Device:   rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda        0.00     0.23    0.21    0.18     4.52     2.08    34.37     0.00    9.98   13.80    5.42   2.44   0.09

r/s,w/s,rkB/s,wkB/s:分別表示每秒設備讀次數,寫次數,讀的 KB 數,寫的 KB 數。它們描述了磁盤的工作負載。也許性能問題就是由過高的負載所造成的。 
await:I/O 平均時間,以毫秒作單位。它是應用中 I/O 處理所實際消耗的時間,因為其中既包括排隊用時也包括處理用時。如果它比預期的大,就意味著設備飽和了,或者設備出了問題。 
avgqu-sz:分配給設備的平均請求數。大于1表示設備已經飽和了。(不過有些設備可以并行處理請求,比如由多個磁盤組成的虛擬設備) 
%util:設備使用率。這個值顯示了設備每秒內工作時間的百分比,一般都處于高位。低于60%通常是低性能的表現(也可以從 await 中看出),不過這個得看設備的類型。接近100%通常意味著飽和。 
如果某個存儲設備是由多個物理磁盤組成的邏輯磁盤設備,100%的使用率可能只是意味著 I/O 占用。 
磁盤 I/O 性能低不一定是個問題。應用的 I/O 往往是異步的(比如預讀read-ahead和寫緩沖buffering for writes),所以不一定會被阻塞并遭受延遲。

free

顯示Mem和Swap的使用情況,還可以顯示被buffer和cache的內存。

$ free -m
        total       used       free     shared    buffers     cached
Mem:        245998      24545     221453         83         59        541
-/+ buffers/cache:      23944     222053
Swap:            0          0          0

buffers:用于塊設備 I/O 的緩沖區緩存 
cached:用于文件系統的頁緩存 
-buffers/cache反映的是被程序占用的內存,而+buffers/cache反映的是可以挪用的內存。這兩個值接近0時往往導致較高的磁盤I/O(iostat 1) 
CentOS6中total=used+free,used – buffers – cached,free + buffers + cached

dstat

統計系統資源,顯示cpu使用情況,磁盤io 情況,網絡發包情況和換頁情況 
iostat和vmstat 的輸出雖然詳細,但是不夠直觀,不如dstat 好用,且dstat具有色彩,顯示更直觀,dstat綜合了 vmstat, iostat, ifstat, netstat 等多個信息

  • dstat[-afv] [options..] [delay [count]] 
    -c: 顯示cpu相關信息 
    -C #,#,…,total 
    -d: 顯示disk相關信息 
    -D total,sda,sdb,… 
    -l:平均負載 
    -g:顯示page相關統計數據 
    -m:顯示memory相關統計數據 
    -n:顯示network相關統計數據 
    -p:顯示process相關統計數據 
    -r:顯示io請求相關的統計數據 
    -s:顯示swapped相關的統計數據 
    -y:系統system相關的統計數據

  • dstat -lcdmnprgsy

[root@cent7]/home/nethogs>dstat 
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw
 0   0  99   0   0   0|1491k 1195B|   0     0 |   2B    9B|  31    27
  • –tcp 
    –udp 
    –unix 
    –raw 
    –socket 
    –ipc 
    –top-cpu:顯示最占用CPU的進程 
    –top-io: 顯示最占用io的進程 
    –top-mem: 顯示最占用內存的進程 
    –top-latency: 顯示延遲最大的進程

[root@cent7]~>dstat --tcp --udp --top-io
----tcp-sockets---- --udp-- ----most-expensive----
lis act syn tim clo|lis act|     i/o process      
 5   4   0   0   0|  2   0|bash       2337k 2328k
 5   4   0   0   0|  2   0|sshd: root@ 466B  516B

glances

  • A cross-platform curses-based monitoring tool 
    glance是一款Python語言開發的系統監控工具,能夠監視CPU、負載、內存、磁盤I/O、網絡流量、文件系統、系統溫度等信息。 

    • 功能 
      CPU 使用率 
      內存使用情況 
      內核統計信息和運行隊列信息 
      磁盤 I/O 速度、傳輸和讀/寫比率 
      文件系統中的可用空間 
      磁盤適配器 
      網絡 I/O 速度、傳輸和讀/寫比率 
      頁面空間和頁面速度 
      消耗資源最多的進程 
      計算機信息和系統資源

    • glance實時顯示系統信息,占用CPU資源通常低于2%,默認刷新間隔2秒,可輸出.csv或.html格式報表

    • 常用選項 
      -b: 以Byte為單位顯示網卡數據速率 
      -d: 關閉磁盤I/O模塊 
      -f /path/to/somefile: 設定輸入文件位置 
      -o {HTML|CSV}:輸出格式 
      -m: 禁用mount模塊 
      -n: 禁用網絡模塊 
      -t #: 延遲時間間隔 
      -1:每個CPU的相關數據單獨顯示

    • 工作界面

cent6 (CentOS 6.8 64bit / Linux 2.6.32-642.el6.x86_64)     Uptime: 3:35:25

CPU       3.2%   Load   1-core   Mem    49.2%  active:   53.9M   Swap    1.1%
user:     1.3%   1 min:   0.00   total:  475M  inactive:  163M   total: 1024M
system:   1.9%   5 min:   0.01   used:   233M  buffers:  8.40M   used:  11.4M
idle:    96.8%   15 min:  0.05   free:   241M  cached:    110M   free:  1013M

Network    Rx/s    Tx/s   Tasks  135 (221 thr),  1 run, 134 slp,  0 oth
bond0       6Kb     2Kb
eth0        3Kb      0b    VIRT   RES  CPU%  MEM% NAME
eth1        3Kb     2Kb    205M   12M   2.9   2.4 glances
lo           0b      0b     19M    1M   0.0   0.3 /sbin/init
                             0     0   0.0   0.0 kthreadd
Disk I/O   In/s   Out/s       0     0   0.0   0.0 migration/0
sda1          0       0       0     0   0.0   0.0 ksoftirqd/0
sda2          0       0       0     0   0.0   0.0 stopper/0
sda3          0       0       0     0   0.0   0.0 watchdog/0
                             0     0   0.0   0.0 events/0
Mount      Used   Total       0     0   0.0   0.0 events/0
/         3.35G   11.5G       0     0   0.0   0.0 events_long/0
/boot     33.3M    141M       0     0   0.0   0.0 cgroup

Press 'h' for help
  • 參數說明 
    VIRT: 虛擬內存大小 
    RES: 進程占用的物理內存值 
    %CPU:該進程占用的 CPU 使用率 
    %MEM:該進程占用的物理內存和總內存的百分比 
    PID: 進程 ID 號 
    USER: 進程所有者的用戶名 
    TIME+: 該進程啟動后占用的總的 CPU 時間 
    IO_R 和 IO_W: 進程的讀寫 I/O 速率 
    NAME: 進程名稱 
    NI: 進程優先級 
    S: 進程狀態,其中 S 表示休眠,R 表示正在運行,Z 表示僵死狀態。

  • 快捷鍵 
    h : 顯示幫助信息 
    q : 離開程序退出 
    c :按照 CPU 實時負載對系統進程進行排序 
    m :按照內存使用狀況對系統進程排序 
    i:按照 I/O 使用狀況對系統進程排序 
    p: 按照進程名稱排序 
    d : 顯示磁盤讀寫狀況 
    w : 刪除日志文件 
    l :顯示日志 
    s: 顯示傳感器信息 
    f : 顯示系統信息 
    1 :輪流顯示每個 CPU 內核的使用情況(次選項僅僅使用在多核 CPU 系統)

  • 服務器 / 客戶端工作方式 
    Server端:

glances -s -B IPADDR    #本機ip

Client端:

glances -c IPADDR  #服務端ip

總結

理解所有的 linux 性能分析工具并做出理性的選擇是一個浩大的工程,這是一個很好的例程: 


總結.jpg

原創文章,作者:helloc,如若轉載,請注明出處:http://www.www58058.com/45404

(0)
hellochelloc
上一篇 2016-09-11
下一篇 2016-09-11

相關推薦

  • ftp服務器介紹與配置

    一、 ftp服務,File Transfer Protocal 文件傳輸協議      1. ftp基于tcp協議,C/S架構          Server: wu-ftpd, proftpd ,pureftp,vsf…

    Linux干貨 2015-06-21
  • nfs與samba實現文件共享服務的流程

    nfs與samba實現文件共享服務的流程     nfs與samba都是能夠實現文件共享的服務應用,其用法大致相同,但是掛載選項與配置文件的設置機制不同,下面介紹這兩種文件共享服務的內容。     一.nfs服務的安裝與配置     服務端主機的配置:   &…

    Linux干貨 2016-10-23
  • N25第五周 grep 和find 命令使用示例

    1、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行;    [root@localhost grub]# grep "^[[:space:]]\+.*" grub.conf    root (hd0,0)…

    Linux干貨 2016-12-25
  • 【社招】【小米-北京】linux內核工程師

    【社招】【小米-北京】內核工程師 【工作地點】北京市海淀區安寧莊東路72號科利源大廈 【薪酬福利】20k-40k 期權獎勵、六險一金、水果花茶、班車、健身房、食堂 【投遞方式】郵件主題“崗位+姓名”發送至lipengcheng3@xiaomi.com   崗位職責: 1.      負責內…

    Linux干貨 2017-07-28
  • blog test

    just test

    Linux干貨 2017-02-28
  • rsync+inotify 實現數據實時同步

        Rsync (Rmote sync)是一款非常好的數據同步工具,能夠通過對比同步雙方的數據變動,實現增量同步,還可以通過LAN/WAN實現遠程多臺主機間文件的同步,還能結合crond任務計劃來執行自動備份,又可以結合ssh實現遠程數據備份的安全,種種特性使他看起來相當優秀。但如果需備份數據十分龐大時,它的不足之處就顯現出來了,比如…

    Linux干貨 2015-07-24
欧美性久久久久