日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

0. 引言:

系統內存是硬件系統中必不可少的部分,定時查看系統內存資源運行情況,可以幫助我們及時發現內存資源是否存在異常占用,確保業務的穩定運行。

例如:定期查看公司的網站服務器內存使用情況,可以確保服務器的資源是否夠用,或者發現服務器內存被占用異常可以及時解決,避免因內存不夠導致無法訪問網站或訪問速度慢的問題。

因此,對于 linux 管理員來說,在日常工作中能夠熟練在 Linux 系統下檢查內存的運行狀況就變得尤為重要!

查看內存的運行狀態并非難事,但是針對不同的情況使用正確的方式查看呢?

一口君整理了幾個 個非常實用的 Linux 內存查看方法

  • 1、free命令
  • 2、 vmstat命令
  • 3、 /proc/meminfo 命令
  • 4、 top命令
  • 5、 htop 命令
  • 6、查看進程內存信息

Linux內存總覽圖

Linux內存占用常用的幾個分析方法,你確定都知道?

 

該圖很好的描述了OS內存的使用和分配等詳細信息。建議大家配合該圖來一起學習和理解內存的一些概念。

一、free命令

free 命令可以顯示當前系統未使用的和已使用的內存數目,還可以顯示被內核使用的內存緩沖區。

1. free 命令語法:

free [options]

free 命令選項:

-b # 以Byte為單位顯示內存使用情況;
-k # 以KB為單位顯示內存使用情況;
-m # 以MB為單位顯示內存使用情況;
-g # 以GB為單位顯示內存使用情況。 
-o # 不顯示緩沖區調節列;
-s<間隔秒數> # 持續觀察內存使用狀況;
-t # 顯示內存總和列;
-V # 顯示版本信息。

2. free 命令實例

free -t    # 以總和的形式顯示內存的使用信息
free -h -s 10 # 周期性的查詢內存使用信息,每10s 執行一次命令

free -h -c 10 #輸出10次
  在版本 v3.2.8,就是輸出一次!需要配合 -s 使用。
  在版本 v3.3.10,不加-s,就默認1秒輸出一次。
free -V #查看版本號

v3.2.8

Linux內存占用常用的幾個分析方法,你確定都知道?

 

v3.3.10

Linux內存占用常用的幾個分析方法,你確定都知道?

 

下面先解釋一下輸出的內容:

Linux內存占用常用的幾個分析方法,你確定都知道?

 

二、vmstat 指令

vmstat命令是最常見的Linux/Unix監控工具,用于查看系統的內存存儲信息,是一個報告虛擬內存統計信息的小工具,屬于sysstat包。

vmstat 命令報告包括:進程、內存、分頁、阻塞 IO、中斷、磁盤、CPU

可以展現給定時間間隔的服務器的狀態值,包括服務器的CPU使用率,內存使用,虛擬內存交換情況,IO讀寫情況。

這個命令是我查看Linux/Unix最喜愛的命令,一個是Linux/Unix都支持,二是相比top,我可以看到整個機器的CPU,內存,IO的使用情況,而不是單單看到各個進程的CPU使用率和內存使用率(使用場景不一樣)。

1. 命令格式:

vmstat -s(參數)

2. 舉例

一般vmstat工具的使用是通過兩個數字參數來完成的,第一個參數是采樣的時間間隔數,單位是秒,第二個參數是采樣的次數,如:

 root@local:~# vmstat 2 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      0 3498472 315836 3819540    0    0     0     1    2    0  0  0 100  0

2表示每個兩秒采集一次服務器狀態,1表示只采集一次。

實際上,在應用過程中,我們會在一段時間內一直監控,不想監控直接結束vmstat就行了,例如:

Linux內存占用常用的幾個分析方法,你確定都知道?

 

這表示vmstat每2秒采集數據,按下ctrl + c結束程序,這里采集了3次數據我就結束了程序。

類別

項目

含義

說明

Procs(進程)

r

等待執行的任務數

展示了正在執行和等待cpu資源的任務個數。當這個值超過了cpu個數,就會出現cpu瓶頸。

B

等待IO的進程數量

 

Memory(內存)

swpd

正在使用虛擬的內存大小,單位k

 

free

空閑內存大小

 

buff

已用的buff大小,對塊設備的讀寫進行緩沖

 

cache

已用的cache大小,文件系統的cache

 

inact

非活躍內存大小,即被標明可回收的內存,區別于free和active

具體含義見:概念補充(當使用-a選項時顯示)

active

活躍的內存大小

具體含義見:概念補充(當使用-a選項時顯示)

Swap

si

每秒從交換區寫入內存的大小(單位:kb/s)

 

so

每秒從內存寫到交換區的大小

 

IO

bi

每秒讀取的塊數(讀磁盤)

塊設備每秒接收的塊數量,單位是block,這里的塊設備是指系統上所有的磁盤和其他塊設備,現在的Linux版本塊的大小為1024bytes

bo

每秒寫入的塊數(寫磁盤)

塊設備每秒發送的塊數量,單位是block

system

in

每秒中斷數,包括時鐘中斷

這兩個值越大,會看到由內核消耗的cpu時間sy會越多

秒上下文切換次數,例如我們調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目

cs

每秒上下文切換數

CPU(以百分比表示)

us

用戶進程執行消耗cpu時間(user time)

us的值比較高時,說明用戶進程消耗的cpu時間多,但是如果長期超過50%的使用,那么我們就該考慮優化程序算法或其他措施了

sy

系統進程消耗cpu時間(system time)

sys的值過高時,說明系統內核消耗的cpu資源多,這個不是良性的表現,我們應該檢查原因。這里us + sy的參考值為80%,如果us+sy 大于 80%說明可能存在CPU不足

Id

空閑時間(包括IO等待時間)

一般來說 us+sy+id=100

wa

等待IO時間

wa過高時,說明io等待比較嚴重,這可能是由于磁盤大量隨機訪問造成的,也有可能是磁盤的帶寬出現瓶頸。

3. 常見問題處理

常見問題及解決方法

  1. 如果r經常大于4,且id經常少于40,表示cpu的負荷很重。
  2. 如果pi,po長期不等于0,表示內存不足。
  3. 如果disk經常不等于0,且在b中的隊列大于3,表示io性能不好。
  • 1.如果在processes中運行的序列(process r)是連續的大于在系統中的CPU的個數表示系統現在運行比較慢,有多數的進程等待CPU。
  • 2.如果r的輸出數大于系統中可用CPU個數的4倍的話,則系統面臨著CPU短缺的問題,或者是CPU的速率過低,系統中有多數的進程在等待CPU,造成系統中進程運行過慢。
  • 3.如果空閑時間(cpu id)持續為0并且系統時間(cpu sy)是用戶時間的兩倍(cpu us)系統則面臨著CPU資源的短缺。

當發生以上問題的時候請先調整應用程序對CPU的占用情況.使得應用程序能夠更有效的使用CPU.同時可以考慮增加更多的CPU. 關于CPU的使用情況還可以結合mpstat, ps aux top prstat –a等等一些相應的命令來綜合考慮關于具體的CPU的使用情況,和那些進程在占用大量的CPU時間.一般情況下,應用程序的問題會比較大一些.比如一些sql語句不合理等等都會造成這樣的現象.

4. 內存問題現象:

內存的瓶頸是由scan rate (sr)來決定的.scan rate是通過每秒的始終算法來進行頁掃描的.如果scan rate(sr)連續的大于每秒200頁則表示可能存在內存缺陷.同樣的如果page項中的pi和po這兩欄表示每秒頁面的調入的頁數和每秒調出的頁數.如果該值經常為非零值,也有可能存在內存的瓶頸,當然,如果個別的時候不為0的話,屬于正常的頁面調度這個是虛擬內存的主要原理.

解決辦法:

  • 1.調節Applications & servers使得對內存和cache的使用更加有效.
  • 2.增加系統的內存.
  • 3.Implement priority paging in s in pre solaris 8 versions by adding line "set priority paging=1" in /etc/system. Remove this line if upgrading from Solaris 7 to 8 & retaining old /etc/system file.

關于內存的使用情況還可以結ps aux top prstat –a等等一些相應的命令來綜合考慮關于具體的內存的使用情況,和那些進程在占用大量的內存.

一般情況下,如果內存的占用率比較高,但是,CPU的占用很低的時候,可以考慮是有很多的應用程序占用了內存沒有釋放,但是,并沒有占用CPU時間,可以考慮應用程序,對于未占用CPU時間和一些后臺的程序,釋放內存的占用。

r 表示運行隊列(就是說多少個進程真的分配到CPU),我測試的服務器目前CPU比較空閑,沒什么程序在跑,當這個值超過了CPU數目,就會出現CPU瓶頸了。

這個也和top的負載有關系,一般負載超過了3就比較高,超過了5就高,超過了10就不正常了,服務器的狀態很危險。

top的負載類似每秒的運行隊列。如果運行隊列過大,表示你的CPU很繁忙,一般會造成CPU使用率很高。

5. 常見性能問題分析

IO/CPU/men連鎖反應

1.free急劇下降
2.buff和cache被回收下降,但也無濟于事
3.依舊需要使用大量swap交換分區swpd
4.等待進程數,b增多
5.讀寫IO,bi bo增多
6.si so大于0開始從硬盤中讀取
7.cpu等待時間用于 IO等待,wa增加

內存不足

1.開始使用swpd,swpd不為0
2.si so大于0開始從硬盤中讀取

io瓶頸

1.讀寫IO,bi bo增多超過2000
2.cpu等待時間用于 IO等待,wa增加 超過20
3.sy 系統調用時間長,IO操作頻繁會導致增加 >30%
4.wa io等待時間長
    iowait% <20%            良好
    iowait% <35%            一般
    iowait% >50%
5.進一步使用IOStat觀察

CPU瓶頸:load,vmstat中r列

    1.反應為CPU隊列長度
    2.一段時間內,CPU正在處理和等待CPU處理的進程數之和,直接反應了CPU的使用和申請情況。
    3.理想的load average:核數*CPU數*0.7
        CPU個數:grep 'physical id' /proc/cpuinfo | sort -u
        核數:grep 'core id' /proc/cpuinfo | sort -u | wc -l
    4.超過這個值就說明已經是CPU瓶頸了

三、/proc/meminfo

用途: 用于從/proc文件系統中提取與內存相關的信息。這些文件包含有 系統和內核的內部信息。 其實 free 命令中的信息都來自于 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息,只是看起來不太直觀。

1. 查看方法:

cat /proc/meminfo

2. 實例及信息解釋

peng@ubuntu:~$ cat /proc/meminfo
MemTotal:        2017504 kB //所有可用的內存大小,
物理內存減去預留位和內核使用。系統從加電開始到引導完成,firmware/BIOS要預留一
些內存,內核本身要占用一些內存,最后剩下可供內核支配的內存就是MemTotal。這個值
在系統運行期間一般是固定不變的,重啟會改變。
MemFree:          511052 kB //表示系統尚未使用的內存。
MemAvailable:     640336 kB //真正的系統可用內存,
系統中有些內存雖然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可
以回收,所以這部分可回收的內存加上MemFree才是系統可用的內存
Buffers:          114348 kB //用來給塊設備做緩存的內存,(文件系統的 metadata、pages)
Cached:           162264 kB //分配給文件緩沖區的內存,例如vi一個文件,就會將未保存的內容寫到該緩沖區
SwapCached:         3032 kB //被高速緩沖存儲用的交換空間(硬盤的swap)的大小
Active:           555484 kB //經常使用的高速緩沖存儲器頁面文件大小
Inactive:         295984 kB //不經常使用的高速緩沖存儲器文件大小
Active(anon):     381020 kB //活躍的匿名內存
Inactive(anon):   244068 kB //不活躍的匿名內存
Active(file):     174464 kB //活躍的文件使用內存
Inactive(file):    51916 kB //不活躍的文件使用內存
Unevictable:          48 kB //不能被釋放的內存頁
Mlocked:              48 kB //系統調用 mlock 
SwapTotal:        998396 kB //交換空間總內存
SwapFree:         843916 kB //交換空間空閑內存
Dirty:               128 kB //等待被寫回到磁盤的
Writeback:             0 kB //正在被寫回的
AnonPages:        572776 kB //未映射頁的內存/映射到用戶空間的非文件頁表大小
Mapped:           119816 kB //映射文件內存
Shmem:             50212 kB //已經被分配的共享內存
Slab:             113700 kB  //內核數據結構緩存
SReclaimable:      68652 kB //可收回slab內存
SUnreclaim:        45048 kB //不可收回slab內存
KernelStack:        8812 kB //內核消耗的內存
PageTables:        27428 kB //管理內存分頁的索引表的大小
NFS_Unstable:          0 kB //不穩定頁表的大小
Bounce:                0 kB //在低端內存中分配一個臨時buffer作為跳轉,把位
于高端內存的緩存數據復制到此處消耗的內存
WritebackTmp:          0 kB //FUSE用于臨時寫回緩沖區的內存
CommitLimit:     2007148 kB //系統實際可分配內存
Committed_AS:    3567280 kB //系統當前已分配的內存
VmallocTotal:   34359738367 kB //預留的虛擬內存總量
VmallocUsed:           0 kB //已經被使用的虛擬內存
VmallocChunk:          0 kB //可分配的最大的邏輯連續的虛擬內存
HardwareCorrupted:     0 kB //表示“中毒頁面”中的內存量
即has failed的內存(通常由ECC標記). ECC代表“糾錯碼”. ECC memory能夠糾正小錯誤并檢測較大錯誤;
在具有非ECC內存的典型PC上,內存錯誤未被檢測到.如果使用ECC檢測到無法糾正的錯誤(在內存或緩存中,
具體取決于系統的硬件支持),則Linux內核會將相應的頁面標記為中毒.
AnonHugePages:         0 kB //匿名大頁
【/proc/meminfo的AnonHugePages==所有進程的/proc/<pid>/smaps中AnonHugePages之和】
ShmemHugePages:        0 kB  //用于共享內存的大頁
ShmemPmdMapped:        0 kB
CmaTotal:              0 kB //連續內存區管理總量
CmaFree:               0 kB //連續內存區管理空閑量
HugePages_Total:       0    //預留HugePages的總個數
HugePages_Free:        0    //池中尚未分配的 HugePages 數量,
真正空閑的頁數等于HugePages_Free - HugePages_Rsvd
HugePages_Rsvd:        0    //表示池中已經被應用程序分配但尚未使用的 HugePages 數量
HugePages_Surp:        0    //這個值得意思是當開始配置了20個大頁,現在修改配置為16,那么這個參數就會顯示為4,一般不修改配置,這個值都是0
Hugepagesize:       2048 kB //大內存頁的size
//指直接映射(direct mapping)的內存大小,從代碼上來看,值記錄管理頁表占用的內存,就是描述線性映射空間中,有多個空間分別使用了2M/4K/1G頁映射
DirectMap4k:       96128 kB
DirectMap2M:     2000896 kB 
DirectMap1G:           0 kB

注意這個文件顯示的單位是kB而不是KB,1kB=1000B,但是實際上應該是KB,1KB=1024B

還可以使用命令 less /proc/meminfo 直接讀取該文件。通過使用 less 命令,可以在長長的輸出中向上和向下滾動,找到你需要的內容。

從中我們可以很清晰明了的看出內存中的各種指標情況,例如 MemFree的空閑內存和SwapFree中的交換內存。

3. 代碼實例

負責輸出/proc/meminfo的源代碼是:

fs/proc/meminfo.c : meminfo_proc_show()
static int meminfo_proc_show(struct seq_file *m, void *v)
{
 struct sysinfo i;
 unsigned long committed;
 long cached;
 long available;
 unsigned long pages[NR_LRU_LISTS];
 int lru;
 
 si_meminfo(&i);
 si_swapinfo(&i);
 committed = percpu_counter_read_positive(&vm_committed_as);
 
 cached = global_node_page_state(NR_FILE_PAGES) -
   total_swapcache_pages() - i.bufferram;
 if (cached < 0)
  cached = 0;
 
 for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
  pages[lru] = global_node_page_state(NR_LRU_BASE + lru);
 
 available = si_mem_available();
 
 show_val_kb(m, "MemTotal:       ", i.totalram);
 show_val_kb(m, "MemFree:        ", i.freeram);
 show_val_kb(m, "MemAvailable:   ", available);
 show_val_kb(m, "Buffers:        ", i.bufferram);
 show_val_kb(m, "Cached:         ", cached);
 show_val_kb(m, "SwapCached:     ", total_swapcache_pages());
 show_val_kb(m, "Active:         ", pages[LRU_ACTIVE_ANON] +
        pages[LRU_ACTIVE_FILE]);
 show_val_kb(m, "Inactive:       ", pages[LRU_INACTIVE_ANON] +
        pages[LRU_INACTIVE_FILE]);
 show_val_kb(m, "Active(anon):   ", pages[LRU_ACTIVE_ANON]);
 show_val_kb(m, "Inactive(anon): ", pages[LRU_INACTIVE_ANON]);
 show_val_kb(m, "Active(file):   ", pages[LRU_ACTIVE_FILE]);
 show_val_kb(m, "Inactive(file): ", pages[LRU_INACTIVE_FILE]);
 show_val_kb(m, "Unevictable:    ", pages[LRU_UNEVICTABLE]);
 show_val_kb(m, "Mlocked:        ", global_zone_page_state(NR_MLOCK));
 
#ifdef CONFIG_HIGHMEM
 show_val_kb(m, "HighTotal:      ", i.totalhigh);
 show_val_kb(m, "HighFree:       ", i.freehigh);
 show_val_kb(m, "LowTotal:       ", i.totalram - i.totalhigh);
 show_val_kb(m, "LowFree:        ", i.freeram - i.freehigh);
#endif
 
#ifndef CONFIG_MMU
 show_val_kb(m, "MmapCopy:       ",
      (unsigned long)atomic_long_read(&mmap_pages_allocated));
#endif
 
 show_val_kb(m, "SwapTotal:      ", i.totalswap);
 show_val_kb(m, "SwapFree:       ", i.freeswap);
 show_val_kb(m, "Dirty:          ",
      global_node_page_state(NR_FILE_DIRTY));
 show_val_kb(m, "Writeback:      ",
      global_node_page_state(NR_WRITEBACK));
 show_val_kb(m, "AnonPages:      ",
      global_node_page_state(NR_ANON_MAPPED));
 show_val_kb(m, "Mapped:         ",
      global_node_page_state(NR_FILE_MAPPED));
 show_val_kb(m, "Shmem:          ", i.sharedram);
 show_val_kb(m, "Slab:           ",
      global_node_page_state(NR_SLAB_RECLAIMABLE) +
      global_node_page_state(NR_SLAB_UNRECLAIMABLE));
 
 show_val_kb(m, "SReclaimable:   ",
      global_node_page_state(NR_SLAB_RECLAIMABLE));
 show_val_kb(m, "SUnreclaim:     ",
      global_node_page_state(NR_SLAB_UNRECLAIMABLE));
 seq_printf(m, "KernelStack:    %8lu kBn",
     global_zone_page_state(NR_KERNEL_STACK_KB));
 show_val_kb(m, "PageTables:     ",
      global_zone_page_state(NR_PAGETABLE));
#ifdef CONFIG_QUICKLIST
 show_val_kb(m, "Quicklists:     ", quicklist_total_size());
#endif
 
 show_val_kb(m, "NFS_Unstable:   ",
      global_node_page_state(NR_UNSTABLE_NFS));
 show_val_kb(m, "Bounce:         ",
      global_zone_page_state(NR_BOUNCE));
 show_val_kb(m, "WritebackTmp:   ",
      global_node_page_state(NR_WRITEBACK_TEMP));
 show_val_kb(m, "CommitLimit:    ", vm_commit_limit());
 show_val_kb(m, "Committed_AS:   ", committed);
 seq_printf(m, "VmallocTotal:   %8lu kBn",
     (unsigned long)VMALLOC_TOTAL >> 10);
 show_val_kb(m, "VmallocUsed:    ", 0ul);
 show_val_kb(m, "VmallocChunk:   ", 0ul);
 
#ifdef CONFIG_MEMORY_FAILURE
 seq_printf(m, "HardwareCorrupted: %5lu kBn",
     atomic_long_read(&num_poisoned_pages) << (PAGE_SHIFT - 10));
#endif
 
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
 show_val_kb(m, "AnonHugePages:  ",
      global_node_page_state(NR_ANON_THPS) * HPAGE_PMD_NR);
 show_val_kb(m, "ShmemHugePages: ",
      global_node_page_state(NR_SHMEM_THPS) * HPAGE_PMD_NR);
 show_val_kb(m, "ShmemPmdMapped: ",
      global_node_page_state(NR_SHMEM_PMDMAPPED) * HPAGE_PMD_NR);
#endif
 
#ifdef CONFIG_CMA
 show_val_kb(m, "CmaTotal:       ", totalcma_pages);
 show_val_kb(m, "CmaFree:        ",
      global_zone_page_state(NR_FREE_CMA_PAGES));
#endif
 
 hugetlb_report_meminfo(m);
 
 arch_report_meminfo(m);
 
 return 0;
}

四、top 指令

用途: 用于打印系統中的CPU和內存使用情況。 輸出結果中,可以很清晰的看出已用和可用內存的資源情況。top 最好的地方之一就是發現可能已經失控的服務的進程 ID 號(PID)。有了這些 PID,你可以對有問題的任務進行故障排除(或 kill)。

語法

top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]

參數說明:

d : 改變顯示的更新速度,或是在交談式指令列( interactive command)按 s
q : 沒有任何延遲的顯示速度,如果使用者是有 superuser 的權限,則 top 將會以最高的優先序執行
c : 切換顯示模式,共有兩種模式,一是只顯示執行檔的名稱,另一種是顯示完整的路徑與名稱
S : 累積模式,會將己完成或消失的子進程 ( dead child process ) 的 CPU time 累積起來
s : 安全模式,將交談式指令取消, 避免潛在的危機
i : 不顯示任何閑置 (idle) 或無用 (zombie) 的進程
n : 更新的次數,完成后將會退出 top
b : 批次檔模式,搭配 "n" 參數一起使用,可以用來將 top 的結果輸出到檔案內

舉例

Linux內存占用常用的幾個分析方法,你確定都知道?

 

第一行,任務隊列信息,同 uptime 命令的執行結果

系統時間:02:19:10 運行時間:up 2:26 min, 當前登錄用戶: 1 user 負載均衡(uptime) load average: 0.00, 0.06, 0.07 average后面的三個數分別是1分鐘、5分鐘、15分鐘的負載情況。 load average數據是每隔5秒鐘檢查一次活躍的進程數,然后按特定算法計算出的數值。如果這個數除以邏輯CPU的數量,結果高于5的時候就表明系統在超負荷運轉了

第二行,Tasks — 任務(進程)

總進程:229 total, 運行:1 running, 休眠:163 sleeping, 停止: 0 stopped, 僵尸進程: 0 zombie

第三行,cpu狀態信息

0.7%us【user space】— 用戶空間占用CPU的百分比。 1.0%sy【sysctl】— 內核空間占用CPU的百分比。 0.0%ni【】— 改變過優先級的進程占用CPU的百分比 97.9%id【idolt】— 空閑CPU百分比 0.3%wa【wait】— IO等待占用CPU的百分比 0.0%hi【Hardware IRQ】— 硬中斷占用CPU的百分比 0.0%si【Software Interrupts】— 軟中斷占用CPU的百分比

第四行,內存狀態

2017504 total, 653616 free, 1154200 used, 209688 buff/cache【緩存的內存量】

第五行,swap交換分區信息

998396 total, 771068 free, 227328 used. 635608 avail Mem

第七行以下:各進程(任務)的狀態監控

PID — 進程id USER — 進程所有者 PR — 進程優先級 NI — nice值。負值表示高優先級,正值表示低優先級 VIRT — 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES RES — 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA SHR — 共享內存大小,單位kb S —進程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=僵尸進程 %CPU — 上次更新到現在的CPU時間占用百分比 %MEM — 進程使用的物理內存百分比 TIME+ — 進程使用的CPU時間總計,單位1/100秒 COMMAND — 進程名稱(命令名/命令行)

常用實例

  • 顯示進程信息
# top
  • 顯示完整命令
# top -c
  • 以批處理模式顯示程序信息
# top -b
  • 以累積模式顯示程序信息
# top -S
  • 設置信息更新次數
top -n 2

//表示更新兩次后終止更新顯示

  • 設置信息更新時間
# top -d 3

//表示更新周期為3秒

  • 顯示指定的進程信息
# top -p 139

//顯示進程號為139的進程信息,CPU、內存占用率等

  • 顯示更新十次后退出
top -n 10

五、htop 指令

htop 它類似于 top 命令,但可以讓你在垂直和水平方向上滾動,所以你可以看到系統上運行的所有進程,以及他們完整的命令行。

可以不用輸入進程的 PID 就可以對此進程進行相關的操作 (killing, renicing)。

htop快照:

Linux內存占用常用的幾個分析方法,你確定都知道?

 

可以使用快捷鍵

F1,h,?:查看htop使用說明,
F2,s  :設置選項
F3,/  :搜索進程
F4,  :過濾器,輸入關鍵字搜索
F5,t  :顯示屬性結構
F6,<,>:選擇排序方式
F7, [,:減少進程的優先級(nice)
F8,] :增加進程的優先級(nice)
F9,k :殺掉選中的進程
F10,q:退出htop
u:顯示所有用戶,并可以選中某一特定用戶的進程
U:取消標記所有的進程

第1行-第4行:顯示CPU當前的運行負載,有幾核就有幾行,我的是1核

Mem: 顯示內存的使用情況,3887M大概是3.8G,此時的Mem不包含buffers和cached的內存,所以和free -m會不同 Swp: 顯示交換空間的使用情況,交換空間是當內存不夠和其中有一些長期不用的數據時,ubuntu會把這些暫時放到交換空間中

其他信息可以參考top命令說明。

PS:如果你終端沒安裝 htop,先通過指令來安裝。 sudo apt-get update sudo apt install htop

六、查看制定進程的內存

通過/proc/procid/status查看進程內存

peng@ubuntu:~$ cat /proc/4398/status
Name: kworker/0:0    //進程名
Umask: 0000
State: I (idle)   //進程的狀態
//R (running)", "S (sleeping)", "D (disk sleep)", "T (stopped)", "T(tracing stop)", "Z (zombie)", or "X (dead)"
Tgid: 4398 //線程組的ID,一個線程一定屬于一個線程組(進程組).
Ngid: 0
Pid: 4398 //進程的ID,更準確的說應該是線程的ID.
PPid: 2  //當前進程的父進程
TracerPid: 0 //跟蹤當前進程的進程ID,如果是0,表示沒有跟蹤
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 64 //當前分配的文件描述符,該值不是上限,如果打開文件超過64個文件描述符,將以64進行遞增
Groups: //啟動這個進程的用戶所在的組
NStgid: 4398
NSpid: 4398
NSpgid: 0
NSsid: 0
Threads: 1
SigQ: 0/7640
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: ffffffffffffffff
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 0000003fffffffff
CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
NoNewPrivs: 0
Seccomp: 0
Speculation_Store_Bypass: vulnerable
Cpus_allowed: 00000000,00000000,00000000,00000001
Cpus_allowed_list: 0
Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 5
nonvoluntary_ctxt_switches: 0

總結:

確定內存使用情況是Linux運維工程師必要的技能,尤其是某個應用程序變得異常和占用系統內存時。當發生這種情況時,知道有多種工具可以幫助你進行故障排除十分方便的。

分享到:
標簽:內存 Linux
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定