溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux中性能監(jiān)控和優(yōu)化命令分別是哪些呢

發(fā)布時(shí)間:2021-10-09 14:39:06 來源:億速云 閱讀:111 作者:柒染 欄目:系統(tǒng)運(yùn)維

Linux中性能監(jiān)控和優(yōu)化命令分別是哪些呢,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

1 top命令

top 命令是 Linux 下常用的性能分析工具,能夠?qū)崟r(shí)顯示系統(tǒng)中各個(gè)進(jìn)程的資源占用狀況,類似于 Windows 的任務(wù)管理器。

下面詳細(xì)介紹它的使用方法。top 是一個(gè)動(dòng)態(tài)顯示過程,即可以通過用戶按鍵來不斷刷新當(dāng)前狀態(tài)。如果在前臺(tái)執(zhí)行該命令,它將獨(dú)占前臺(tái),直到用戶終止該程序?yàn)橹埂?/p>

比較準(zhǔn)確的說,top 命令提供了實(shí)時(shí)的對(duì)系統(tǒng)處理器的狀態(tài)監(jiān)視。它將顯示系統(tǒng)中 CPU最“敏感”的任務(wù)列表。該命令可以按 CPU 使用。

內(nèi)存使用和執(zhí)行時(shí)間對(duì)任務(wù)進(jìn)行排序;而且該命令的很多特性都可以通過交互式命令或者在個(gè)人定制文件中進(jìn)行設(shè)定。

命令格式:

top [參數(shù)]

命令功能:

顯示當(dāng)前系統(tǒng)正在執(zhí)行的進(jìn)程的相關(guān)信息,包括進(jìn)程ID、內(nèi)存占用率、CPU占用率等

命令參數(shù):

  •  -b 批處理

  •  -c 顯示完整的治命令

  •  -I 忽略失效過程

  •  -s 保密模式

  •  -S 累積模式

  •  -i<時(shí)間> 設(shè)置間隔時(shí)間

  •  -u<用戶名> 指定用戶名

  •  -p<進(jìn)程號(hào)> 指定進(jìn)程

  •  -n<次數(shù)> 循環(huán)顯示的次數(shù)

4.使用實(shí)例:

實(shí)例1:顯示進(jìn)程信息

命令:top

輸出:

[root@TG1704 log]# toptop - 14:06:23 up 70 days, 16:44,  2 users,  load average: 1.25, 1.32, 1.35Tasks: 206 total,   1 running, 205 sleeping,   0 stopped,   0 zombie Cpu(s):  5.9%us,  3.4%sy,  0.0%ni, 90.4%id,  0.0%wa,  0.0%hi,  0.2%si,  0.0%st Mem:  32949016k total, 14411180k used, 18537836k free,   169884k buffers  Swap: 32764556k total,        0k used, 32764556k free,  3612636k cached    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                              28894 root      22   0 1501m 405m  10m S 52.2  1.3   2534:16 java                                                                    18249 root      18   0 3201m 1.9g  11m S 35.9  6.0 569:39.41 java                                                                     2808 root      25   0 3333m 1.0g  11m S 24.3  3.1 526:51.85 java                                                                   25668 root      23   0 3180m 704m  11m S 14.0  2.2 360:44.53 java                                                                      574 root      25   0 3168m 611m  10m S 12.6  1.9 556:59.63 java                                                                     1599 root      20   0 3237m 1.9g  11m S 12.3  6.2 262:01.14 java                                                                     1008 root      21   0 3147m 842m  10m S  0.3  2.6   4:31.08 java                                                                    13823 root      23   0 3031m 2.1g  10m S  0.3  6.8 176:57.34 java                                                                    28218 root      15   0 12760 1168  808 R  0.3  0.0   0:01.43 top                                                                     29062 root      20   0 1241m 227m  10m S  0.3  0.7   2:07.32 java                                                                        1 root      15   0 10368  684  572 S  0.0  0.0   1:30.85 init                                                                        2 root      RT  -5     0    0    0 S  0.0  0.0   0:01.01 migration/0                                                                 3 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0                                                                 4 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/0                                                                5 root      RT  -5     0    0    0 S  0.0  0.0   0:00.80 migration/1                                                                 6 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/1                                                                 7 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/1                                                                  8 root      RT  -5     0    0    0 S  0.0  0.0   0:20.59 migration/2                                                                 9 root      34  19     0    0    0 S  0.0  0.0   0:00.09 ksoftirqd/2                                                                10 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/2                                                                 11 root      RT  -5     0    0    0 S  0.0  0.0   0:23.66 migration/3                                                                12 root      34  19     0    0    0 S  0.0  0.0   0:00.03 ksoftirqd/3                                                                13 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/3                                                                 14 root      RT  -5     0    0    0 S  0.0  0.0   0:20.29 migration/4                                                                15 root      34  19     0    0    0 S  0.0  0.0   0:00.07 ksoftirqd/4                                                                16 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/4                                                                 17 root      RT  -5     0    0    0 S  0.0  0.0   0:23.07 migration/5                                                                18 root      34  19     0    0    0 S  0.0  0.0   0:00.07 ksoftirqd/5                                                                19 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/5                                                                 20 root      RT  -5     0    0    0 S  0.0  0.0   0:17.16 migration/6                                                                21 root      34  19     0    0    0 S  0.0  0.0   0:00.05 ksoftirqd/6                                                                22 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/6                                                                 23 root      RT  -5     0    0    0 S  0.0  0.0   0:58.28 migration/7

說明:

統(tǒng)計(jì)信息區(qū):前五行是當(dāng)前系統(tǒng)情況整體的統(tǒng)計(jì)信息區(qū)。下面我們看每一行信息的具體意義。

