首頁 >常見問題 >linux中free是什麼

linux中free是什麼

青灯夜游
青灯夜游原創
2023-03-02 09:59:146930瀏覽

在linux中,free是查看記憶體使用狀態的內建指令,可以顯示包含系統實體記憶體、虛擬記憶體(swap交換分割區)、共享記憶體和系統快取的使用情況,文法「free [選項] 」;free指令的輸出和top指令的記憶體部分非常相似。

linux中free是什麼

本教學操作環境:linux7.3系統、Dell G3電腦。

Linux free指令:查看記憶體使用狀態

free 指令用來顯示系統記憶體狀態,包括系統實體記憶體、虛擬記憶體(swap 交換分割區)、共享記憶體和系統快取的使用情況,其輸出和top 指令的記憶體部分非常相似。

free 指令的基本格式如下:

# free [选项]

表 1 羅列出了此指令常用的選項及各自的意義。

##- b以Byte(位元組)為單位,顯示記憶體使用量。 -k以 KB 為單位,顯示記憶體使用情況,此選項是 free 指令的預設選項。 -m以 MB 為單位,顯示記憶體使用量。 -g以 GB 為單位,顯示記憶體使用量。 -t在輸出的最終結果中,輸出記憶體和 swap 分割區的總量。 -o不顯示系統緩衝區這一列。 -s 間隔秒數依指定的間隔時間,持續顯示記憶體使用量。

free 命令可以显示系统中剩余及已用的物理内存和交换内存,以及共享内存和被核心使用的缓冲区。

如果加上 -h 选项,输出的结果会友好很多:

有时我们需要持续的观察内存的状况,此时可以使用 -s 选项并指定间隔的秒数:

$ free -h -s 3

上面的指令每隔 3 秒輸出一次記憶體的使用情況,直到你按下 ctrl c。

由於 free 指令本身比較簡單,所以本文的重點會放在如何透過 free 指令來了解系統目前的記憶體使用狀況。

輸出簡介

#以下先解釋一下輸出的內容:

  • ##Mem 行(第二行)是記憶體的使用情況。

  • Swap 行(第三行)是交換空間的使用情況。

  • #total

    欄位顯示系統總可用的實體記憶體與交換空間大小。

  • #used
  • 欄位顯示已經被使用的實體記憶體和交換空間。

    #free
  • 欄位顯示還有多少實體記憶體和交換空間可用。
  • shared

    欄位顯示被共享使用的實體記憶體大小。

  • buff/cache 欄位顯示被buffer 和cache 使用的實體記憶體大小。

available### 欄位顯示還可以被應用程式使用的實體記憶體大小。 ###########################################我想只有在理解了一些基本概念之後,上面的輸出才能幫助我們了解系統的記憶體狀況。 ######

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 中才將它們統一。更早的核心中有兩個獨立的磁碟快取:頁高速緩存和緩衝區高速緩存。前者快取頁面,後者快取緩衝區。當你知道了這些故事之後,輸出中列的名稱可能已經不再重要了。

#

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

有兴趣的同学可以直接查看这个文件。

总结

free 命令是一个既简单又复杂的命令。简单是因为这个命令的参数少,输出结果清晰。说它复杂则是因为它背后是比较晦涩的操作系统中的概念,如果不清楚这些概念,即便看了 free 命令的输出也 get 不到多少有价值的信息。

相关推荐:《Linux视频教程

表1 free 指令常用選項及意義
選項 意義

以上是linux中free是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn