CentOS上free命令詳解

来源:http://www.cnblogs.com/wayneiscoming/archive/2017/11/20/7865068.html
-Advertisement-
Play Games

1. CentOS6及以前 在CentOS6及以前的版本中,free命令輸出是這樣的: 第一行: 系統記憶體主要分為四部分:used(程式已使用記憶體),free(空閑記憶體),buffers(buffer cache),cached(Page cache)。 系統總記憶體total = used + fr ...


 1. CentOS6及以前

 

  在CentOS6及以前的版本中,free命令輸出是這樣的:

$free -m
 
             total           used      free    shared    buffers     cached
Mem:         1002            769       233       0         62         421
-/+ buffers/cache:           286       716
Swap:         1153           0         1153

 

第一行:

系統記憶體主要分為四部分:used(程式已使用記憶體),free(空閑記憶體),buffers(buffer cache),cached(Page cache)。

系統總記憶體total = used + free;  buffers和cached被算在used里,因此第一行系統已使用記憶體used = buffers + cached + 第二行系統已使用記憶體used

由於buffers和cached在系統需要時可以被回收使用,因此系統可用記憶體 = free + buffers + cached;

shared為程式共用的記憶體空間,往往為0。

第二行:

  正因為buffers和cached在系統需要時可以被回收使用,因此buffer和cached其實可以可以算作可用記憶體,因此:

  系統可用記憶體,即第二行的free = 第一行的free + buffers + cached。

  系統已使用記憶體,即第二行的used = total - 第二行free

第三行:

  swap記憶體交換空間使用情況,關於swap記憶體交換空間的介紹可以參考此blog:

  http://blog.csdn.net/u011373710/article/details/70037649

 

2. CentOS7及以後

  CentOS7及以後free命令的輸出如下:

# free -m
              total        used        free      shared  buff/cache   available
Mem:           3440         213        2276         168         950        2778
Swap:             0           0           0

 

buffer和cached被合成一組,加入了一個available,關於此available,文檔上的說明如下:

  • MemAvailable: An estimate of how much memory is available for starting new applications, without swapping.

即系統可用記憶體,之前說過由於buffer和cache可以在需要時被釋放回收,系統可用記憶體即 free + buffer + cache,在CentOS7之後這種說法並不准確,因為並不是所有的buffer/cache空間都可以被回收。

即available = free + buffer/cache - 不可被回收記憶體(共用記憶體段、tmpfs、ramfs等)。

因此在CentOS7之後,用戶不需要去計算buffer/cache,即可以看到還有多少記憶體可用,更加簡單直觀。

 

3. buffer/cache相關介紹

##什麼是buffer/cache?

  buffer 和 cache 是兩個在電腦技術中被用濫的名詞,放在不通語境下會有不同的意義。在 Linux 的記憶體管理中,這裡的 buffer 指 Linux 記憶體的: Buffer cache 。這裡的 cache 指 Linux 記憶體中的: Page cache 。翻譯成中文可以叫做緩衝區緩存和頁面緩存。在歷史上,它們一個( buffer )被用來當成對 io 設備寫的緩存,而另一個( cache )被用來當作對 io 設備的讀緩存,這裡的 io 設備,主要指的是塊設備文件和文件系統上的普通文件。但是現在,它們的意義已經不一樣了。在當前的內核中, page cache 顧名思義就是針對記憶體頁的緩存,說白了就是,如果有記憶體是以 page 進行分配管理的,都可以使用 page cache 作為其緩存來管理使用。當然,不是所有的記憶體都是以頁( page )進行管理的,也有很多是針對塊( block )進行管理的,這部分記憶體使用如果要用到 cache 功能,則都集中到 buffer cache 中來使用。(從這個角度出發,是不是 buffer cache 改名叫做 block cache 更好?)然而,也不是所有塊( block )都有固定長度,系統上塊的長度主要是根據所使用的塊設備決定的,而頁長度在 X86 上無論是 32 位還是 64 位都是 4k 。

  明白了這兩套緩存系統的區別,就可以理解它們究竟都可以用來做什麼了。

##什麼是 page cache

  Page cache 主要用來作為文件系統上的文件數據的緩存來用,尤其是針對當進程對文件有 read / write 操作的時候。如果你仔細想想的話,作為可以映射文件到記憶體的系統調用: mmap 是不是很自然的也應該用到 page cache ?在當前的系統實現里, page cache 也被作為其它文件類型的緩存設備來用,所以事實上 page cache 也負責了大部分的塊設備文件的緩存工作。

##什麼是 buffer cache

  Buffer cache 則主要是設計用來在系統對塊設備進行讀寫的時候,對塊進行數據緩存的系統來使用。這意味著某些對塊的操作會使用 buffer cache 進行緩存,比如我們在格式化文件系統的時候。一般情況下兩個緩存系統是一起配合使用的,比如當我們對一個文件進行寫操作的時候, page cache 的內容會被改變,而 buffer cache 則可以用來將 page 標記為不同的緩衝區,並記錄是哪一個緩衝區被修改了。這樣,內核在後續執行臟數據的回寫( writeback )時,就不用將整個 page 寫回,而只需要寫回修改的部分即可。

##如何回收 cache ?

  Linux 內核會在記憶體將要耗盡的時候,觸發記憶體回收的工作,以便釋放出記憶體給急需記憶體的進程使用。一般情況下,這個操作中主要的記憶體釋放都來自於對 buffer / cache 的釋放。尤其是被使用更多的 cache 空間。既然它主要用來做緩存,只是在記憶體夠用的時候加快進程對文件的讀寫速度,那麼在記憶體壓力較大的情況下,當然有必要清空釋放 cache ,作為 free 空間分給相關進程使用。所以一般情況下,我們認為 buffer/cache 空間可以被釋放,這個理解是正確的。

  但是這種清緩存的工作也並不是沒有成本。理解 cache 是乾什麼的就可以明白清緩存必須保證 cache 中的數據跟對應文件中的數據一致,才能對 cache 進行釋放。所以伴隨著 cache 清除的行為的,一般都是系統 IO 飆高。因為內核要對比 cache 中的數據和對應硬碟文件上的數據是否一致,如果不一致需要寫回,之後才能回收。

  在系統中除了記憶體將被耗盡的時候可以清緩存以外,我們還可以使用下麵這個文件來人工觸發緩存清除的操作:

[root@tencent64 ~]# cat /proc/sys/vm/drop_caches 
1

  方法是:

echo 1 > /proc/sys/vm/drop_caches

 

當然,這個文件可以設置的值分別為 1 、 2 、 3 。它們所表示的含義為:

echo 1 > /proc/sys/vm/drop_caches:表示清除 pagecache 。

echo 2 > /proc/sys/vm/drop_caches:表示清除回收 slab 分配器中的對象(包括目錄項緩存和 inode 緩存)。 slab 分配器是內核中管理記憶體的一種機制,其中很多緩存數據實現都是用的 pagecache 。

echo 3 > /proc/sys/vm/drop_caches:表示清除 pagecache 和 slab 分配器中的緩存對象。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本節學習目的 1)分析Linux中的OSS音效卡系統 2)移植wm9876音效卡 3)使用madplay應用程式播放mp3 1.聲音三要素 採樣頻率 音頻採樣率是指錄音設備在一秒鐘內對聲音信號的採樣次數, 常用的採樣率有: 8KHz - 電話所用採樣率, 對於人的說話已經足夠清除 22.05KHz - ...
  • 目的: 使類似於樹莓派的AARCH-64架構的嵌入式設備能通過USB無線網卡連接上乙太網; 該設備有LAN介面,但在前一次系統固件升級後,其內部的三個網路介面可以相互ping通,但任一介面無法ping通外部網路介面,目前該問題還沒有解決; 另外實驗室還涉及到連接外部網路的許可權問題,所以就想是否可以通 ...
  • zabbix 監控的搭建、使用--詳解 zabbix 是一個基於WEB界面的提供分散式系統監視以及網路監視功能的企業級的開源解決方案 ...
  • 最終環境: Ubuntu17.10、Apache2.4.27、MySQL5.7.20、PHP7.1 1. 安裝 apache 官方源有,直接安裝: 2. 安裝 mysql 官方源有,直接安裝: 安裝期間會提示設置 MySQL administrator 的密碼 PS:需要什麼軟體或包,直接用 apt ...
  • 方法一:支持rsync的網站 對於常用的centos、Ubuntu、等使用官方yum源在 http://mirrors.ustc.edu.cn 都存在鏡像。 同時 http://mirrors.ustc.edu.cn 網站又支持 rsync 協議, 可以通過rsync實現 鏡像yum源。 在wind ...
  • Linux下軟體的安裝一般由3個步驟組成: 若取消編譯: 若卸載軟體: 本節主要討論configure配置腳本。 如下圖所示,有些軟體就有configure配置腳本: 就可以使用命令./configure –help 輸出詳細的選項列表 常用選項如下: --host 編譯運行後的程式,預設為buil ...
  • 三劍客之awk 第1章 awk簡介 1.1 awk簡介 一種名字怪異的語言。 模式掃描和處理。處理文本流,水流。 awk不僅僅是linux系統中的一個命令,而且是一種編程語言,可以用來處理數據和生成報告。 處理的數據可以是一個或多個文件,可以是來自標準輸入,也可以通過管道獲取標準輸入,awk可以 在 ...
  • [20171120]關於find 軟連接問題.txt--//上個星期為了測試oracle參數filesystemio_options,將資料庫做了一次移動.但是我使用find對軟鏈接目錄查詢時--//遇到一些問題做一個記錄1.建立軟鏈接:$ cp -a /mnt/ramdisk/book /home ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...