第一行,任務(wù)隊(duì)列信息,同 uptime 命令的執(zhí)行結(jié)果,具體參數(shù)說明情況如下:

  •  14:06:23:當(dāng)前系統(tǒng)時(shí)間

  •  up 70 days, 16:44:系統(tǒng)已經(jīng)運(yùn)行了70天16小時(shí)44分鐘(在這期間系統(tǒng)沒有重啟過的吆?。?/p>

  •  2 users:當(dāng)前有2個(gè)用戶登錄系統(tǒng)

  •  load average: 1.15, 1.42, 1.44:load average 后面的三個(gè)數(shù)分別是1分鐘、5分鐘、15分鐘的負(fù)載情況。

  •  load average 數(shù)據(jù)是每隔 5 秒鐘檢查一次活躍的進(jìn)程數(shù),然后按特定算法計(jì)算出的數(shù)值。如果這個(gè)數(shù)除以邏輯 CPU 的數(shù)量,結(jié)果高于5的時(shí)候就表明系統(tǒng)在超負(fù)荷運(yùn)轉(zhuǎn)了。

第二行,Tasks &mdash; 任務(wù)(進(jìn)程),具體信息說明如下:

系統(tǒng)現(xiàn)在共有 206 個(gè)進(jìn)程,其中處于運(yùn)行中的有1個(gè),205 個(gè)在休眠(sleep),stoped狀態(tài)的有0個(gè),zombie 狀態(tài)(僵尸)的有0個(gè)。

第三行,cpu狀態(tài)信息,具體屬性說明如下:

  •  5.9%us:用戶空間占用CPU的百分比。

  •  3.4% sy:內(nèi)核空間占用CPU的百分比。

  •  0.0% ni:改變過優(yōu)先級(jí)的進(jìn)程占用CPU的百分比

  •  90.4% id:空閑CPU百分比

  •  0.0% wa:IO等待占用CPU的百分比

  •  0.0% hi:硬中斷(Hardware IRQ)占用CPU的百分比

  •  0.2% si:軟中斷(Software Interrupts)占用CPU的百分比

備注:在這里CPU的使用比率和windows概念不同,需要理解linux系統(tǒng)用戶空間和內(nèi)核空間的相關(guān)知識(shí)!

第四行,內(nèi)存狀態(tài),具體信息如下:

  •  32949016k total &mdash; 物理內(nèi)存總量(32GB)

  •  14411180k used &mdash; 使用中的內(nèi)存總量(14GB)

  •  18537836k free &mdash; 空閑內(nèi)存總量(18GB)

  •  169884k buffers &mdash; 緩存的內(nèi)存量 (169M)

第五行,swap交換分區(qū)信息,具體信息說明如下:

  •  32764556k total &mdash; 交換區(qū)總量(32GB)

  •  0k used &mdash; 使用的交換區(qū)總量(0K)

  •  32764556k free &mdash; 空閑交換區(qū)總量(32GB)

  •  3612636k cached &mdash; 緩沖的交換區(qū)總量(3.6GB)

備注:

第四行中使用中的內(nèi)存總量(used)指的是現(xiàn)在系統(tǒng)內(nèi)核控制的內(nèi)存數(shù),空閑內(nèi)存總量(free)是內(nèi)核還未納入其管控范圍的數(shù)量。納入內(nèi)核管理的內(nèi)存不見得都在使用中,還包括過去使用過的現(xiàn)在可以被重復(fù)利用的內(nèi)存,內(nèi)核并不把這些可被重新使用的內(nèi)存交還到free中去,因此在linux上free內(nèi)存會(huì)越來越少,但不用為此擔(dān)心。

如果出于習(xí)慣去計(jì)算可用內(nèi)存數(shù),這里有個(gè)近似的計(jì)算公式:第四行的free + 第四行的buffers + 第五行的 cached,按這個(gè)公式此臺(tái)服務(wù)器的可用內(nèi)存:18537836k +169884k +3612636k = 22GB左右。

對(duì)于內(nèi)存監(jiān)控,在 top 里我們要時(shí)刻監(jiān)控第五行 swap 交換分區(qū)的used,如果這個(gè)數(shù)值在不斷的變化,說明內(nèi)核在不斷進(jìn)行內(nèi)存和swap的數(shù)據(jù)交換,這是真正的內(nèi)存不夠用了。

第六行,空行。

第七行以下:各進(jìn)程(任務(wù))的狀態(tài)監(jiān)控,項(xiàng)目列信息說明如下:

  •  PID:進(jìn)程id

  •  USER:進(jìn)程所有者

  •  PR:進(jìn)程優(yōu)先級(jí)

  •  NI:nice值。負(fù)值表示高優(yōu)先級(jí),正值表示低優(yōu)先級(jí)

  •  VIRT:進(jìn)程使用的虛擬內(nèi)存總量,單位kb。VIRT=SWAP+RES

  •  RES:進(jìn)程使用的、未被換出的物理內(nèi)存大小,單位kb。RES=CODE+DATA

  •  SHR:共享內(nèi)存大小,單位kb

  •  S:進(jìn)程狀態(tài)。D=不可中斷的睡眠狀態(tài) R=運(yùn)行 S=睡眠 T=跟蹤/停止 Z=僵尸進(jìn)程

  •  %CPU:上次更新到現(xiàn)在的CPU時(shí)間占用百分比

  •  %MEM:進(jìn)程使用的物理內(nèi)存百分比

  •  TIME+:進(jìn)程使用的CPU時(shí)間總計(jì),單位1/100秒

  •  COMMAND:進(jìn)程名稱(命令名/命令行)

其他使用技巧:

1.多U多核CPU監(jiān)控

在top基本視圖中,按鍵盤數(shù)字“1”,可監(jiān)控每個(gè)邏輯CPU的狀況:

Linux中性能監(jiān)控和優(yōu)化命令分別是哪些呢

觀察上圖,服務(wù)器有16個(gè)邏輯CPU,實(shí)際上是4個(gè)物理CPU。再按數(shù)字鍵1,就會(huì)返回到top基本視圖界面。

2.高亮顯示當(dāng)前運(yùn)行進(jìn)程

敲擊鍵盤“b”(打開/關(guān)閉加亮效果),top的視圖變化如下:

Linux中性能監(jiān)控和優(yōu)化命令分別是哪些呢

我們發(fā)現(xiàn)進(jìn)程id為2570的“top”進(jìn)程被加亮了,top進(jìn)程就是視圖第二行顯示的唯一的運(yùn)行態(tài)(runing)的那個(gè)進(jìn)程,可以通過敲擊“y”鍵關(guān)閉或打開運(yùn)行態(tài)進(jìn)程的加亮效果。

3.進(jìn)程字段排序

默認(rèn)進(jìn)入top時(shí),各進(jìn)程是按照CPU的占用量來排序的,在下圖中進(jìn)程ID為28894的java進(jìn)程排在第一(cpu占用142%),進(jìn)程ID為574的java進(jìn)程排在第二(cpu占用16%)。

Linux中性能監(jiān)控和優(yōu)化命令分別是哪些呢

敲擊鍵盤“x”(打開/關(guān)閉排序列的加亮效果),top的視圖變化如下:

Linux中性能監(jiān)控和優(yōu)化命令分別是哪些呢

可以看到,top默認(rèn)的排序列是“%CPU”。

4.通過”shift + >”或”shift + <”可以向右或左改變排序列

下圖是按一次”shift + >”的效果圖,視圖現(xiàn)在已經(jīng)按照%MEM來排序。

2、free 命令

free命令可以顯示Linux系統(tǒng)中空閑的、已用的物理內(nèi)存及swap內(nèi)存,及被內(nèi)核使用的buffer。在Linux系統(tǒng)監(jiān)控的工具中,free命令是最經(jīng)常使用的命令之一。

1.命令格式:

free [參數(shù)]

2.命令功能:

free 命令顯示系統(tǒng)使用和空閑的內(nèi)存情況,包括物理內(nèi)存、交互區(qū)內(nèi)存(swap)和內(nèi)核緩沖區(qū)內(nèi)存。共享內(nèi)存將被忽略

3.命令參數(shù):

  •  -b  以Byte為單位顯示內(nèi)存使用情況。

  •  -k  以KB為單位顯示內(nèi)存使用情況。

  •  -m  以MB為單位顯示內(nèi)存使用情況。

  •  -g   以GB為單位顯示內(nèi)存使用情況。

  •  -o  不顯示緩沖區(qū)調(diào)節(jié)列。

  •  -s <間隔秒數(shù)>  持續(xù)觀察內(nèi)存使用狀況。

  •  -t  顯示內(nèi)存總和列。

  •  -V  顯示版本信息。

4.使用實(shí)例:

實(shí)例1:顯示內(nèi)存使用情況

命令:

free  free -g  free -m

輸出:

[root@SF1150 service]# free               total       used       free     shared    buffers     cached  Mem:      32940112   30841684    2098428          0    4545340   11363424-/+ buffers/cache:   14932920   18007192Swap:     32764556    1944984   30819572[root@SF1150 service]# free -g              total       used       free     shared    buffers     cached Mem:            31         29          2          0          4         10-/+ buffers/cache:         14         17Swap:           31          1         29[root@SF1150 service]# free -m              total       used       free     shared    buffers     cached Mem:         32168      30119       2048          0       4438      11097-/+ buffers/cache:      14583      17584Swap:        31996       1899      30097

說明:

下面是對(duì)這些數(shù)值的解釋:

  •  total:總計(jì)物理內(nèi)存的大小。

  •  used:已使用多大。

  •  free:可用有多少。

  •  Shared:多個(gè)進(jìn)程共享的內(nèi)存總額。

  •  Buffers/cached:磁盤緩存的大小。

第三行(-/+ buffers/cached):

  •  used:已使用多大。

  •  free:可用有多少。

第四行是交換分區(qū)SWAP的,也就是我們通常所說的虛擬內(nèi)存。

區(qū)別:第二行(mem)的used/free與第三行(-/+ buffers/cache) used/free的區(qū)別。

這兩個(gè)的區(qū)別在于使用的角度來看,第一行是從OS的角度來看,因?yàn)閷?duì)于OS,buffers/cached 都是屬于被使用,所以他的可用內(nèi)存是 2098428 KB,已用內(nèi)存是30841684KB,其中包括,內(nèi)核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached。

第三行所指的是從應(yīng)用程序角度來看,對(duì)于應(yīng)用程序來說,buffers/cached 是等于可用的,因?yàn)閎uffer/cached是為了提高文件讀取的性能,當(dāng)應(yīng)用程序需在用到內(nèi)存的時(shí)候,buffer/cached會(huì)很快地被回收。

所以從應(yīng)用程序的角度來說,可用內(nèi)存=系統(tǒng)free memory+buffers+cached。

如本機(jī)情況的可用內(nèi)存為:

18007156=2098428KB+4545340KB+11363424KB

接下來解釋什么時(shí)候內(nèi)存會(huì)被交換,以及按什么方交換。

當(dāng)可用內(nèi)存少于額定值的時(shí)候,就會(huì)開會(huì)進(jìn)行交換.如何看額定值:

命令:

cat /proc/meminfo

輸出:

[root@SF1150 service]# cat /proc/meminfoMemTotal:     32940112 kB  MemFree:       2096700 kB  Buffers:       4545340 kB  Cached:       11364056 kB  SwapCached:    1896080 kB  Active:       22739776 kB  Inactive:      7427836 kB  HighTotal:           0 kB  HighFree:            0 kB  LowTotal:     32940112 kB  LowFree:       2096700 kB  SwapTotal:    32764556 kB  SwapFree:     30819572 kB  Dirty:             164 kB  Writeback:           0 kB  AnonPages:    14153592 kB  Mapped:          20748 kB  Slab:           590232 kB  PageTables:      34200 kB  NFS_Unstable:        0 kB  Bounce:              0 kB  CommitLimit:  49234612 kB  Committed_AS: 23247544 kB  VmallocTotal: 34359738367 kB  VmallocUsed:    278840 kB  VmallocChunk: 34359459371 kB  HugePages_Total:     0HugePages_Free:      0HugePages_Rsvd:      0Hugepagesize:     2048 kB

交換將通過三個(gè)途徑來減少系統(tǒng)中使用的物理頁(yè)面的個(gè)數(shù): 

  1.  減少緩沖與頁(yè)面cache的大小,

  2.  將系統(tǒng)V類型的內(nèi)存頁(yè)面交換出去, 

  3.  換出或者丟棄頁(yè)面。(Application 占用的內(nèi)存頁(yè),也就是物理內(nèi)存不足)。

事實(shí)上,少量地使用swap是不是影響到系統(tǒng)性能的。

那 buffers 和 cached 都是緩存,兩者有什么區(qū)別呢?

為了提高磁盤存取效率,Linux 做了一些精心的設(shè)計(jì),除了對(duì) dentry 進(jìn)行緩存(用于VFS,加速文件路徑名到 inode 的轉(zhuǎn)換),還采取了兩種主要 Cache 方式:Buffer Cache 和Page Cache。前者針對(duì)磁盤塊的讀寫,后者針對(duì)文件 inode 的讀寫。這些 Cache 有效縮短了 I/O 系統(tǒng)調(diào)用(比如 read,write,getdents)的時(shí)間。

磁盤的操作有邏輯級(jí)(文件系統(tǒng))和物理級(jí)(磁盤塊),這兩種Cache就是分別緩存邏輯和物理級(jí)數(shù)據(jù)的。

Page cache 實(shí)際上是針對(duì)文件系統(tǒng)的,是文件的緩存,在文件層面上的數(shù)據(jù)會(huì)緩存到page cache。文件的邏輯層需要映射到實(shí)際的物理磁盤,這種映射關(guān)系由文件系統(tǒng)來完成。當(dāng) page cache 的數(shù)據(jù)需要刷新時(shí),page cache 中的數(shù)據(jù)交給 buffer cache,因?yàn)锽uffer Cache 就是緩存磁盤塊的。但是這種處理在 2.6 版本的內(nèi)核之后就變的很簡(jiǎn)單了,沒有真正意義上的 cache 操作。

Buffer cache 是針對(duì)磁盤塊的緩存,也就是在沒有文件系統(tǒng)的情況下,直接對(duì)磁盤進(jìn)行操作的數(shù)據(jù)會(huì)緩存到buffer cache中,例如,文件系統(tǒng)的元數(shù)據(jù)都會(huì)緩存到buffer cache中。

簡(jiǎn)單說來,page cache 用來緩存文件數(shù)據(jù),buffer cache 用來緩存磁盤數(shù)據(jù)。在有文件系統(tǒng)的情況下,對(duì)文件操作,那么數(shù)據(jù)會(huì)緩存到 page cache,如果直接采用dd等工具對(duì)磁盤進(jìn)行讀寫,那么數(shù)據(jù)會(huì)緩存到 buffer cache。

所以我們看linux,只要不用swap的交換空間,就不用擔(dān)心自己的內(nèi)存太少.如果常常swap用很多,可能你就要考慮加物理內(nèi)存了。這也是linux看內(nèi)存是否夠用的標(biāo)準(zhǔn)。

如果是應(yīng)用服務(wù)器的話,一般只看第二行,+buffers/cache,即對(duì)應(yīng)用程序來說free的內(nèi)存太少了,也是該考慮優(yōu)化程序或加內(nèi)存了。

實(shí)例2:以總和的形式顯示內(nèi)存的使用信息

命令:

free -t

輸出:

[root@SF1150 service]#  free -t                total       used       free     shared    buffers     cached  Mem:      32940112   30845024    2095088          0    4545340   11364324-/+ buffers/cache:   14935360   18004752Swap:     32764556    1944984   30819572Total:    65704668   32790008   32914660[root@SF1150 service]#

說明:

實(shí)例3:周期性的查詢內(nèi)存使用信息

命令:

free -s 10

輸出:

[root@SF1150 service]#  free -s 10               total       used       free     shared    buffers     cached  Mem:      32940112   30844528    2095584          0    4545340   11364380-/+ buffers/cache:   14934808   18005304Swap:     32764556    1944984   30819572               total       used       free     shared    buffers     cached  Mem:      32940112   30843932    2096180          0    4545340   11364388-/+ buffers/cache:   14934204   18005908Swap:     32764556    1944984   30819572

3、vmstat

vmstat是Virtual Meomory Statistics(虛擬內(nèi)存統(tǒng)計(jì))的縮寫,可對(duì)操作系統(tǒng)的虛擬內(nèi)存、進(jìn)程、CPU活動(dòng)進(jìn)行監(jiān)控。他是對(duì)系統(tǒng)的整體情況進(jìn)行統(tǒng)計(jì),不足之處是無法對(duì)某個(gè)進(jìn)程進(jìn)行深入分析。vmstat 工具提供了一種低開銷的系統(tǒng)性能觀察方式。因?yàn)?vmstat 本身就是低開銷工具,在非常高負(fù)荷的服務(wù)器上,你需要查看并監(jiān)控系統(tǒng)的健康情況,在控制窗口還是能夠使用vmstat 輸出結(jié)果。在學(xué)習(xí)vmstat命令前,我們先了解一下Linux系統(tǒng)中關(guān)于物理內(nèi)存和虛擬內(nèi)存相關(guān)信息。

物理內(nèi)存和虛擬內(nèi)存區(qū)別:

我們知道,直接從物理內(nèi)存讀寫數(shù)據(jù)要比從硬盤讀寫數(shù)據(jù)要快的多,因此,我們希望所有數(shù)據(jù)的讀取和寫入都在內(nèi)存完成,而內(nèi)存是有限的,這樣就引出了物理內(nèi)存與虛擬內(nèi)存的概念。

物理內(nèi)存就是系統(tǒng)硬件提供的內(nèi)存大小,是真正的內(nèi)存,相對(duì)于物理內(nèi)存,在linux下還有一個(gè)虛擬內(nèi)存的概念,虛擬內(nèi)存就是為了滿足物理內(nèi)存的不足而提出的策略,它是利用磁盤空間虛擬出的一塊邏輯內(nèi)存,用作虛擬內(nèi)存的磁盤空間被稱為交換空間(Swap Space)。

作為物理內(nèi)存的擴(kuò)展,linux會(huì)在物理內(nèi)存不足時(shí),使用交換分區(qū)的虛擬內(nèi)存,更詳細(xì)的說,就是內(nèi)核會(huì)將暫時(shí)不用的內(nèi)存塊信息寫到交換空間,這樣以來,物理內(nèi)存得到了釋放,這塊內(nèi)存就可以用于其free命令可以顯示Linux系統(tǒng)中空閑的、已用的物理內(nèi)存及swap內(nèi)存,及被內(nèi)核使用的buffer。在Linux系統(tǒng)監(jiān)控的工具中,free命令是最經(jīng)常使用的命令之一。

1.命令格式:

free [參數(shù)]

2.命令功能:

free 命令顯示系統(tǒng)使用和空閑的內(nèi)存情況,包括物理內(nèi)存、交互區(qū)內(nèi)存(swap)和內(nèi)核緩沖區(qū)內(nèi)存。共享內(nèi)存將被忽略

3.命令參數(shù):

  •  -b  以Byte為單位顯示內(nèi)存使用情況。

  •  -k  以KB為單位顯示內(nèi)存使用情況。

  •  -m  以MB為單位顯示內(nèi)存使用情況。

  •  -g   以GB為單位顯示內(nèi)存使用情況。

  •  -o  不顯示緩沖區(qū)調(diào)節(jié)列。

  •  -s<間隔秒數(shù)>  持續(xù)觀察內(nèi)存使用狀況。

  •   -t  顯示內(nèi)存總和列。

  •  -V  顯示版本信息。

4.使用實(shí)例:

實(shí)例1:顯示內(nèi)存使用情況

命令:

free  free -g  free -m

輸出:

[root@SF1150 service]# free               total       used       free     shared    buffers     cached  Mem:      32940112   30841684    2098428          0    4545340   11363424-/+ buffers/cache:   14932920   18007192Swap:     32764556    1944984   30819572[root@SF1150 service]# free -g               total       used       free     shared    buffers     cached  Mem:            31         29          2          0          4         10-/+ buffers/cache:         14         17Swap:           31          1         29[root@SF1150 service]# free -m               total       used       free     shared    buffers     cached  Mem:         32168      30119       2048          0       4438      11097-/+ buffers/cache:      14583      17584Swap:        31996       1899      30097

它目的,當(dāng)需要用到原始的內(nèi)容時(shí),這些信息會(huì)被重新從交換空間讀入物理內(nèi)存。

linux的內(nèi)存管理采取的是分頁(yè)存取機(jī)制,為了保證物理內(nèi)存能得到充分的利用,內(nèi)核會(huì)在適當(dāng)?shù)臅r(shí)候?qū)⑽锢韮?nèi)存中不經(jīng)常使用的數(shù)據(jù)塊自動(dòng)交換到虛擬內(nèi)存中,而將經(jīng)常使用的信息保留到物理內(nèi)存。

要深入了解linux內(nèi)存運(yùn)行機(jī)制,需要知道下面提到的幾個(gè)方面:

首先,Linux系統(tǒng)會(huì)不時(shí)的進(jìn)行頁(yè)面交換操作,以保持盡可能多的空閑物理內(nèi)存,即使并沒有什么事情需要內(nèi)存,Linux也會(huì)交換出暫時(shí)不用的內(nèi)存頁(yè)面。這可以避免等待交換所需的時(shí)間。

其次,linux進(jìn)行頁(yè)面交換是有條件的,不是所有頁(yè)面在不用時(shí)都交換到虛擬內(nèi)存,linux內(nèi)核根據(jù)”最近最經(jīng)常使用“算法,僅僅將一些不經(jīng)常使用的頁(yè)面文件交換到虛擬內(nèi)存,有時(shí)我們會(huì)看到這么一個(gè)現(xiàn)象:linux物理內(nèi)存還有很多,但是交換空間也使用了很多。其實(shí),這并不奇怪,例如,一個(gè)占用很大內(nèi)存的進(jìn)程運(yùn)行時(shí),需要耗費(fèi)很多內(nèi)存資源,此時(shí)就會(huì)有一些不常用頁(yè)面文件被交換到虛擬內(nèi)存中,但后來這個(gè)占用很多內(nèi)存資源的進(jìn)程結(jié)束并釋放了很多內(nèi)存時(shí),剛才被交換出去的頁(yè)面文件并不會(huì)自動(dòng)的交換進(jìn)物理內(nèi)存,除非有這個(gè)必要,那么此刻系統(tǒng)物理內(nèi)存就會(huì)空閑很多,同時(shí)交換空間也在被使用,就出現(xiàn)了剛才所說的現(xiàn)象了。關(guān)于這點(diǎn),不用擔(dān)心什么,只要知道是怎么一回事就可以了。

最后,交換空間的頁(yè)面在使用時(shí)會(huì)首先被交換到物理內(nèi)存,如果此時(shí)沒有足夠的物理內(nèi)存來容納這些頁(yè)面,它們又會(huì)被馬上交換出去,如此以來,虛擬內(nèi)存中可能沒有足夠空間來存儲(chǔ)這些交換頁(yè)面,最終會(huì)導(dǎo)致linux出現(xiàn)假死機(jī)、服務(wù)異常等問題,linux雖然可以在一段時(shí)間內(nèi)自行恢復(fù),但是恢復(fù)后的系統(tǒng)已經(jīng)基本不可用了。

因此,合理規(guī)劃和設(shè)計(jì)linux內(nèi)存的使用,是非常重要的。

虛擬內(nèi)存原理:

在系統(tǒng)中運(yùn)行的每個(gè)進(jìn)程都需要使用到內(nèi)存,但不是每個(gè)進(jìn)程都需要每時(shí)每刻使用系統(tǒng)分配的內(nèi)存空間。當(dāng)系統(tǒng)運(yùn)行所需內(nèi)存超過實(shí)際的物理內(nèi)存,內(nèi)核會(huì)釋放某些進(jìn)程所占用但未使用的部分或所有物理內(nèi)存,將這部分資料存儲(chǔ)在磁盤上直到進(jìn)程下一次調(diào)用,并將釋放出的內(nèi)存提供給有需要的進(jìn)程使用。

在Linux內(nèi)存管理中,主要是通過“調(diào)頁(yè)P(yáng)aging”和“交換Swapping”來完成上述的內(nèi)存調(diào)度。調(diào)頁(yè)算法是將內(nèi)存中最近不常使用的頁(yè)面換到磁盤上,把活動(dòng)頁(yè)面保留在內(nèi)存中供進(jìn)程使用。交換技術(shù)是將整個(gè)進(jìn)程,而不是部分頁(yè)面,全部交換到磁盤上。

分頁(yè)(Page)寫入磁盤的過程被稱作Page-Out,分頁(yè)(Page)從磁盤重新回到內(nèi)存的過程被稱作Page-In。當(dāng)內(nèi)核需要一個(gè)分頁(yè)時(shí),但發(fā)現(xiàn)此分頁(yè)不在物理內(nèi)存中(因?yàn)橐呀?jīng)被Page-Out了),此時(shí)就發(fā)生了分頁(yè)錯(cuò)誤(Page Fault)。

當(dāng)系統(tǒng)內(nèi)核發(fā)現(xiàn)可運(yùn)行內(nèi)存變少時(shí),就會(huì)通過Page-Out來釋放一部分物理內(nèi)存。經(jīng)管Page-Out不是經(jīng)常發(fā)生,但是如果Page-out頻繁不斷的發(fā)生,直到當(dāng)內(nèi)核管理分頁(yè)的時(shí)間超過運(yùn)行程式的時(shí)間時(shí),系統(tǒng)效能會(huì)急劇下降。這時(shí)的系統(tǒng)已經(jīng)運(yùn)行非常慢或進(jìn)入暫停狀態(tài),這種狀態(tài)亦被稱作thrashing(顛簸)。

1.命令格式: 

vmstat [-a] [-n] [-S unit] [delay [ count]]  vmstat [-s] [-n] [-S unit]  vmstat [-m] [-n] [delay [ count]]  vmstat [-d] [-n] [delay [ count]]  vmstat [-p disk partition] [-n] [delay [ count]]  vmstat [-f]  vmstat [-V]

2.命令功能:

用來顯示虛擬內(nèi)存的信息

3.命令參數(shù):

  •  -a:顯示活躍和非活躍內(nèi)存

  •  -f:顯示從系統(tǒng)啟動(dòng)至今的fork數(shù)量 。

  •  -m:顯示slabinfo

  •  -n:只在開始時(shí)顯示一次各字段名稱。

  •  -s:顯示內(nèi)存相關(guān)統(tǒng)計(jì)信息及多種系統(tǒng)活動(dòng)數(shù)量。

  •  delay:刷新時(shí)間間隔。如果不指定,只顯示一條結(jié)果。

  •  count:刷新次數(shù)。如果不指定刷新次數(shù),但指定了刷新時(shí)間間隔,這時(shí)刷新次數(shù)為無窮。

  •  -d:顯示磁盤相關(guān)統(tǒng)計(jì)信息。

  •  -p:顯示指定磁盤分區(qū)統(tǒng)計(jì)信息

  •  -S:使用指定單位顯示。參數(shù)有 k 、K 、m 、M ,分別代表1000、1024、1000000、1048576字節(jié)(byte)。默認(rèn)單位為K(1024 bytes)

  •   -V:顯示vmstat版本信息。

4.使用實(shí)例:

實(shí)例1:顯示虛擬內(nèi)存使用情況

命令:

vmstat

輸出:

說明:

字段說明:

  •  Procs(進(jìn)程):

  •  r: 運(yùn)行隊(duì)列中進(jìn)程數(shù)量

  •  b: 等待IO的進(jìn)程數(shù)量

  •  Memory(內(nèi)存):

  •  swpd: 使用虛擬內(nèi)存大小

  •  free: 可用內(nèi)存大小

  •  buff: 用作緩沖的內(nèi)存大小

  •  cache: 用作緩存的內(nèi)存大小

Swap:

  •  si: 每秒從交換區(qū)寫到內(nèi)存的大小

  •  so: 每秒寫入交換區(qū)的內(nèi)存大小

  •  IO:(現(xiàn)在的Linux版本塊的大小為1024bytes)

  •  bi: 每秒讀取的塊數(shù)

  •  bo: 每秒寫入的塊數(shù)

系統(tǒng):

  •  in: 每秒中斷數(shù),包括時(shí)鐘中斷。

  •  cs: 每秒上下文切換數(shù)。

  •  CPU(以百分比表示):

  •  us: 用戶進(jìn)程執(zhí)行時(shí)間(user time)

  •  sy: 系統(tǒng)進(jìn)程執(zhí)行時(shí)間(system time)

  •  id: 空閑時(shí)間(包括IO等待時(shí)間),中央處理器的空閑時(shí)間 。以百分比表示。

  •  wa: 等待IO時(shí)間

備注:如果 r經(jīng)常大于 4 ,且id經(jīng)常少于40,表示cpu的負(fù)荷很重。如果pi,po 長(zhǎng)期不等于0,表示內(nèi)存不足。如果disk 經(jīng)常不等于0, 且在 b中的隊(duì)列 大于3, 表示 io性能不好。Linux在具有高穩(wěn)定性、可靠性的同時(shí),具有很好的可伸縮性和擴(kuò)展性,能夠針對(duì)不同的應(yīng)用和硬件環(huán)境調(diào)整,優(yōu)化出滿足當(dāng)前應(yīng)用需要的最佳性能。因此企業(yè)在維護(hù)Linux系統(tǒng)、進(jìn)行系統(tǒng)調(diào)優(yōu)時(shí),了解系統(tǒng)性能分析工具是至關(guān)重要的。

命令:

vmstat 5 5

表示在5秒時(shí)間內(nèi)進(jìn)行5次采樣。將得到一個(gè)數(shù)據(jù)匯總他能夠反映真正的系統(tǒng)情況。

實(shí)例2:顯示活躍和非活躍內(nèi)存

命令:

vmstat -a 2 5

輸出:

[root@localhost ~]# vmstat -a 2 5procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------  r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st 0  0      0 3029752 387728 513008    0    0     0     2    3    2  0  0 100  0  0  0  0      0 3029752 387728 513076    0    0     0     0 1005   34  0  0 100  0  0  0  0      0 3029752 387728 513076    0    0     0    22 1004   36  0  0 100  0  0  0  0      0 3029752 387728 513076    0    0     0     0 1004   33  0  0 100  0  0  0  0      0 3029752 387728 513076    0    0     0     0 1003   32  0  0 100  0  0

說明:

使用-a選項(xiàng)顯示活躍和非活躍內(nèi)存時(shí),所顯示的內(nèi)容除增加inact和active外,其他顯示內(nèi)容與例子1相同。

字段說明:

  •  Memory(內(nèi)存):

  •  inact: 非活躍內(nèi)存大?。ó?dāng)使用-a選項(xiàng)時(shí)顯示)

  •   active: 活躍的內(nèi)存大小(當(dāng)使用-a選項(xiàng)時(shí)顯示)

實(shí)例3:查看系統(tǒng)已經(jīng)fork了多少次

命令:

vmstat -f

輸出:

[root@SCF1129 ~]# vmstat -f       12744849 forks  [root@SCF1129 ~]#

說明:

這個(gè)數(shù)據(jù)是從/proc/stat中的processes字段里取得的

實(shí)例4:查看內(nèi)存使用的詳細(xì)信息

命令:

vmstat -s

輸出:

[root@localhost ~]# vmstat -s      4043760  total memory        1013884  used memory       513012  active memory       387728  inactive memory      3029876  free memory       199616  buffer memory       690980  swap cache      6096656  total swap            0  used swap      6096656  free swap        83587 non-nice user cpu ticks          132 nice user cpu ticks       278599 system cpu ticks    913344692 idle cpu ticks       814550 IO-wait cpu ticks        10547 IRQ cpu ticks        21261 softirq cpu ticks            0 stolen cpu ticks       310215 pages paged in      14254652 pages paged out            0 pages swapped in             0 pages swapped out    288374745 interrupts    146680577 CPU context switches   1351868832 boot time       367291 forks

說明:

這些信息的分別來自于/proc/meminfo,/proc/stat和/proc/vmstat。

實(shí)例5:查看磁盤的讀/寫

命令:

vmstat -d

輸出:

[root@localhost ~]# vmstat -ddisk- ------------reads------------ ------------writes----------- -----IO------        total merged sectors      ms  total merged sectors      ms    cur    sec  ram0       0      0       0       0      0      0       0       0      0      0  ram1       0      0       0       0      0      0       0       0      0      0  ram2       0      0       0       0      0      0       0       0      0      0  ram3       0      0       0       0      0      0       0       0      0      0  ram4       0      0       0       0      0      0       0       0      0      0  ram5       0      0       0       0      0      0       0       0      0      0  ram6       0      0       0       0      0      0       0       0      0      0  ram7       0      0       0       0      0      0       0       0      0      0  ram8       0      0       0       0      0      0       0       0      0      0  ram9       0      0       0       0      0      0       0       0      0      0  ram10      0      0       0       0      0      0       0       0      0      0  ram11      0      0       0       0      0      0       0       0      0      0  ram12      0      0       0       0      0      0       0       0      0      0  ram13      0      0       0       0      0      0       0       0      0      0  ram14      0      0       0       0      0      0       0       0      0      0  ram15      0      0       0       0      0      0       0       0      0      0  sda    33381   6455  615407   63224 2068111 1495416 28508288 15990289      0  10491 hdc        0      0       0       0      0      0       0       0      0      0  fd0        0      0       0       0      0      0       0       0      0      0  md0        0      0       0       0      0      0       0       0      0      0  [root@localhost ~]#

說明:

這些信息主要來自于/proc/diskstats.

merged:表示一次來自于合并的寫/讀請(qǐng)求,一般系統(tǒng)會(huì)把多個(gè)連接/鄰近的讀/寫請(qǐng)求合并到一起來操作.

實(shí)例6:查看/dev/sda1磁盤的讀/寫

命令:

輸出:

[root@SCF1129 ~]# df文件系統(tǒng)                 1K-塊      已用      可用 已用% 掛載點(diǎn)  /dev/sda3            1119336548  27642068 1034835500   3% /tmpfs                 32978376         0  32978376   0% /dev/shm /dev/sda1              1032088     59604    920056   7% /boot  [root@SCF1129 ~]# vmstat -p /dev/sda1sda1          reads   read sectors  writes    requested writes               18607    4249978          6         48[root@SCF1129 ~]# vmstat -p /dev/sda3sda3          reads   read sectors  writes    requested writes              429350   35176268   28998789  980301488[root@SCF1129 ~]#

說明:

這些信息主要來自于/proc/diskstats。

reads:來自于這個(gè)分區(qū)的讀的次數(shù)。

read sectors:來自于這個(gè)分區(qū)的讀扇區(qū)的次數(shù)。

writes:來自于這個(gè)分區(qū)的寫的次數(shù)。

requested writes:來自于這個(gè)分區(qū)的寫請(qǐng)求次數(shù)。

實(shí)例7:查看系統(tǒng)的 slab 信息

命令:

vmstat -m

輸出:

[root@localhost ~]# vmstat -mCache                      Num  Total   Size  Pages ip_conntrack_expect           0      0    136     28 ip_conntrack                  3     13    304     13  ip_fib_alias                 11     59     64     59  ip_fib_hash                  11     59     64     59  AF_VMCI                       0      0    960      4  bio_map_info                100    105   1064      7  dm_mpath                      0      0   1064      7  jbd_4k                        0      0   4096      1  dm_uevent                     0      0   2608      3  dm_tio                        0      0     24    144  dm_io                         0      0     48     77  scsi_cmd_cache               10     10    384     10  sgpool-128                   32     32   4096      1  sgpool-64                    32     32   2048      2  sgpool-32                    32     32   1024      4  sgpool-16                    32     32    512      8  sgpool-8                     45     45    256     15  scsi_io_context               0      0    112     34  ext3_inode_cache          51080  51105    760      5  ext3_xattr                   36     88     88     44  journal_handle               18    144     24    144  journal_head                 56     80     96     40  revoke_table                  4    202     16    202  revoke_record                 0      0     32    112  uhci_urb_priv                 0      0     56     67  UNIX                         13     33    704     11  flow_cache                    0      0    128     30  msi_cache                    33     59     64     59  cfq_ioc_pool                 14     90    128     30  cfq_pool                     12     90    216     18  crq_pool                     16     96     80     48  deadline_drq                  0      0     80     48  as_arq                        0      0     96     40  mqueue_inode_cache            1      4    896      4  isofs_inode_cache             0      0    608      6  hugetlbfs_inode_cache         1      7    576      7  Cache                       Num  Total   Size  Pages  ext2_inode_cache              0      0    720      5  ext2_xattr                    0      0     88     44  dnotify_cache                 0      0     40     92  dquot                         0      0    256     15  eventpoll_pwq                 3     53     72     53  eventpoll_epi                 3     20    192     20  inotify_event_cache           0      0     40     92  inotify_watch_cache           1     53     72     53  kioctx                        0      0    320     12  kiocb                         0      0    256     15  fasync_cache                  0      0     24    144  shmem_inode_cache           254    290    768      5  posix_timers_cache            0      0    128     30  uid_cache                     0      0    128     30  ip_mrt_cache                  0      0    128     30  tcp_bind_bucket               3    112     32    112  inet_peer_cache               0      0    128     30  secpath_cache                 0      0     64     59  xfrm_dst_cache                0      0    384     10  ip_dst_cache                  5     10    384     10  arp_cache                     1     15    256     15  RAW                           3      5    768      5  UDP                           5     10    768      5  tw_sock_TCP                   0      0    192     20  request_sock_TCP              0      0    128     30  TCP                           4      5   1600      5  blkdev_ioc                   14    118     64     59  blkdev_queue                 20     30   1576      5  blkdev_requests              13     42    272     14  biovec-256                    7      7   4096      1  biovec-128                    7      8   2048      2  biovec-64                     7      8   1024      4  biovec-16                     7     15    256     15  biovec-4                      7     59     64     59  biovec-1                     23    202     16    202  bio                         270    270    128     30  utrace_engine_cache           0      0     64     59  Cache                       Num  Total   Size  Pages  utrace_cache                  0      0     64     59  sock_inode_cache             33     48    640      6  skbuff_fclone_cache           7      7    512      7  skbuff_head_cache           319    390    256     15  file_lock_cache               1     22    176     22  Acpi-Operand               4136   4248     64     59  Acpi-ParseExt                 0      0     64     59  Acpi-Parse                    0      0     40     92  Acpi-State                    0      0     80     48  Acpi-Namespace             2871   2912     32    112  delayacct_cache              81    295     64     59  taskstats_cache               4     53     72     53  proc_inode_cache           1427   1440    592      6  sigqueue                      0      0    160     24  radix_tree_node           13166  13188    536      7  bdev_cache                   23     24    832      4  sysfs_dir_cache            5370   5412     88     44  mnt_cache                    26     30    256     15  inode_cache                2009   2009    560      7  dentry_cache              60952  61020    216     18  filp                        479   1305    256     15  names_cache                   3      3   4096      1  avc_node                     14     53     72     53  selinux_inode_security      994   1200     80     48  key_jar                       2     20    192     20  idr_layer_cache              74     77    528      7  buffer_head              164045 164800     96     40  mm_struct                    51     56    896      4  vm_area_struct             1142   1958    176     22  fs_cache                     35    177     64     59  files_cache                  36     55    768      5  signal_cache                 72    162    832      9  sighand_cache                68     84   2112      3  task_struct                  76     80   1888      2  anon_vma                    458    864     24    144  pid                          83    295     64     59  shared_policy_node            0      0     48     77  Cache                       Num  Total   Size  Pages  numa_policy                  37    144     24    144  size-131072(DMA)              0      0 131072      1  size-131072                   0      0 131072      1  size-65536(DMA)               0      0  65536      1  size-65536                    1      1  65536      1  size-32768(DMA)               0      0  32768      1  size-32768                    2      2  32768      1  size-16384(DMA)               0      0  16384      1  size-16384                    5      5  16384      1  size-8192(DMA)                0      0   8192      1  size-8192                     7      7   8192      1  size-4096(DMA)                0      0   4096      1  size-4096                   110    111   4096      1  size-2048(DMA)                0      0   2048      2  size-2048                   602    602   2048      2  size-1024(DMA)                0      0   1024      4  size-1024                   344    352   1024      4  size-512(DMA)                 0      0    512      8  size-512                    433    480    512      8  size-256(DMA)                 0      0    256     15  size-256                   1139   1155    256     15  size-128(DMA)                 0      0    128     30  size-64(DMA)                  0      0     64     59  size-64                    5639   5782     64     59  size-32(DMA)                  0      0     32    112  size-128                    801    930    128     30  size-32                    3005   3024     32    112  kmem_cache                  137    137   2688      1

這組信息來自于/proc/slabinfo。

slab:由于內(nèi)核會(huì)有許多小對(duì)象,這些對(duì)象構(gòu)造銷毀十分頻繁,比如i-node,dentry,這些對(duì)象如果每次構(gòu)建的時(shí)候就向內(nèi)存要一個(gè)頁(yè)(4kb),而其實(shí)只有幾個(gè)字節(jié),這樣就會(huì)非常浪費(fèi),為了解決這個(gè)問題,就引入了一種新的機(jī)制來處理在同一個(gè)頁(yè)框中如何分配小存儲(chǔ)區(qū),而slab可以對(duì)小對(duì)象進(jìn)行分配,這樣就不用為每一個(gè)對(duì)象分配頁(yè)框,從而節(jié)省了空間,內(nèi)核對(duì)一些小對(duì)象創(chuàng)建析構(gòu)很頻繁,slab對(duì)這些小對(duì)象進(jìn)行緩沖,可以重復(fù)利用,減少內(nèi)存分配次數(shù)。

看完上述內(nèi)容,你們掌握Linux中性能監(jiān)控和優(yōu)化命令分別是哪些呢的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI