OS 內存泄漏 致使 整個aix主機block Linux IO實時監控iostat命令詳解

問題 aix 主機html

1.數據庫主機使用vmstat 監控,隔幾分鐘 就是block 爆滿。 java

cpu 沒有瓶頸,I/O 顯示本地磁盤hdisk0和hdisk 1 是爆滿。 vmstat 同時顯示大量page-in and page-out. 以及wait io 很是高node

 查看swap 區:python

lsps -alinux

 

2.經過topas 進程監控,沒有發現異常進程。消耗 IO 資源的進程方法,能夠考慮使用以下命令 :ios

2.1 若是要抓取實時I/O ,的詳細信息,能夠用filemon命令進行數據抓取。nginx

root用戶執行以下命令:
filemon -O all -o filemon.out;
sleep 30;
trcstopgit

(https://wenku.baidu.com/view/87eefe0728ea81c759f57839.html)
這些命令會在當前目錄下生成filemon.out文件,可使用VI 查看結果github

 

2.2  消耗memory 的的進程,可使用topas 查看 ,右下角的page 進程的使用狀況。web

 

 

3.手工檢查哪一個進程最消耗mem資源

ps -elf > /tmp/dba/1.txt
sort -n -k 10 /tmp/dba/1.txt | more

find /   -mmin -60 |more 

發現osysmond 進程佔用了6831416 (K)的資源。懷疑遇到11.2.o.4 的osysmond  bug .

 

5,數據庫方面,sql 監控資源使用狀況: 未發現異常 (

http://blog.itpub.net/22198259/viewspace-659646/   )

 

監控數據庫會話使用內存的腳本,來自Oralce:
REM =============================================================================
REM ************ SCRIPT. TO MONITOR MEMORY USAGE BY DATABASE SESSIONS ************
REM =============================================================================
REM Created: 21/march/2003
REM Last update: 28/may/2003
REM
REM NAME
REM ====
REM MEMORY.sql
REM
REM AUTHOR
REM ======
REM Mauricio Buissa
REM
REM DISCLAIMER
REM ==========
REM This script. is provided for educational purposes only. It is NOT supported by
REM Oracle World Wide Technical Support. The script. has been tested and appears
REM to work as intended. However, you should always test any script. before
REM relying on it.
REM
REM PURPOSE
REM =======
REM Retrieves PGA and UGA statistics for users and background processes sessions.
REM
REM EXECUTION ENVIRONMENT
REM =====================
REM SQL*Plus
REM
REM ACCESS PRIVILEGES
REM =================
REM Select on V$SESSTAT, V$SESSION, V$BGPROCESS, V$PROCESS and V$INSTANCE.
REM
REM USAGE
REM =====
REM $ sqlplus "/ as sysdba" @MEMORY
REM
REM INSTRUCTIONS
REM ============
REM Call MEMORY.sql from SQL*Plus, connected as any DBA user.
REM Press whenever you want to refresh information.
REM You can change the ordered column and the statistics shown by choosing from the menu.
REM Spool files named MEMORY_YYYYMMDD_HH24MISS.lst will be generated in the current directory.
REM Every time you refresh screen, a new spool file is created, with a snapshot of the statistics shown.
REM These snapshot files may be uploaded to Oracle Support Services for future reference, if needed.
REM
REM REFERENCES
REM ==========
REM "Oracle Reference" - Online Documentation
REM
REM SAMPLE OUTPUT
REM =============
REM :::::::::::::::::::::::::::::::::: PROGRAM GLOBAL AREA statistics :::::::::::::::::::::::::::::::::
REM
REM SESSION                                            PID/THREAD       CURRENT SIZE       MAXIMUM SIZE
REM -------------------------------------------------- ---------- ------------------ ------------------
REM     9 - SYS: myworkstation                               2258           10.59 MB           10.59 MB
REM     3 - LGWR: testserver                                 2246            5.71 MB            5.71 MB
REM     2 - DBW0: testserver                                 2244            2.67 MB            2.67 MB
REM ...
REM
REM :::::::::::::::::::::::::::::::::::: USER GLOBAL AREA statistics ::::::::::::::::::::::::::::::::::
REM
REM SESSION                                            PID/THREAD       CURRENT SIZE       MAXIMUM SIZE
REM -------------------------------------------------- ---------- ------------------ ------------------
REM     9 - SYS: myworkstation                               2258            0.29 MB            0.30 MB
REM     5 - SMON: testserver                                 2250            0.06 MB            0.06 MB
REM     4 - CKPT: testserver                                 2248            0.05 MB            0.05 MB
REM ...
REM
REM SCRIPT. BODY
REM ===========

REM Starting script. execution
CLE SCR
PROMPT .
PROMPT .              ======== SCRIPT. TO MONITOR MEMORY USAGE BY DATABASE SESSIONS ========
PROMPT .

REM Setting environment variables
SET LINESIZE       200
SET PAGESIZE       500
SET FEEDBACK       OFF
SET VERIFY         OFF
SET SERVEROUTPUT   ON
SET TRIMSPOOL      ON
COL "SESSION"      FORMAT A50
COL "PID/THREAD"   FORMAT A10
COL "      CURRENT SIZE" FORMAT A18
COL "      MAXIMUM SIZE" FORMAT A18

REM Setting user variables values
SET    TERMOUT OFF
DEFINE sort_order = 3
DEFINE show_pga   = 'ON'
DEFINE show_uga   = 'ON'
COL    sort_column NEW_VALUE sort_order
COL    pga_column  NEW_VALUE show_pga
COL    uga_column  NEW_VALUE show_uga
COL    snap_column NEW_VALUE snap_time
SELECT nvl(:sort_choice, 3) "SORT_COLUMN"
FROM   dual
/
SELECT nvl(:pga_choice, 'ON') "PGA_COLUMN"
FROM   dual
/
SELECT nvl(:uga_choice, 'ON') "UGA_COLUMN"
FROM   dual
/
SELECT to_char(sysdate, 'YYYYMMDD_HH24MISS') "SNAP_COLUMN"
FROM   dual
/

REM Creating new snapshot spool file
SPOOL MEMORY_&snap_time

REM Showing PGA statistics for each session and background process
SET      TERMOUT &show_pga
PROMPT
PROMPT   :::::::::::::::::::::::::::::::::: PROGRAM GLOBAL AREA statistics :::::::::::::::::::::::::::::::::
SELECT   to_char(ssn.sid, '9999') || ' - ' || nvl(ssn.username, nvl(bgp.name, 'background')) ||
                  nvl(lower(ssn.machine), ins.host_name) "SESSION",
             to_char(prc.spid, '999999999') "PID/THREAD",
             to_char((se1.value/1024)/1024, '999G999G990D00') || ' MB' "      CURRENT SIZE",
             to_char((se2.value/1024)/1024, '999G999G990D00') || ' MB' "      MAXIMUM SIZE"
    FROM     v$sesstat se1, v$sesstat se2, v$session ssn, v$bgprocess bgp, v$process prc,
          v$instance ins,  v$statname stat1, v$statname stat2
WHERE    se1.statistic# = stat1.statistic# and stat1.name = 'session pga memory'
AND      se2.statistic#  = stat2.statistic# and stat2.name = 'session pga memory max'
AND      se1.sid        = ssn.sid
AND      se2.sid        = ssn.sid
AND      ssn.paddr      = bgp.paddr (+)
AND      ssn.paddr      = prc.addr  (+)
ORDER BY &sort_order DESC
/

REM Showing UGA statistics for each session and background process
SET      TERMOUT &show_uga
PROMPT
PROMPT   :::::::::::::::::::::::::::::::::::: USER GLOBAL AREA statistics ::::::::::::::::::::::::::::::::::
SELECT   to_char(ssn.sid, '9999') || ' - ' || nvl(ssn.username, nvl(bgp.name, 'background')) ||
                  nvl(lower(ssn.machine), ins.host_name) "SESSION",
             to_char(prc.spid, '999999999') "PID/THREAD",
             to_char((se1.value/1024)/1024, '999G999G990D00') || ' MB' "      CURRENT SIZE",
             to_char((se2.value/1024)/1024, '999G999G990D00') || ' MB' "      MAXIMUM SIZE"
    FROM     v$sesstat se1, v$sesstat se2, v$session ssn, v$bgprocess bgp, v$process prc,
          v$instance ins,  v$statname stat1, v$statname stat2
WHERE    se1.statistic# = stat1.statistic# and stat1.name = 'session uga memory'
AND      se2.statistic#  = stat2.statistic# and stat2.name = 'session uga memory max'
AND      se1.sid        = ssn.sid
AND      se2.sid        = ssn.sid
AND      ssn.paddr      = bgp.paddr (+)
AND      ssn.paddr      = prc.addr  (+)
ORDER BY &sort_order DESC
/

REM Showing sort information
SET TERMOUT ON
PROMPT
BEGIN
    IF (&sort_order = 1) THEN
        dbms_output.put_line('Ordered by SESSION');
    ELSIF (&sort_order = 2) THEN
        dbms_output.put_line('Ordered by PID/THREAD');
    ELSIF (&sort_order = 3) THEN
        dbms_output.put_line('Ordered by CURRENT SIZE');
    ELSIF (&sort_order = 4) THEN
        dbms_output.put_line('Ordered by MAXIMUM SIZE');
    END IF;
END;
/

REM Closing current snapshot spool file
SPOOL OFF

REM Showing the menu and getting sort order and information viewing choice
PROMPT
PROMPT Choose the column you want to sort:        == R ==        You can choose which information to see:  
PROMPT ... 1. Order by SESSION                                    ... 5. PGA and UGA statistics (default)
PROMPT ... 2. Order by PID/THREAD                                 ... 6. PGA statistics only
PROMPT ... 3. Order by CURRENT SIZE (default)                     ... 7. UGA statistics only
PROMPT ... 4. Order by MAXIMUM SIZE
PROMPT
ACCEPT choice NUMBER PROMPT 'Enter the number of your choice or press to refresh information: '
VAR    sort_choice NUMBER
VAR    pga_choice  CHAR(3)
VAR    uga_choice  CHAR(3)
BEGIN
    IF (&choice = 1 OR &choice = 2 OR &choice = 3 OR &choice = 4) THEN
        :sort_choice := &choice;
        :pga_choice  := '&show_pga';
        :uga_choice  := '&show_uga';
    ELSIF (&choice = 5) THEN
        :sort_choice := &sort_order;
        :pga_choice  := 'ON';
        :uga_choice  := 'ON';
    ELSIF (&choice = 6) THEN
        :sort_choice := &sort_order;
        :pga_choice  := 'ON';
        :uga_choice  := 'OFF';
    ELSIF (&choice = 7) THEN
        :sort_choice := &sort_order;
        :pga_choice  := 'OFF';
        :uga_choice  := 'ON';
    ELSE
        :sort_choice := &sort_order;
        :pga_choice  := '&show_pga';
        :uga_choice  := '&show_uga';
    END IF;
END;
/

REM Finishing script. execution
PROMPT Type "@MEMORY" and press 
SET FEEDBACK     ON
SET VERIFY       ON
SET SERVEROUTPUT OFF
SET TRIMSPOOL    OFF

REM =============
REM END OF SCRIPT
REM =============

 

 

 

4.建議重啓crs .

 使用truss -p pid 對進程作debug.

(參考http://blog.chinaunix.net/uid-22340094-id-32791.html)

 

5.後記 持續檢查該進程 

根據文檔

How To Troubleshoot Memory Leaks on UNIX (Doc ID 477522.1)

 

以下腳本放在crontab.

#! /usr/bin/ksh
##the script is used for monitor the pid memory growth
pid=`ps -ef|grep osysmond |grep -v grep |awk '{print $2}'`
var=`date|cut -d' ' -f4`
echo "$var :\c" >> /tmp/nmonsh/ps.log.$pid
ps -efo "pid,vsz,user,cpu,thcount,comm"|grep $pid|grep -v grep >> /tmp/nmonsh/ps.log.$pid
sleep 30

 

 

 懷疑:

Cluster Health Monitor (CHM/OS) osysmond.bin High Resource (CPU, Memory and FD etc) Usage (文檔 ID 1554116.1)

Bug 16901346 - osysmond.bin high CPU with on systems with high open files (6000多個fd)

ocludump node view shows: Too many open FDs (100090)on node racnode1 (> 90% of max allowed)

#cpus: 16 cpu: 45.93 cpuq: 40 physmemfree: 10178944 physmemtotal: 50331648 mcache: 4781768 

swapfree: 8242176 swaptotal: 8388608 ior: 6234 iow: 2624 ios: 353 swpin: 0 swpout: 0 pgin: 0 pgout: 0 
netr: 12450.397 netw: 11801.061 procs: 2134 rtprocs: 1346 
#fds: 100036;';3:Time=07-08-13 15.44.25, Too many open FDs (100036)on node racnode1 (> 90% of max allowed)' 
#sysfdlimit: 65534 #disks: 43 #nics: 4 nicErrors: 0 

Fixed in 11.2.0.4 GI PSU4, 12.1.0.2.

 

4.

 

方案1: 關閉以及開啓CHM(使用grid在每一個節點執行), 關掉CHM 對當前grid 沒有影響。即便關閉CHM,對當前系統也沒有影響

 

Cluster Health Monitor(如下簡稱CHM)是一個Oracle提供的工具,用來自動收集操做系統的資源(CPU、內存、SWAP、進程、I/O以及網絡等)的使用狀況。

 

禁用與啓用CHM(相似chkconfig)

使用root用戶

#禁用

crsctl modify resource ora.crf -attr "AUTO_START=never" -init

#啓用

crsctl modify resource ora.crf -attr "AUTO_START=always" -init

 

方案2.保持觀察,若是是CHM的bug ,能夠在問題發生時候,手工停下CHM,釋放資源。

 

這個關閉相似Linux的service stop,重啓後還會自動打開,關閉後系統IO會有所降低

#關閉

crsctl stop res ora.crf -init

#啓動

crsctl start res ora.crf -init

 

 

 

###########HP UNIX 內存管理機制稍微不同

 

1. HP UNIX 是先用swap 空間 produce 一個 processs. vmstat 顯示的內存段是 使用swap 的 空間的,不是物理內存 

 因此說hp unix 不用擔憂 page-in, 而要擔憂 page-out.


2. PAGE OUT 只在PAGE STEALER 偷頁 並被標記爲」贓」頁時才發生,並且只在缺乏內存時.所以PAGE OUT的特色能夠是系統內存緊張的一個標誌. VMSTAT 命令頗有限由於它只是報告虛存PAGE SPACE有關的東西而不是文件系統空間的頁出或入.

 3.

hp-unix 不用擔憂 page-in, 而要擔憂 page-out.

 

ii. page.pi 表明從磁盤swap區去寫入內存的page 數目

iii. page.po 表明從內存區寫入swap磁盤Page數目。

                         

若是有大量的寫入swap區的的操做,說明有內存存在異常。可是這個庫當時應該內存壓力不大。

   # swapinfo -m

 

 It is normal for page.pi to be non-zero. This indicates that new 
   processes are being created. 
   Any non-zero value for page.po indicates paging out, and is undesirable.

 

3. HP-UX Paging Strategy

When a process is first created, HP-UX will first check to see if it is able 
to reserve swap space, should it become neccessary to page out the process. 
If it can, then swapinfo will show USED increase for TYPE=reserve, and the 
process will be spawned.

From the swapinfo output above, when paging starts, HP-UX will page out to
the dev swap area /dev/vg00/lvol2.

c. Is the machine swapping at the moment? How much free memory is there?

   vmstat can be used to determine if the machine is currently swapping, and
   also how much free memory is available. For example,

    # vmstat 5 5
         procs           memory                   page
    faults       cpu
    r     b     w      avm    free   re   at    pi   po    fr   de  sr   in
    sy    cs  us sy id
    2     0     0    19276    1874    4    5     1    0     0    0   1  214
 16211   116  17 18 65

   The information of note here is:
   i. memory.free indicates the amount of free memory in pages (page 單位是 使用 su - root  and dmesg |grep phy)
  ii. page.pi indicates the number of pages moving from disk to memory
 iii. page.po indicates the number of pages moving from memory to disk

   It is normal for page.pi to be non-zero. This indicates that new 
   processes are being created. 
   Any non-zero value for page.po indicates paging out, and is undesirable.

   An alternative method to ascertain the amount of free memory is to 
   execute top.

d. How much swap space is configured/used?
   
   Use swapinfo. For example, 
 
   # swapinfo -m
              Mb      Mb      Mb   PCT  START/      Mb
   TYPE    AVAIL    USED    FREE  USED   LIMIT RESERVE  PRI  NAME
   dev       512     154     358   30%       0       -    1  /dev/vg00/lvol2
   reserve     -     194    -194
   memory    187      60     127   32%

   The information of note here is:
   i. A swap area of TYPE=dev gives the NAME of the area of disk used for 
      paging. /etc/fstab will show NAME as a swap device.
  ii. a swap area of TYPE=reserve indicates the amount of swap space
      that would be required if HP-UX needed to page out all in-memory 
      pages for all processes that are currently running
 iii. a swap area of TYPE=memory only appears if 'memory paging' is enabled,
      by setting the configurable kernel parameter swapmem_on to 1 (on). 
      This default value for this parameter is 1.
      'memory paging' is also known as 'pseudo-swap'.
      If present, the AVAIL figure is (total memory - memory used after 
      bootup).
      This swap area is not actually used by HP-UX for paging (since it 
      does  not make sense to page from memory, and then back into memory).

   The different TYPEs of swap areas are discussed further below.
  
3. HP-UX Paging Strategy

When a process is first created, HP-UX will first check to see if it is able 
to reserve swap space, should it become neccessary to page out the process. 
If it can, then swapinfo will show USED increase for TYPE=reserve, and the 
process will be spawned.

From the swapinfo output above, when paging starts, HP-UX will page out to
the dev swap area /dev/vg00/lvol2.

The total USED value for dev+reserved cannot exceed the total AVAIL for dev 
(AVAIL for reserve=0). If HP-UX receives a request that would cause this to 
happen, then the memory paging will be used, if enabled. 

If memory paging is not enabled, then the request for paging is denied.

To explain this further, consider the case where a node has 2GB of memory, 
but only 1GB of configured swap space. If memory paging is not enabled, 
after some time, swapinfo could show:

   # swapinfo -m
             Mb      Mb      Mb   PCT  START/      Mb
   TYPE   AVAIL    USED    FREE  USED   LIMIT RESERVE  PRI  NAME
   dev       512    0       512    0%       0       -    1  /dev/vg00/lvol1
   dev       512    0       512    0%       0       -    1  /dev/vg00/lvol2
   reserve    -     984    -984

This shows that all of the device swap space is unused. Further, vmstat would
show that the system is currently not swaping. Also, the reserve line shows
that the system has reserved close to 1GB of swap space. When an application
attempts to start a new process, it is likely to fail with unix error ENOMEM
(error 12 - not enough memory), even though vmstat or top would show that 
there is around 1GB of available memory.
This is because the system would not be able to reserve paging space, since 
doing so would mean that the total USED would be greater than total AVAIL.
If memory paging had been enabled, then the system would reserved space 'in
memory' and the process would have started successfully.
Since it is does not make sense to actually page to and from memory, memory 
paging is really an 'accounting trick' to let HP-UX start processes when the 
total configured swap is less than the amount of physical memory.

Athough memory paging is enable it may not be fully used. If that happens
HP-UX will return ENOMEM.

 

 

#########  linux

在系統維護的過程當中,隨時可能有須要查看 CPU 使用率內存使用狀況的須要,尤爲是涉及到JVM,程序調優的狀況,並根據相應信息分析系統情況的須要。

top命令

top命令是Linux下經常使用的性能分析工具,可以實時顯示系統中各個進程的資源佔用情況,相似於Windows的任務管理器。運行 top 命令後,CPU 使用狀態會以全屏的方式顯示,而且會處在對話的模式 -- 用基於 top 的命令,能夠控制顯示方式等等。退出 top 的命令爲 q (在 top 運行中敲 q 鍵一次)。

能夠直接使用top命令後,查看%MEM的內容。能夠選擇按進程查看或者按用戶查看,如想查看oracle用戶的進程內存使用狀況的話可使用top -u oracle,如下爲在CentOS中top命令的截圖:


內容解釋:

第一行(top):

15:59:14 系統當前時刻

167 days 系統啓動後到如今的運做時間

1 user 當前登陸到系統的用戶,更確切的說是登陸到用戶的終端數 -- 同一個用戶同一時間對系統多個終端的鏈接將被視爲多個用戶鏈接到系統,這裏的用戶數也將表現爲終端的數目

load average 當前系統負載的平均值,後面的三個值分別爲1分鐘前、5分鐘前、15分鐘前進程的平均數,通常的能夠認爲這個數值超過 CPU 數目時,CPU 將比較吃力的負載當前系統所包含的進程

第二行(Tasks):

75 total 當前系統進程總數

1 running 當前運行中的進程數

74 sleeping 當前處於等待狀態中的進程數

0 stoped 被中止的系統進程數

0 zombie 殭屍進程數

第三行(Cpus):

0.0% us 用戶空間佔用CPU百分比
0.3% sy 內核空間佔用CPU百分比
0.0% ni 用戶進程空間內改變過優先級的進程佔用CPU百分比
99.7% id 空閒CPU百分比
0.0% wa 等待輸入輸出的CPU時間百分比
0.0% hi
0.0% si

0.0% st

第四行(Mem):

1018600k total 物理內存總量
798356k used 使用的物理內存總量
220244k free 空閒內存總量
180628k buffers 用做內核緩存的內存量
Swap: 192772k total 交換區總量
0k used 使用的交換區總量
192772k free 空閒交換區總量
123988k cached 緩衝的交換區總量

    

第五行(Swap):

表示類別同第四行(Mem),但此處反映着交換分區(Swap)的使用狀況。一般,交換分區(Swap)被頻繁使用的狀況,將被視做物理內存不足而形成的。

0k total 交換區總量
0k used 使用的交換區總量
0k free 空閒交換區總量
420732k cached 緩衝的交換區總量

最下部分的進程列表欄:

以 PID 區分的進程列表將根據所設定的畫面更新時間按期的更新。經過 top 內部命令能夠控制此處的顯示方式:

PID:進程的ID
USER:進程全部者
PR:進程的優先級別,越小越優先被執行
NInice:值
VIRT:進程佔用的虛擬內存
RES:進程佔用的物理內存
SHR:進程使用的共享內存
S:進程的狀態。S表示休眠,R表示正在運行,Z表示僵死狀態,N表示該進程優先值爲負數
%CPU:進程佔用CPU的使用率
%MEM:進程使用的物理內存和總內存的百分比
TIME+:該進程啓動後佔用的總的CPU時間,即佔用CPU使用時間的累加值。
COMMAND:進程啓動命令名稱

 

top 運行中能夠經過 top 的內部命令對進程的顯示方式進行控制。內部命令以下表:

  s- 改變畫面更新頻率

  l - 關閉或開啓第一部分第一行 top 信息的表示

  t - 關閉或開啓第一部分第二行 Tasks 和第三行 Cpus 信息的表示

  m - 關閉或開啓第一部分第四行 Mem 和 第五行 Swap 信息的表示

  N - 以 PID 的大小的順序排列表示進程列表(第三部分後述)

  P - 以 CPU 佔用率大小的順序排列進程列表 (第三部分後述)

  M - 之內存佔用率大小的順序排列進程列表 (第三部分後述)

  h - 顯示幫助

  n - 設置在進程列表所顯示進程的數量

  q - 退出 top

  s -改變畫面更新週期

 

 sar命令

sar命令也是Linux系統中重要的性能監測工具之一,它能夠週期性地對內存和CPU使用狀況進行採樣。

基本語法以下:

sar [options]  [-A]  [-o file] t [n]

在命令行中,n 和t 兩個參數組合起來定義採樣間隔和次數,t爲採樣間隔,是必須有
的參數,n爲採樣次數,是可選的,默認值是1,-o file表示將命令結果以二進制格式
存放在文件中,file 在此處不是關鍵字,是文件名。options 爲命令行選項,sar命令
的 選項不少,下面只列出經常使用選項:
-A:全部報告的總和
-u:CPU利用率
-v:進程、I節點、文件和鎖表狀態
-d:硬盤使用報告
-r:沒有使用的內存頁面和硬盤塊
-g:串口I/O的狀況
-b:緩衝區使用狀況
-a:文件讀寫狀況
-c:系統調用狀況
-R:進程的活動狀況
-y:終端設備活動狀況
-w:系統交換活動

例一:

獲取I/O信息,每秒鐘採樣一次,共計採樣3次:

例二:使用命行sar -v t n

例如,每30秒採樣一次,連續採樣5次,觀察覈心 表的狀態,需鍵入以下命令:

# sar -v 30 5

屏幕顯示: 
     

[java]  view plain  copy
 
  1.  SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001   
  2.        10:33:23 proc-sz ov inod-sz ov file-sz ov lock-sz   (-v)   
  3. 10:33:53 305/ 321  0 1337/2764  0 1561/1706 0 40/ 128   
  4. 10:34:23 308/ 321  0 1340/2764  0 1587/1706 0 37/ 128   
  5. 10:34:53 305/ 321  0 1332/2764  0 1565/1706 0 36/ 128   
  6. 10:35:23 308/ 321  0 1338/2764  0 1592/1706 0 37/ 128   
  7. 10:35:53 308/ 321  0 1335/2764  0 1591/1706 0 37/ 128   

顯示內容包括:

proc-sz:目前核心中正在使用或分配的進程表的表 項數,由核心參數MAX-PROC控制。

inod-sz:目前核心中正在使用或分配的i節點表的表項數,由核心參數 MAX- INODE控制。

file-sz: 目前核心中正在使用或分配的文件表的表項數,由核心參數MAX-FILE控 制。

ov:溢出出現的次數。

Lock-sz:目前核心中正在使用或分配的記錄加鎖的表項數,由核心參數MAX-FLCKRE控 制。

顯示格式爲

實際使用表項/可使用的表項數顯示內容表示,核心使用徹底正常,三個表沒有出現 溢出現象,核心參數不需調整,若是出現溢出時,要調整相應的核心參數,將對應的表項數加大。

例三:使用命行sar -d t n 
例如,每30秒採樣一次,連續採樣5次,報告設備使用狀況,需鍵入以下命令: 
# sar -d 30 5 
屏幕顯示:

[java]  view plain  copy
 
  1.  SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001   
  2. 11:06:43 device %busy   avque   r+w/s  blks/s  avwait avserv (-d)   
  3. 11:07:13 wd-0   1.47   2.75   4.67   14.73   5.50 3.14   
  4. 11:07:43 wd-0   0.43   18.77   3.07   8.66   25.11 1.41   
  5. 11:08:13 wd-0   0.77   2.78   2.77   7.26   4.94 2.77   
  6. 11:08:43 wd-0   1.10   11.18   4.10   11.26   27.32 2.68   
  7. 11:09:13 wd-0   1.97   21.78   5.86   34.06   69.66 3.35   
  8. Average wd-0   1.15   12.11   4.09   15.19   31.12 2.80   
  9.    

顯示內容包括: 
device: sar命令正在監視的塊設備的名字。 
%busy: 設備忙時,傳送請求所佔時間的百分比。 
avque: 隊列站滿時,未完成請求數量的平均值。 
r+w/s: 每秒傳送到設備或從設備傳出的數據量。 
blks/s: 每秒傳送的塊數,每塊512字節。 
avwait: 隊列佔滿時傳送請求等待隊列空閒的平均時間。
avserv: 完成傳送請求所需平均時間(毫秒)。

在顯示的內容中,wd-0是硬盤的名字,%busy的值比較小,說明用於處理傳送請求的有 效 時間太少,文件系統效率不高,通常來說,%busy值高些,avque值低些,文件系統 的效率比較高,若是%busy和avque值相對比較 高,說明硬盤傳輸速度太慢,需調整。

例四:使用命行sar -b t n 
例如,每30秒採樣一次,連續採樣5次,報告緩衝區的使用情 況,需鍵入以下命令: 
# sar -b 30 5

屏幕顯示:

[java]  view plain  copy
 
  1. SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001   
  2. 14:54:59 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s (-b)   
  3. 14:55:29 0  147  100  5  21  78   0   0   
  4. 14:55:59 0  186  100  5  25  79   0   0   
  5. 14:56:29  4  232   98  8  58  86   0   0   
  6. 14:56:59 0  125  100  5  23  76   0   0   
  7. 14:57:29 0   89  100  4  12  66   0   0   
  8. Average  1  156   99  5  28  80   0   0   


  

顯示內容包括: 
bread/s: 每秒從硬盤讀入系統緩衝區buffer的物理塊數。 
lread/s: 平均每秒從系統buffer讀出的邏輯塊數。 
%rcache: 在buffer cache中進行邏輯讀的百分比。 
bwrit/s: 平均每秒從系統buffer向磁盤所寫的物理塊數。 
lwrit/s: 平均每秒寫到系統buffer邏輯塊數。 
%wcache: 在buffer cache中進行邏輯讀的百分比。 
pread/s: 平均每秒請求物理讀的次數。 
pwrit/s: 平均每秒請求物理寫的次數。

在顯示的內容中,最重要的是%cache 和%wcache兩列,它們的值體現着buffer的使用效 率,%rcache的值小於90或者%wcache的值低於65,應適當增長系統 buffer的數量,buffer 數量由核心參數NBUF控制,使%rcache達到90左右,%wcache達到80左右。但buffer參 數值的多少影響I/O效率,增長buffer,應在較大內存的狀況下,不然系統效率反而得不到提升。
例五:使用命行sar -g t n 
例 如,每30秒採樣一次,連續採樣5次,報告串口I/O的操做狀況,需鍵入以下命令: 
# sar -g 30 5

[java]  view plain  copy
 
  1. 屏幕顯示:   
  2. SCO_SV scosysv 3.2v5.0.5 i80386  11/22/2001   
  3. 17:07:03  ovsiohw/s  ovsiodma/s  ovclist/s (-g)   
  4. 17:07:33   0.00   0.00   0.00   
  5. 17:08:03    0.00   0.00   0.00   
  6. 17:08:33   0.00   0.00   0.00   
  7. 17:09:03    0.00   0.00   0.00   
  8. 17:09:33   0.00   0.00   0.00   
  9. Average    0.00   0.00   0.00   

顯示內容包括: 
ovsiohw/s:每秒在串口I/O硬件出現的溢出。 
ovsiodma/s: 每秒在串口I/O的直接輸入輸出通道高速緩存出現的溢出。 
ovclist/s :每秒字符隊列出現的溢出。 
在顯示的內容中,每一列的 值都是零,代表在採樣時間內,系統中沒有發生串口I/O溢 出現象。

sar命令的用法不少,有時判斷一個問題,須要幾個sar 命令結合起來使用,好比,懷疑 CPU存在瓶頸,可用sar -u 和sar -q來看,懷疑I/O存在瓶頸,可用sar -b、sar -u和 sar-d來看。

 

vmstat命令

vmstat命令是最多見的Linux/Unix監控工具,能夠展示給定時間間隔的服務器的狀態值,包括服務器的CPU使用率,內存使用,虛擬內存交換狀況,IO讀寫狀況。這個命令是我查看Linux/Unix最喜好的命令,一個是Linux/Unix都支持,二是相比top,我能夠看到整個機器的CPU,內存,IO的使用狀況,而不是單單看到各個進程的CPU使用率和內存使用率(使用場景不同)。
通常vmstat工具的使用是經過兩個數字參數來完成的,第一個參數是採樣的時間間隔數,單位是秒,第二個參數是採樣的次數,如:

3表示每一個三秒採集一次服務器狀態,2表示只採集兩次。
實際上,在應用過程當中,咱們會在一段時間內一直監控,不想直接結束vmstat監控,那麼就直接把後邊的表示採集次數的去掉便可,如:

其中,各個參數的意義以下:

r 表示運行隊列(就是說多少個進程真的分配到CPU),我測試的服務器目前CPU比較空閒,沒什麼程序在跑,當這個值超過了CPU數目,就會出現CPU瓶頸了。這個也和top的負載有關係,通常負載超過了3就比較高,超過了5就高,超過了10就不正常了,服務器的狀態很危險。top的負載相似每秒的運行隊列。若是運行隊列過大,表示你的CPU很繁忙,通常會形成CPU使用率很高。

b 表示阻塞的進程,這個很少說,進程阻塞,你們懂的。

swpd 虛擬內存已使用的大小,若是大於0,表示你的機器物理內存不足了,若是不是程序內存泄露的緣由,那麼你該升級內存了或者把耗內存的任務遷移到其餘機器。

free   空閒的物理內存的大小,個人機器內存總共8G,剩餘3415M。

buff   Linux/Unix系統是用來存儲,目錄裏面有什麼內容,權限等的緩存,我本機大概佔用300多M

cache cache直接用來記憶咱們打開的文件,給文件作緩衝,我本機大概佔用300多M(這裏是Linux/Unix的聰明之處,把空閒的物理內存的一部分拿來作文件和目錄的緩存,是爲了提升 程序執行的性能,當程序使用內存時,buffer/cached會很快地被使用。)

si  每秒從磁盤讀入虛擬內存的大小,若是這個值大於0,表示物理內存不夠用或者內存泄露了,要查找耗內存進程解決掉。個人機器內存充裕,一切正常。

so  每秒虛擬內存寫入磁盤的大小,若是這個值大於0,同上。

bi  塊設備每秒接收的塊數量,這裏的塊設備是指系統上全部的磁盤和其餘塊設備,默認塊大小是1024byte,我本機上沒什麼IO操做,因此一直是0,可是我曾在處理拷貝大量數據(2-3T)的機器上看過能夠達到140000/s,磁盤寫入速度差很少140M每秒

bo 塊設備每秒發送的塊數量,例如咱們讀取文件,bo就要大於0。bi和bo通常都要接近0,否則就是IO過於頻繁,須要調整。

in 每秒CPU的中斷次數,包括時間中斷

cs 每秒上下文切換次數,例如咱們調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目,例如在apache和nginx這種web服務器中,咱們通常作性能測試時會進行幾千併發甚至幾萬併發的測試,選擇web服務器的進程能夠由進程或者線程的峯值一直下調,壓測,直到cs到一個比較小的值,這個進程和線程數就是比較合適的值了。系統調用也是,每次調用系統函數,咱們的代碼就會進入內核空間,致使上下文切換,這個是很耗資源,也要儘可能避免頻繁調用系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,致使CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。

us 用戶CPU時間,我曾經在一個作加密解密很頻繁的服務器上,能夠看到us接近100,r運行隊列達到80(機器在作壓力測試,性能表現不佳)。

sy 系統CPU時間,若是過高,表示系統調用時間長,例如是IO操做頻繁。

id  空閒 CPU時間,通常來講,id + us + sy = 100,通常我認爲id是空閒CPU使用率,us是用戶CPU使用率,sy是系統CPU使用率。

wt 等待IO CPU時間。

 

iostat命令

iostat命令主要用於監控系統設備的IO負載狀況,iostat首次運行時顯示自系統啓動開始的各項統計信息,以後運行iostat將顯示自上次運行該命令之後的統計信息。用戶能夠經過指定統計的次數和時間來得到所需的統計信息。

語法:

[java]  view plain  copy
 
  1. iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]  

如 iostat -d -k 1

參數 -d 表示,顯示設備(磁盤)使用狀態;-k某些使用block爲單位的列強制使用Kilobytes爲單位;1表示,數據顯示每隔1秒刷新一次。

詳細內容,請參考博文:Linux IO實時監控iostat命令詳解

 

iostat -m -x 1 

若是 字段svctm (倒數第二段) 小於 2ms,就是正常

pidstat命令

pidstat命令用來監控被Linux內核管理的獨立任務(進程)。它輸出每一個受內核管理的任務的相關信息。pidstat命令也能夠用來監控特定進程的子進程。間隔參數用於指定每次報告間的時間間隔。它的值爲0(或者沒有參數)說明進程的統計數據的時間是從系統啓動開始計算的。
pidstat 是sysstat軟件套件的一部分,sysstat包含不少監控linux系統狀態的工具,它可以從大多數linux發行版的軟件源中得到。
在Debian/Ubuntu系統中可使用下面的命令來安裝:
# apt-get install sysstat
CentOS/Fedora/RHEL版本的linux中則使用下面的命令:
# yum install sysstat

默認參數

執行pidstat,將輸出系統啓動後全部活動進程的cpu統計信息:

 

[java]  view plain  copy
 
  1. linux:~ # pidstat  
  2. Linux 2.6.32.12-0.7-default (linux)             06/18/12        _x86_64_  
  3.   
  4. 11:37:19          PID    %usr %system  %guest    %CPU   CPU  Command  
  5. ……  
  6. 11:37:19        11452    0.00    0.00    0.00    0.00     2  bash  
  7. 11:37:19        11509    0.00    0.00    0.00    0.00     3  dd  


 

指定採樣週期和採樣次數

pidstat命令指定採樣週期和採樣次數,命令形式爲」pidstat [option] interval [count]」,如下pidstat輸出以2秒爲採樣週期,輸出10次cpu使用統計信息:

[java] view plain copy
 
  1. pidstat 10  

 

 

cpu使用狀況統計(-u)

使用-u選項,pidstat將顯示各活動進程的cpu使用統計,執行」pidstat -u」與單獨執行」pidstat」的效果同樣。

 

內存使用狀況統計(-r)

使用-r選項,pidstat將顯示各活動進程的內存使用統計:

[java]  view plain  copy
 
  1. linux:~ # pidstat -r -p 13084 1  
  2. Linux 2.6.32.12-0.7-default (linux)             06/18/12        _x86_64_  
  3.   
  4. 15:08:18          PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command  
  5. 15:08:19        13084 133835.00      0.00 15720284 15716896  96.26  mmmm  
  6. 15:08:20        13084  35807.00      0.00 15863504 15849756  97.07  mmmm  
  7. 15:08:21        13084  19273.87      0.00 15949040 15792944  96.72  mmmm  

以上各列輸出的含義以下:

[java]  view plain  copy
 
  1. minflt/s: 每秒次缺頁錯誤次數(minor page faults),次缺頁錯誤次數意即虛擬內存地址映射成物理內存地址產生的page fault次數  
  2. majflt/s: 每秒主缺頁錯誤次數(major page faults),當虛擬內存地址映射成物理內存地址時,相應的page在swap中,這樣的page fault爲major page fault,通常在內存使用緊張時產生  
  3. VSZ:      該進程使用的虛擬內存(以kB爲單位)  
  4. RSS:      該進程使用的物理內存(以kB爲單位)  
  5. %MEM:     該進程使用內存的百分比  
  6. Command:  拉起進程對應的命令  

 

IO狀況統計(-d)


使用-d選項,咱們能夠查看進程IO的統計信息:

[java]  view plain  copy
 
  1. linux:~ # pidstat -d 2  
  2. Linux 2.6.32.12-0.7-default (linux)             06/18/12        _x86_64_  
  3.   
  4. 17:11:36          PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command  
  5. 17:11:37        14579 124988.24      0.00      0.00  dd  
  6.   
  7. 17:11:37          PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command  
  8. 17:11:38        14579 105441.58      0.00      0.00  dd  

輸出信息含義

[java]  view plain  copy
 
  1. kB_rd/s: 每秒進程從磁盤讀取的數據量(以kB爲單位)  
  2. kB_wr/s: 每秒進程向磁盤寫的數據量(以kB爲單位)  
  3. Command: 拉起進程對應的命令  

 

針對特定進程統計(-p)

使用-p選項,咱們能夠查看特定進程的系統資源使用狀況:

[java]  view plain  copy
 
  1. linux:~ # pidstat -r -p 1  
  2. Linux 2.6.32.12-0.7-default (linux)             06/18/12        _x86_64_  
  3.   
  4. 18:26:17          PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command  
  5. 18:26:18            1      0.00      0.00   10380    640   0.00  init  
  6. 18:26:19            1      0.00      0.00   10380    640   0.00  init  
  7. ……  

 

pidstat經常使用命令

使用pidstat進行問題定位時,如下命令常被用到:

[java]  view plain  copy
 
  1. pidstat -u 1  
  2.   
  3. pidstat -r 1  
  4.   
  5. pidstat -d 1  

 

以上命令以1秒爲信息採集週期,分別獲取cpu、內存和磁盤IO的統計信息。

 

pmap命令

能夠根據進程查看進程相關信息佔用的內存狀況。

用法
       pmap [ -x | -d ] [ -q ] pids...
       pmap -V
選項含義
       -x   extended       Show the extended format. 顯示擴展格式
       -d   device         Show the device format.   顯示設備格式
       -q   quiet          Do not display some header/footer lines. 不顯示頭尾行
       -V   show version   Displays version of program. 顯示版本

擴展格式和設備格式域:
        Address:  start address of map  映像起始地址
        Kbytes:  size of map in kilobytes  映像大小
        RSS:  resident set size in kilobytes  駐留集大小
        Dirty:  dirty pages (both shared and private) in kilobytes  髒頁大小
        Mode:  permissions on map 映像權限: r=read, w=write, x=execute, s=shared, p=private (copy on write) 
        Mapping:  file backing the map , or '[ anon ]' for allocated memory, or '[ stack ]' for the program stack.  映像支持文件,[anon]爲已分配內存 [stack]爲程序堆棧
        Offset:  offset into the file  文件偏移
        Device:  device name (major:minor)  設備名

如:
pmap -d 6292

 

最後一行的值
mapped 表示該進程映射的虛擬地址空間大小,也就是該進程預先分配的虛擬內存大小,即ps出的vsz
writeable/private  表示進程所佔用的私有地址空間大小,也就是該進程實際使用的內存大小      
shared 表示進程和其餘進程共享的內存大小

ps命令

如下來源《鳥哥的linux私房菜》

ps:將某個時間點的程序運做狀況擷取下來

 

[java]  view plain  copy
 
  1. [root@linux ~]# ps aux  
  2.   
  3. [root@linux ~]# ps -lA  
  4.   
  5. [root@linux ~]# ps axjf  

參數:

-A :全部的 process 均顯示出來,與 -e 具備一樣的效用;

-a :不與 terminal 有關的全部 process ;

-u :有效使用者 (effective user) 相關的 process ;

-x :一般與 a 這個參數一塊兒使用,可列出較完整信息。

輸出格式規劃:

-l :較長、較詳細的將該 PID 的的信息列出;

-j :工做的格式 (jobs format)

-f :作一個更爲完整的輸出。

特別說明:

因爲 ps 可以支持的 OS 類型至關的多,因此他的參數多的離譜!

並且有沒有加上 - 差不少!詳細的用法應該要參考 man ps 喔!

 

範例1:將目前屬於您本身此次登入的 PID 與相關信息列示出來
[root@linux ~]# ps -l

[java]  view plain  copy
 
  1. F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD  
  2.   
  3. 0 S 5881 5654 76 0 - 1303 wait pts/00:00:00 su  
  4.   
  5. 4 S 5882 5881 75 0 - 1349 wait pts/00:00:00 bash  
  6.   
  7. 4 R 6037 5882 76 0 - 1111 - pts/00:00:00 ps  


# 上面這個信息其實不少喔!各相關信息的意義爲:

# F 表明這個程序的旗標 (flag), 4 表明使用者爲 super user;

# S 表明這個程序的狀態 (STAT),關於各 STAT 的意義將在內文介紹;

# PID 沒問題吧!?就是這個程序的 ID 啊!底下的 PPID 則上父程序的 ID;

# C CPU 使用的資源百分比

# PRI 這個是 Priority (優先執行序) 的縮寫,詳細後面介紹;

# NI 這個是 Nice 值,在下一小節咱們會持續介紹。

# ADDR 這個是 kernel function,指出該程序在內存的那個部分。若是是個 running

# 的程序,通常就是『 - 』的啦!

# SZ 使用掉的內存大小;

# WCHAN 目前這個程序是否正在運做當中,若爲 - 表示正在運做;

# TTY 登入者的終端機位置囉;

# TIME 使用掉的 CPU 時間。

# CMD 所下達的指令爲什麼!?

# 仔細看到每個程序的 PID 與 PPID 的相關性爲什麼喔!上頭列出的三個程序中,

# 彼此間但是有相關性的吶!

 

範例2:列出目前全部的正在內存當中的程序

[java]  view plain  copy
 
  1. [root@linux ~]# ps aux  
  2.   
  3. USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND  
  4.   
  5. root 0.0 0.1 1740 540 ? S Jul25 0:01 init [3]  
  6.   
  7. root 0.0 0.0 0 ? SN Jul25 0:00 [ksoftirqd/0]  
  8.   
  9. root 0.0 0.0 0 ? S< Jul25 0:00 [events/0]  
  10.   
  11. .....中間省略.....  
  12.   
  13. root 5881 0.0 0.3 5212 1204 pts/0 S 10:22 0:00 su  
  14.   
  15. root 5882 0.0 0.3 5396 1524 pts/0 S 10:22 0:00 bash  
  16.   
  17. root 6142 0.0 0.2 4488 916 pts/0 R+ 11:45 0:00 ps aux   


• USER:該 process 屬於那個使用者帳號的?

• PID :該 process 的號碼。

• %CPU:該 process 使用掉的 CPU 資源百分比;

• %MEM:該 process 所佔用的物理內存百分比;

• VSZ :該 process 使用掉的虛擬內存量 (Kbytes)

• RSS :該 process 佔用的固定的內存量 (Kbytes)

• TTY :該 process 是在那個終端機上面運做,若與終端機無關,則顯示 ?,另外, tty1-tty6 是本機上面的登入者程序,若爲 pts/0 等等的,則表示爲由網絡鏈接進主機的程序。

• STAT:該程序目前的狀態,主要的狀態有:

o R :該程序目前正在運做,或者是可被運做;

o S :該程序目前正在睡眠當中 (可說是 idle 狀態啦!),但可被某些訊號 (signal) 喚醒。

o T :該程序目前正在偵測或者是中止了;

o Z :該程序應該已經終止,可是其父程序卻沒法正常的終止他,形成 zombie (疆屍) 程序的狀態

• START:該 process 被觸發啓動的時間;

• TIME :該 process 實際使用 CPU 運做的時間。

• COMMAND:該程序的實際指令爲什麼?

 

範例3:以範例一的顯示內容,顯示出全部的程序

[java]  view plain  copy
 
  1. [root@linux ~]# ps -lA  
  2.   
  3. F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD  
  4.   
  5. 4 S 76 0 - 435 - ? 00:00:01 init  
  6.   
  7. 1 S 94 19 - 0 ksofti ? 00:00:00 ksoftirqd/0  
  8.   
  9. 1 S 70 -5 - 0 worker ? 00:00:00 events/0  
  10.   
  11. .....如下省略.....   

 

範例4:列出相似程序樹的程序顯示

 

[java]  view plain  copy
 
  1. [root@linux ~]# ps -axjf  
  2.   
  3. PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND  
  4.   
  5. 0 ? -1 S 0:01 init [3]  
  6.   
  7. 0 ? -1 SN 0:00 [ksoftirqd/0]  
  8.   
  9. .....中間省略.....  
  10.   
  11. 5281 5281 5281 ? -1 Ss 0:00 /usr/sbin/sshd  
  12.   
  13. 5281 5651 5651 5651 ? -1 Ss 0:00 \_ sshd: dmtsai [priv]  
  14.   
  15. 5651 5653 5651 5651 ? -1 S 500 0:00 \_ sshd: dmtsai@pts/0  
  16.   
  17. 5653 5654 5654 5654 pts/6151 Ss 500 0:00 \_ -bash  
  18.   
  19. 5654 5881 5881 5654 pts/6151 S 0:00 \_ su  
  20.   
  21. 5881 5882 5882 5654 pts/6151 S 0:00 \_ bash  
  22.   
  23. 5882 6151 6151 5654 pts/6151 R+ 0:00 \_ ps -axjf   

 

範例5:找出與 cron 與 syslog 這兩個服務有關的 PID 號碼

 

[java]  view plain  copy
 
  1. [root@linux ~]# ps aux | egrep '(cron|syslog)'  
  2.   
  3. root 1539 0.0 0.1 1616 616 ? Ss Jul25 0:03 syslogd -m 0  
  4.   
  5. root 1676 0.0 0.2 4544 1128 ? Ss Jul25 0:00 crond  
  6.   
  7. root 6157 0.0 0.1 3764 664 pts/0 R+ 12:10 0:00 egrep (cron|syslog)   

 

在預設的狀況下, ps 僅會列出與目前所在的 bash shell 有關的 PID 而已,因此, 當我使用 ps -l 的時候,只有三個 PID (範例一)。

free命令

 

在Linux下查看內存咱們通常用free命令:

[java]  view plain  copy
 
  1. [root@scs-2 tmp]# free    
  2. total used free shared buffers cached    
  3. Mem: 3266180 3250004 16176 110652 2668236    
  4. -/+ buffers/cache: 471116 2795064    
  5. Swap: 2048276 80160 1968116   

下面是對這些數值的解釋:
total:總計物理內存的大小
used:已使用多大
free:可用有多少
Shared:多個進程共享的內存總額
Buffers/cached:磁盤緩存的大小
第三行(-/+ buffers/cached):
used:已使用多大。
free:可用有多少。
第四行就很少解釋了。
區別:第二行(mem)的used/free與第三行(-/+ buffers/cache) used/free的區別。 這兩個的區別在於使用的角度來看,第一行是從OS的角度來看,由於對於OS,buffers/cached 都是屬於被使用,因此他的可用內存是16176KB,已用內存是3250004KB,其中包括,內核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached.
第三行所指的是從應用程序角度來看,對於應用程序來講,buffers/cached 是等於可用的,由於buffer/cached是爲了提升文件讀取的性能,當應用程序需在用到內存的時候,buffer/cached會很快地被回收。
因此從應用程序的角度來講,可用內存=系統free memory+buffers+cached。
如上例:
2795064=16176+110652+2668236

 

接下來解釋何時內存會被交換,以及按什麼方交換。 當可用內存少於額定值的時候,就會開會進行交換。
如何看額定值:

[java]  view plain  copy
 
  1. cat /proc/meminfo  
  2.   
  3. [root@scs-2 tmp]# cat /proc/meminfo  
  4. MemTotal:      3266180 kB  
  5. MemFree:         17456 kB  
  6. Buffers:        111328 kB  
  7. Cached:        2664024 kB  
  8. SwapCached:          0 kB  
  9. Active:         467236 kB  
  10. Inactive:      2644928 kB  
  11. HighTotal:           0 kB  
  12. HighFree:            0 kB  
  13. LowTotal:      3266180 kB  
  14. LowFree:         17456 kB  
  15. SwapTotal:     2048276 kB  
  16. SwapFree:      1968116 kB  
  17. Dirty:               8 kB  
  18. Writeback:           0 kB  
  19. Mapped:         345360 kB  
  20. Slab:           112344 kB  
  21. Committed_AS:   535292 kB  
  22. PageTables:       2340 kB  
  23. VmallocTotal: 536870911 kB  
  24. VmallocUsed:    272696 kB  
  25. VmallocChunk: 536598175 kB  
  26. HugePages_Total:     0  
  27. HugePages_Free:      0  
  28. Hugepagesize:     2048 kB  


 

 

用free -m查看的結果:

[java]  view plain  copy
 
  1. [root@scs-2 tmp]# free -m   
  2.              total       used       free     shared    buffers     cached  
  3. Mem:          3189       3173         16          0        107       2605  
  4. -/+ buffers/cache:        460       2729  
  5. Swap:         2000         78       1921  


 

 

查看/proc/kcore文件的大小(內存鏡像):

[java]  view plain  copy
 
  1. [root@scs-2 tmp]# ll -h /proc/kcore   
  2. -r-------- 1 root root 4.1G Jun 12 12:04 /proc/kcore  


 

備註:

佔用內存的測量

測量一個進程佔用了多少內存,linux爲咱們提供了一個很方便的方法,/proc目錄爲咱們提供了全部的信息,實際上top等工具也經過這裏來獲取相應的信息。

/proc/meminfo 機器的內存使用信息

/proc/pid/maps pid爲進程號,顯示當前進程所佔用的虛擬地址。

/proc/pid/statm 進程所佔用的內存

[root@localhost ~]# cat /proc/self/statm

654 57 44 0 0 334 0

輸出解釋

CPU 以及CPU0。。。的每行的每一個參數意思(以第一行爲例)爲:

參數 解釋 /proc//status

Size (pages) 任務虛擬地址空間的大小 VmSize/4

Resident(pages) 應用程序正在使用的物理內存的大小 VmRSS/4

Shared(pages) 共享頁數 0

Trs(pages) 程序所擁有的可執行虛擬內存的大小 VmExe/4

Lrs(pages) 被映像到任務的虛擬內存空間的庫的大小 VmLib/4

Drs(pages) 程序數據段和用戶態的棧的大小 (VmData+ VmStk )4

dt(pages) 04

查看機器可用內存

[java]  view plain  copy
 
  1. /proc/28248/>free  
  2.   
  3. total used free shared buffers cached  
  4.   
  5. Mem: 1023788 926400 97388 134668 503688  
  6.   
  7. -/+ buffers/cache: 288044 735744  
  8.   
  9. Swap: 1959920 89608 1870312  


 

咱們經過free命令查看機器空閒內存時,會發現free的值很小。這主要是由於,在linux中有這麼一種思想,內存不用白不用,所以它儘量的cache和buffer一些數據,以方便下次使用。但實際上這些內存也是能夠馬上拿來使用的。因此 空閒內存=free+buffers+cached=total-used

ctop命令

如下是摘自碼農網。

ctop是一個新的基於命令行的工具,它可用於在容器層級監控進程。容器經過利用控制器組(cgroup)的資源管理功能,提供了操做系統層級的虛擬化環境。該工具從cgroup收集與內存、CPU、塊輸入輸出的相關數據,以及擁有者、開機時間等元數據,並以人性化的格式呈現給用戶,這樣就能夠快速對系統健康情況進行評估。基於所得到的數據,它能夠嘗試推測下層的容器技術。ctop也有助於在低內存環境中檢測出誰在消耗大量的內存。

功能

ctop的一些功能以下:

  • 收集CPU、內存和塊輸入輸出的度量值
  • 收集與擁有者、容器技術和任務統計相關的信息
  • 經過任意欄對信息排序
  • 以樹狀視圖顯示信息
  • 摺疊/展開cgroup樹
  • 選擇並跟蹤cgroup/容器
  • 選擇顯示數據刷新的時間窗口
  • 暫停刷新數據
  • 檢測基於systemd、Docker和LXC的容器
  • 基於Docker和LXC的容器的高級特性
    • 打開/鏈接shell以進行深度診斷
    • 中止/殺死容器類型

安裝

ctop是由Python寫成的,所以,除了須要Python 2.6或其更高版本外(帶有內建的光標支持),別無其它外部依賴。推薦使用Python的pip進行安裝,若是尚未安裝pip,請先安裝,而後使用pip安裝ctop。

注意:本文樣例來自Ubuntu(14.10)系統

$ sudo apt-get install python-pip

使用pip安裝ctop:

poornima@poornima-Lenovo:~$ sudo pip install ctop

[sudo] password for poornima:

Downloading/unpacking ctop

Downloading ctop-0.4.0.tar.gz

Running setup.py (path:/tmp/pip_build_root/ctop/setup.py) egg_info for package ctop

Installing collected packages: ctop

Running setup.py install for ctop

changing mode of build/scripts-2.7/ctop from 644 to 755

changing mode of /usr/local/bin/ctop to 755

Successfully installed ctop

Cleaning up...

若是不選擇使用pip安裝,你也可使用wget直接從github安裝:

poornima@poornima-Lenovo:~$ wget https://raw.githubusercontent.com/yadutaf/ctop/master/cgroup_top.py -O ctop

--2015-04-29 19:32:53-- https://raw.githubusercontent.com/yadutaf/ctop/master/cgroup_top.py

Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 199.27.78.133

Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|199.27.78.133|:443... connected.

HTTP request sent, awaiting response... 200 OK Length: 27314 (27K) [text/plain]

Saving to: ctop

100%[======================================>] 27,314 --.-K/s in 0s

2015-04-29 19:32:59 (61.0 MB/s) - ctop saved [27314/27314]
poornima@poornima-Lenovo:~$ chmod +x ctop

若是cgroup-bin包沒有安裝,你可能會碰到一個錯誤消息,你能夠經過安裝須要的包來解決。

poornima@poornima-Lenovo:~$ ./ctop

[ERROR] Failed to locate cgroup mountpoints.

poornima@poornima-Lenovo:~$ sudo apt-get install cgroup-bin

下面是ctop的輸出樣例:

監控 Linux 容器性能的命令行神器

ctop屏幕

用法選項

ctop [--tree] [--refresh=] [--columns=] [--sort-col=] [--follow=] [--fold=, ...] ctop (-h | --help)

當你進入ctop屏幕,可以使用上(↑)和下(↓)箭頭鍵在容器間導航。點擊某個容器就選定了該容器,按q或Ctrl+C退出該容器。

如今,讓咱們來看看上面列出的那一堆選項到底是怎麼用的吧。

-h / –help – 顯示幫助信息

poornima@poornima-Lenovo:~$ ctop -h
Usage: ctop [options]

Options:
-h, --help show this help message and exit
--tree show tree view by default
--refresh=REFRESH Refresh display every <seconds>
--follow=FOLLOW Follow cgroup path
--columns=COLUMNS List of optional columns to display. Always includes
'name'
--sort-col=SORT_COL Select column to sort by initially. Can be changed
dynamically.

–tree – 顯示容器的樹形視圖

默認狀況下,會顯示列表視圖

當你進入ctop窗口,你可使用F5按鈕在樹狀/列表視圖間切換。

–fold= – 在樹形視圖中摺疊名爲 <name> 的 cgroup 路徑

該選項須要與 –tree 選項組合使用。

例子: ctop –tree –fold=/user.slice

監控 Linux 容器性能的命令行神器

‘ctop –fold’的輸出

在ctop窗口中,使用+/-鍵來展開或摺疊子cgroup。

注意:在寫本文時,pip倉庫中尚未最新版的ctop,還不支持命令行的‘–fold’選項

–follow= – 跟蹤/高亮 cgroup 路徑

例子: ctop –follow=/user.slice/user-1000.slice

正如你在下面屏幕中所見到的那樣,帶有「/user.slice/user-1000.slice」路徑的cgroup被高亮顯示,這讓用戶易於跟蹤,就算顯示位置變了也同樣。

監控 Linux 容器性能的命令行神器

‘ctop –follow’的輸出

你也可使用‘f’按鈕來讓高亮的行跟蹤選定的容器。默認狀況下,跟蹤是關閉的。

–refresh= – 按指定頻率刷新顯示,默認1秒

這對於按每用戶需求來顯示改變刷新率時頗有用。使用‘p’按鈕能夠暫停刷新並選擇文本。

–columns= – 限定只顯示選定的列。’name’ 須要是第一個字段,其後跟着其它字段。默認狀況下,字段包括:owner, processes,memory, cpu-sys, cpu-user, blkio, cpu-time

例子: ctop –columns=name,owner,type,memory

監控 Linux 容器性能的命令行神器

‘ctop –column’的輸出

-sort-col= – 按指定的列排序。默認使用 cpu-user 排序

例子: ctop –sort-col=blkio

若是有Docker和LXC支持的額外容器,跟蹤選項也是可用的:

press 'a' - 接駁到終端輸出

press 'e' - 打開容器中的一個 shell

press 's' - 中止容器 (SIGTERM)

press 'k' - 殺死容器 (SIGKILL)

目前 Jean-Tiare Le Bigot 還在積極開發 ctop 中,但願咱們能在該工具中見到像本地 top 命令同樣的特性。

相關文章
相關標籤/搜索