Linux free 命令詳解

Linux free 命令詳解

free 命令用來查看系統中已用的和可用的內存。

命令選項及輸出簡介

關于各種命令的功能和命令選項,還是推薦英語比較好的同學直接看手冊 RTFMman free。這里簡單總結一下一些重點:

功能及輸出簡介

free 命令顯示系統中可用和使用的物理內存和交換內存的總量,以及內核所使用的緩沖區 (buffers) 和緩存 (caches) 。通過解析 /proc/meminfo 收集信息。顯示的列包括:

  • total:所有的內存
  • used:使用的內存
  • free:未使用的內存
  • shared:經常被 tmpfs 使用的內存
  • buffers:內存中被內核用作緩沖區(buffers)的部分
  • cache:內存中被用作頁緩存(page cache)和 slabs 的部分
  • buff/cache:buffers 和 cache 的和
  • available:估計的無需交換即可為新啟動的應用程序所用的內存量。

注意有這樣一個等式: used = total - free - buffers - cache

參數選項

常用的選項用紅色標出來了。

  • -b :以Byte為單位顯示內存使用情況。

  • -k :以KB為單位顯示內存使用情況。

  • -m:以MB為單位顯示內存使用情況。

  • -h:以合適的單位顯示內存使用情況,最大為三位數,自動計算對應的單位值。單位有:

    B = bytes, K = kilos, M = megas, G = gigas, T = teras
    
  • -o: 不顯示緩沖區調節列。

  • -s<間隔秒數>: 持續觀察內存使用狀況。

  • -t :顯示內存總和列。

  • -V: 顯示版本信息。

一般就是 free -h

              total        used        free      shared  buff/cache   available
Mem:            46G         38G        400M        2.3G        7.4G        4.9G
Swap:          2.0G        2.0G          0B

我想只有在理解了一些基本概念之后,上面的輸出才能幫助我們了解系統的內存狀況。

關于Linux內存的一些知識

以下內容參考自博客:https://www.cnblogs.com/ultranms/p/9254160.html

buff/cache

先來提一個問題: buffer 和 cache 應該是兩種類型的內存,但是 free 命令為什么會把它們放在一起呢?要回答這個問題需要我們做些準備工作。讓我們先來搞清楚 buffer 與 cache 的含義。

buffer 在操作系統中指 buffer cache, 中文一般翻譯為 “緩沖區”。要理解緩沖區,必須明確另外兩個概念:“扇區” 和 “塊”。扇區是設備的最小尋址單元,也叫 “硬扇區” 或 “設備塊”。塊是操作系統中文件系統的最小尋址單元,也叫 “文件塊” 或 “I/O 塊”。每個塊包含一個或多個扇區,但大小不能超過一個頁面,所以一個頁可以容納一個或多個內存中的塊。當一個塊被調入內存時,它要存儲在一個緩沖區中。每個緩沖區與一個塊對應,它相當于是磁盤塊在內存中的表示(下圖來自互聯網):

在這里插入圖片描述

注意,buffer cache 只有塊的概念而沒有文件的概念,它只是把磁盤上的塊直接搬到內存中而不關心塊中究竟存放的是什么格式的文件。

cache 在操作系統中指 page cache,中文一般翻譯為 “頁高速緩存”。頁高速緩存是內核實現的磁盤緩存。它主要用來減少對磁盤的 I/O 操作。具體地講,是通過把磁盤中的數據緩存到物理內存中,把對磁盤的訪問變為對物理內存的訪問。頁高速緩存緩存的是內存頁面。緩存中的頁來自對普通文件、塊設備文件(這個指的就是 buffer cache 呀)和內存映射文件的讀寫

頁高速緩存對普通文件的緩存我們可以這樣理解:當內核要讀一個文件(比如 /etc/hosts)時,它會先檢查這個文件的數據是不是已經在頁高速緩存中了。如果在,就放棄訪問磁盤,直接從內存中讀取。這個行為稱為緩存命中。如果數據不在緩存中,就是未命中緩存,此時內核就要調度塊 I/O 操作從磁盤去讀取數據。然后內核將讀來的數據放入頁高速緩存中。這種緩存的目標是文件系統可以識別的文件(比如 /etc/hosts)。
頁高速緩存對塊設備文件的緩存就是我們在前面介紹的 buffer cahce。因為獨立的磁盤塊通過緩沖區也被存入了頁高速緩存(緩沖區最終是由頁高速緩存來承載的)。

到這里我們應該搞清楚了:無論是緩沖區還是頁高速緩存,它們的實現方式都是一樣的。緩沖區只不過是一種概念上比較特殊的頁高速緩存罷了。
那么為什么 free 命令不直接稱為 cache 而非要寫成 buff/cache? 這是因為緩沖區和頁高速緩存的實現并非天生就是統一的。在 linux 內核 2.4 中才將它們統一。更早的內核中有兩個獨立的磁盤緩存:頁高速緩存和緩沖區高速緩存。前者緩存頁面,后者緩存緩沖區。當你知道了這些故事之后,輸出中列的名稱可能已經不再重要了。

有人認為:buffer是用于存放要輸出到disk(塊設備)的數據的,而cache是存放從disk上讀出的數據。這二者是為了提高IO性能的,并由OS管理。

free 與 available

在 free 命令的輸出中,有一個 free 列,同時還有一個 available 列。這二者到底有何區別?

free 是真正尚未被使用的物理內存數量。至于 available 就比較有意思了,它是從應用程序的角度看到的可用內存數量。Linux 內核為了提升磁盤操作的性能,會消耗一部分內存去緩存磁盤數據,就是我們介紹的 buffer 和 cache。所以對于內核來說,buffer 和 cache 都屬于已經被使用的內存。當應用程序需要內存時,如果沒有足夠的 free 內存可以用,內核就會從 buffer 和 cache 中回收內存來滿足應用程序的請求。所以從應用程序的角度來說,available = free + buffer + cache。請注意,這只是一個很理想的計算方式,實際中的數據往往有較大的誤差。

交換空間(swap space)

swap space 是磁盤上的一塊區域,可以是一個分區,也可以是一個文件。所以具體的實現可以是 swap 分區也可以是 swap 文件。當系統物理內存吃緊時,Linux 會將內存中不常訪問的數據保存到 swap 上,這樣系統就有更多的物理內存為各個進程服務,而當系統需要訪問 swap 上存儲的內容時,再將 swap 上的數據加載到內存中,這就是常說的換出和換入。交換空間可以在一定程度上緩解內存不足的情況,但是它需要讀寫磁盤數據,所以性能不是很高。

現在的機器一般都不太缺內存,如果系統默認還是使用了 swap 是不是會拖累系統的性能?理論上是的,但實際上可能性并不是很大。并且內核提供了一個叫做 swappiness 的參數,用于配置需要將內存中不常用的數據移到 swap 中去的緊迫程度。這個參數的取值范圍是 0~100,0 告訴內核盡可能的不要將內存數據移到 swap 中,也即只有在迫不得已的情況下才這么做,而 100 告訴內核只要有可能,盡量的將內存中不常訪問的數據移到 swap 中。在 ubuntu 系統中,swappiness 的默認值是 60。如果我們覺著內存充足,可以在 /etc/sysctl.conf 文件中設置 swappiness:

vm.swappiness=10

如果系統的內存不足,則需要根據物理內存的大小來設置交換空間的大小。具體的策略網上有很豐富的資料,這里筆者不再贅述。

/proc/meminfo 文件

其實 free 命令中的信息都來自于 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息,只是看起來不太直觀。

cat /proc/meminfo

輸出(輸出很長,這是一部分):

MemTotal:       49033996 kB
MemFree:          381080 kB
MemAvailable:    5110936 kB
Buffers:           74580 kB
Cached:          7273148 kB
SwapCached:       591112 kB
...
DirectMap1G:           0 kB

總結

free 命令是一個既簡單又復雜的命令。簡單是因為這個命令的參數少,輸出結果清晰。說它復雜則是因為它背后是比較晦澀的操作系統中的概念,如果不清楚這些概念,即便看了 free 命令的輸出也 get 不到多少有價值的信息。

Ref:

https://www.cnblogs.com/ultranms/p/9254160.html

https://blog.csdn.net/sunansheng/article/details/51942522

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532628.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532628.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532628.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CTF web題 wp:

1.簽到題 火狐F12查看源碼&#xff0c;發現注釋&#xff1a; 一次base64解碼出flag 2.Encode 在這里插入圖片描述 和第一題界面一樣&#xff1f;&#xff1f; 輕車熟路f12&#xff1a; 發現編碼&#xff1a; 格式看上去是base64&#xff0c;連續兩次base64后&#xff0c;觀…

【深度學習】深入理解Batch Normalization批歸一化

【深度學習】深入理解Batch Normalization批歸一化 轉自&#xff1a;https://www.cnblogs.com/guoyaohua/p/8724433.html 這幾天面試經常被問到BN層的原理&#xff0c;雖然回答上來了&#xff0c;但還是感覺答得不是很好&#xff0c;今天仔細研究了一下Batch Normalization的原…

ThinkPHP V5 漏洞利用

ThinkPHP 5漏洞簡介 ThinkPHP官方2018年12月9日發布重要的安全更新&#xff0c;修復了一個嚴重的遠程代碼執行漏洞。該更新主要涉及一個安全更新&#xff0c;由于框架對控制器名沒有進行足夠的檢測會導致在沒有開啟強制路由的情況下可能的getshell漏洞&#xff0c;受影響的版本…

Vim 重復操作的宏錄制

Vim 重復操作的宏錄制 轉自&#xff1a;https://www.cnblogs.com/ini_always/archive/2011/09/21/2184446.html 在編輯某個文件的時候&#xff0c;可能會出現需要對某種特定的操作進行許多次的情況&#xff0c;以編輯下面的文件為例&#xff1a; ; ;This is a sample config…

Vim 進階1

Vim 進階1 所有你覺得簡單重復&#xff0c;可以自動化實現的操作&#xff0c;都是可以自動化實現的。 Vim光標移動拾遺 w&#xff1a;下一個單詞的開頭&#xff0c;e&#xff1a;下一個單詞的結尾&#xff0c;b&#xff1a;上一個單詞的開頭&#xff0c; 0&#xff1a;行首…

攻防世界web題ics-06(爆破id值)

打開界面&#xff1a;嚯&#xff01;這花里胡哨 點來點去只有報表中心有回顯&#xff1a; 發現url中id等于1&#xff0c;sql注入嘗試無果&#xff0c; burp工具爆破id 對id的值進行爆破 burp報ERROR的話這是個bug&#xff0c;先點擊Hex后點decimal手動刷新就可以使用 強行總…

crontab用法與實例

crontab用法與實例 本文基于 ubuntu 18.04 在Linux系統的實際使用中&#xff0c;可能會經常碰到讓系統在某個特定時間執行某些任務的情況&#xff0c;比如定時采集服務器的狀態信息、負載狀況&#xff1b;定時執行某些任務/腳本來對遠端進行數據采集等。這里將介紹下crontab的配…

手工sql注入常規總結

1.發現注入點 2.報數據庫 先用單引號&#xff08;也嘗試雙引號&#xff09;閉合前面的語句&#xff0c;使注入的語句能夠執行&#xff0c; 數字 0 :匹配字段&#xff0c;還有 11 12 等等都可以使用&#xff0c;有些網站會有過濾處理&#xff0c;建議采用 1%2b12 1%2b1>1 繞…

Systemd入門教程:命令篇

Systemd入門教程&#xff1a;命令篇 轉自&#xff1a;http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html 作者&#xff1a; 阮一峰 日期&#xff1a; 2016年3月 7日 Systemd 是 Linux 系統工具&#xff0c;用來啟動守護進程&#xff0c;已成為大多數…

【CVE-2018-12613】phpmyadmin 4.8.1 遠程文件包含漏洞復現

**環境&#xff1a;**http://62.234.56.138:8080/server_databases.php 官網下載phpmyadmin 4.8.1 源碼&#xff1a;index.php文件中 函數含義&#xff1a; targer非空targer是否位字符串不能以index為開頭&#xff0c;即過濾了index值不能出現在blacklist內&#xff0c;即…

Systemd 入門教程:實戰篇

Systemd 入門教程&#xff1a;實戰篇 轉自&#xff1a;https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html 作者&#xff1a; 阮一峰 日期&#xff1a; 2016年3月 8日 上一篇文章&#xff0c;我介紹了 Systemd 的主要命令&#xff0c;今天介紹如何使…

關于ubuntu自定義service服務時找不到/usr/lib/systemd/system目錄的問題

關于ubuntu自定義service服務時找不到/usr/lib/systemd/system目錄的問題 問題 我們知道在 systemd 取代了 init 而成為廣大 Linux 系統中 PID 為1的守護進程之后&#xff0c;Linux 中的服務&#xff08;service&#xff09;主要有 systemd 命令組來實現。在大多數發行版 Lin…

攻防世界web2(逆向加密算法)

打開網頁有如下代碼&#xff1a; <?php $miwen"a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";function encode($str){$_ostrrev($str);// echo $_o;for($_00;$_0<strlen($_o);$_0){$_csubstr($_o,$_0,1);$__ord($_c)1;$_cchr($__);$_$_.$…

ctags 基本使用方法

ctags 基本使用方法 簡介 ctags&#xff08;Generate tag files for source code&#xff09;是vim下方便代碼閱讀的工具。盡管ctags也可以支持其它編輯器&#xff0c;但是它正式支持的只有 Vim。并且 Vim 中已經默認安裝了 ctags&#xff0c;它可以幫助程序員很容易地瀏覽源…

vimrc配置文件

vimrc配置文件 轉自&#xff1a;https://www.ruanyifeng.com/blog/2018/09/vimrc.html Vim 是最重要的編輯器之一&#xff0c;主要有下面幾個優點。 可以不使用鼠標&#xff0c;完全用鍵盤操作。系統資源占用小&#xff0c;打開大文件毫無壓力。鍵盤命令變成肌肉記憶以后&am…

CTFHUB 《請求方式》 http請求,curl命令總結

打開網頁&#xff1a; 思路一&#xff1a; 根據題目&#xff0c;應該是向網頁發送get方式請求&#xff0c;但并沒有具體規定要發送什么&#xff0c;嘗試get發送參數后&#xff0c;都沒有返回網頁&#xff0c;emmm’…好像不是我想的那種套路 思路二&#xff1a; 網上找到思路…

Vim進階2 map映射

Vim進階2 map映射 簡介 map是一個 vim 中的一些列映射命令&#xff0c;將常用的很長的命令映射到一個新的功能鍵上。map是Vim強大的一個重要原因&#xff0c;可以自定義各種快捷鍵&#xff0c;用起來自然得心應手。 map系列命令格式 格式 以 map 命令為例&#xff0c;它的…

CTFHUB 《基礎認證》:burp使用,basic請求了解

題目簡介&#xff1a;在HTTP中&#xff0c;基本認證&#xff08;英語&#xff1a;Basic access authentication&#xff09;是允許http用戶代理&#xff08;如&#xff1a;網頁瀏覽器&#xff09;在請求時&#xff0c;提供 用戶名 和 密碼 的一種方式。詳情請查看 https://zh.w…

信息量、熵、交叉熵、KL散度、JS散度雜談及代碼實現

信息量、熵、交叉熵、KL散度、JS散度雜談及代碼實現 信息量 任何事件都會承載著一定的信息量&#xff0c;包括已經發生的事件和未發生的事件&#xff0c;只是它們承載的信息量會有所不同。如昨天下雨這個已知事件&#xff0c;因為已經發生&#xff0c;既定事實&#xff0c;那…

CTFHUB《Web-信息泄露-備份文件下載》網站源碼,

1.網站源碼 三種方法&#xff1a; 方法一&#xff1a;dirsearch掃描git泄露 有文件下載 拿到flag 方法二&#xff1a;御劍&#xff08;超時10s&#xff09; 御劍其實也可以掃出來&#xff0c;但是一般我們掃域名超時時間都是三秒&#xff0c;本環境中需要超時10秒才能得到…