Linux 查看進程消耗記憶體情況總結

来源:https://www.cnblogs.com/kerrycode/archive/2018/09/01/9568854.html
-Advertisement-
Play Games

在Linux中,有很多命令或工具查看記憶體使用情況,今天我們來看看如何查看進程消耗、占用的記憶體情況,Linux的記憶體管理和相關概念要比Windows複雜一些。在此之前,我們需要瞭解一下Linux系統下麵有關記憶體的專用名詞和專業術語概念: 物理記憶體和虛擬記憶體 物理記憶體:就是系統硬體提供的記憶體大小,是真正... ...


 

在Linux中,有很多命令或工具查看記憶體使用情況,今天我們來看看如何查看進程消耗、占用的記憶體情況,Linux的記憶體管理和相關概念要比Windows複雜一些。在此之前,我們需要瞭解一下Linux系統下麵有關記憶體的專用名詞和專業術語概念:

 

 

物理記憶體和虛擬記憶體

 

物理記憶體:就是系統硬體提供的記憶體大小,是真正的記憶體,一般叫做記憶體條。也叫隨機存取存儲器(random access memory,RAM)又稱作隨機存儲器,是與CPU直接交換數據的內部存儲器,也叫主存(記憶體)。

 

虛擬記憶體:相對於物理記憶體,在Linux下還有一個虛擬記憶體的概念,虛擬記憶體就是為了滿足物理記憶體的不足而提出的策略,它是利用磁碟空間虛擬出的一塊邏輯記憶體,用作虛擬記憶體的磁碟空間被稱為交換空間(Swap Space)。Linux會在物理記憶體不足時,使用虛擬記憶體,內核會把暫時不用的記憶體塊信息寫到虛擬記憶體,這樣物理記憶體就得到了釋放,這塊兒記憶體就可以用於其他目的,而需要用到這些內容的時候,這些信息就會被重新從虛擬記憶體讀入物理記憶體。

 

 

Linuxbufferscached

 

在Linux中經常發現空閑的記憶體很少,似乎所有的記憶體都被消耗殆盡了,錶面上看是記憶體不夠用了,很多新手看到記憶體被消耗殆盡非常緊張,其實這個是因為Linux系統將空閑的記憶體用來做磁碟文件數據的緩存。這個導致你的系統看起來處於記憶體非常緊急的狀況。但是實際上不是這樣。這個區別於Windows的記憶體管理。Linux會利用空閑的記憶體來做cached & buffers。

 

 

buffers是指用來給塊設備做的緩衝大小(塊設備的讀寫緩衝區),它只記錄文件系統的metadata以及 tracking in-flight pages.

 

Buffers are associated with a specific block device, and cover caching of filesystem metadata as well as tracking in-flight pages. The cache only contains parked file data. That is, the buffers remember what's in directories, what file permissions are, and keep track of what memory is being written from or read to for a particular block device. The cache only contains the contents of the files themselves.

 

  

cached是作為page cache的記憶體, 文件系統的cache。你讀寫文件的時候,Linux內核為了提高讀寫性能與速度,會將文件在記憶體中進行緩存,這部分記憶體就是Cache Memory(緩存記憶體)。即使你的程式運行結束後,Cache Memory也不會自動釋放。這就會導致你在Linux系統中程式頻繁讀寫文件後,你會發現可用物理記憶體會很少。其實這緩存記憶體(Cache Memory)在你需要使用記憶體的時候會自動釋放,所以你不必擔心沒有記憶體可用

 

Cached is the size of the page cache. Buffers is the size of in-memory block I/O buffers. Cached matters; Buffers is largely irrelevant.

 

Cached is the size of the Linux page cache, minus the memory in the swap cache, which is represented by SwapCached (thus the total page cache size is Cached + SwapCached). Linux performs all file I/O through the page cache. Writes are implemented as simply marking as dirty the corresponding pages in the page cache; the flusher threads then periodically write back to disk any dirty pages. Reads are implemented by returning the data from the page cache; if the data is not yet in the cache, it is first populated. On a modern Linux system, Cached can easily be several gigabytes. It will shrink only in response to memory pressure. The system will purge the page cache along with swapping data out to disk to make available more memory as needed.

Buffers are in-memory block I/O buffers. They are relatively short-lived. Prior to Linux kernel version 2.4, Linux had separate page and buffer caches. Since 2.4, the page and buffer cache are unified and Buffers is raw disk blocks not represented in the page cache—i.e., not file data. The Buffers metric is thus of minimal importance. On most systems, Buffers is often only tens of megabytes.

 

 

Linux共用記憶體

 

共用記憶體是進程間通信中最簡單的方式之一。共用記憶體允許兩個或更多進程訪問同一塊記憶體,就如同 malloc() 函數向不同進程返回了指向同一個物理記憶體區域的指針。當一個進程改變了這塊地址中的內容的時候,其它進程都會察覺到這個。其實所謂共用記憶體,就是多個進程間共同地使用同一段物理記憶體空間,它是通過將同一段物理記憶體映射到不同進程的虛擬空間來實現的。由於映射到不同進程的虛擬空間中,不同進程可以直接使用,不需要像消息隊列那樣進行複製,所以共用記憶體的效率很高。共用記憶體可以通過mmap()映射普通文件機制來實現,也可以System V共用記憶體機制來實現,System V是通過映射特殊文件系統shm中的文件實現進程間的共用記憶體通信,也就是說每個共用記憶體區域對應特殊文件系統shm中的一個文件。

 

 

另外,我們還必須瞭解RSS、PSS、USS等相關概念:

 

     VSS Virtual Set Size 虛擬耗用記憶體(包含共用庫占用的記憶體)

      RSS Resident Set Size 實際使用物理記憶體(包含共用庫占用的記憶體)

      PSS Proportional Set Size 實際使用的物理記憶體(比例分配共用庫占用的記憶體)

      USS Unique Set Size 進程獨自占用的物理記憶體(不包含共用庫占用的記憶體)

 

RSS(Resident set size),使用top命令可以查詢到,是最常用的記憶體指標,表示進程占用的物理記憶體大小。但是,將各進程的RSS值相加,通常會超出整個系統的記憶體消耗,這是因為RSS中包含了各進程間共用的記憶體。

 

PSS(Proportional set size)所有使用某共用庫的程式均分該共用庫占用的記憶體時,每個進程占用的記憶體。顯然所有進程的PSS之和就是系統的記憶體使用量。它會更準確一些,它將共用記憶體的大小進行平均後,再分攤到各進程上去。

 

USS(Unique set size )進程獨自占用的記憶體,它是PSS中自己的部分,它只計算了進程獨自占用的記憶體大小,不包含任何共用的部分。

     

          

所以下麵介紹的命令,有些查看進程的虛擬記憶體使用,有些是查看進程的RSS或實際物理記憶體。在講述的時候,我們會標註這些信息。

 

 

 

top命令查看

 

執行top命令後,執行SHIFT +F ,可以選擇按某列排序,例如選擇n後,就會按欄位%MEM排序

 

clip_image001

 

 

當然也可以使用shift+m 或大寫鍵M 讓top命令按欄位%MEM來排序,當然你也可以按VIRT(虛擬記憶體)、SWAP(進程使用的SWAP空間)、RES(實際使用物理記憶體,當然這裡由於涉及共用記憶體緣故,你看到的實際記憶體非常大)

 

 

%MEM -- Memory usage (RES)

 

     A task's currently used share of available physical memory

     

VIRT -- virtual memory 

   

    The  total  amount  of virtual memory used by the task.  It includes all code, data and shared libraries plus pages that have been swapped out. (Note: you can define the STATSIZE=1 environment variable and the VIRT will be calculated from the /proc/#/state VmSize field.)

 

    VIRT = SWAP + RES

 

SWAP  --  Swapped size (kb)

 

   The swapped out portion of a tasks total virtual memory image.

 

RES  --  Resident size (kb)

       

    RES = CODE + DATA.

 

         

 

是否有人會覺得奇怪,為什麼%MEM這一列的值加起來會大於100呢? 這個是因為這裡計算的時候包含了共用記憶體的緣故,另外由於共用記憶體的緣故,你看到進程使用VIRT或RES都非常高。由於大部分的物理記憶體通常在多個應用程式之間共用,名為實際使用物理記憶體(RSS,對應top命令裡面的RES)的這個標準的記憶體耗用衡量指標會大大高估記憶體耗用情況。

 

clip_image002

 

 

 

ps命令查看

 

 

 

使用ps命令找出占用記憶體資源最多的20個進程(數量可以任意設置)

 

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

-Advertisement-
Play Games
更多相關文章
  • 公司項目有個需求,UI界面支持動態平均分割界面,想了想便想到用ListBox來實現,用UniformGrid作為ListBox的ItemsPanelTemplate,通過動態改變UniformGrid的Columns屬性,可以動態分割界面。具體實現如下所示: 對應的ViewModel層代碼: 軟體運 ...
  • 1. 概述... 2 2. ServerSuperIO.Core跨平臺開發環境... 2 3. ServerSuperIO.Core特點... 2 4. ServerSuperIO.Core與ServerSuperIO區別... 2 5. 嵌入式應用... 2 6. 上位機應用... 2 7. 雲服 ...
  • 在使用WPF開發的時候就不免會遇到需要兩個視窗間進行傳值操作,當然多視窗間傳值的方法有很多種,本文介紹的是使用委托實現多視窗間的傳值。 在上代碼之前呢,先簡單介紹一下什麼是C#中的委托(如果只想瞭解如何傳值可以略過這部分)在網路上有很多對於委托的介紹和講解,經過我的學習和總結加上了一點我自己的理解, ...
  • 一.數據類型 值類型 引用類型 數組 類(自定義類) 字元串 介面 Object 委托 指針類型 官方給出的說明 在指針類型中的 * 之前指定的類型被稱為“referrent 類型”。 以下任一類型均可為 referrent 類型: 任何整型類型:sbyte、byte、short、ushort、in ...
  • 2018-08-30 直接調用瀏覽器的列印方法 1、列印按鈕 <a href="#" target="_self" onclick="printme()">列印</a> 2、js 2、js //列印 function printme() { $.messager.confirm('確認', '確認打 ...
  • Hadoop 中文編碼相關問題 -- mapreduce程式處理GBK編碼數據並輸出GBK編碼數據 Hadoop 中文編碼相關問題 -- mapreduce程式處理GBK編碼數據並輸出GBK編碼數據 Hadoop 中文編碼相關問題 -- mapreduce程式處理GBK編碼數據並輸出GBK編碼數據 ...
  • 作者:依樂祝 原文地址:https://www.cnblogs.com/yilezhu/p/9557375.html 簡單的說Ocelot是一個用.NET Core實現並且開源的API網關技術。 可能你又要問了,什麼是API網關技術呢?Ocelot又有什麼特別呢?我們又該如何集成到我們的asp.ne ...
  • 優先順序 欄位 | 描述 | static_prio | 用於保存靜態優先順序,可以通過nice系統調用來進行修改 rt_priority | 用於保存實時優先順序 normal_prio | 它的值取決於靜態優先順序和調度策略 prio | 用於保存動態優先順序 實時優先順序範圍是0到MAX_RT_PRIO ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...