系統內存/進程內存知識掃盲

2021-02-24 大話性能
Linux的內存管理和相關概念要比Windows複雜一些,而且還有一些區別,有悖於平時的理解,而做性能測試的同學都知道,很多時候性能測試的伺服器都是linux的,需要觀察linux的內存使用狀態,首先需要判斷整體系統的內存情況,然後是進程級別的內存情況,你真的搞清楚這裡面的方法了嘛?

1、核心概念

耳熟能詳的字眼有虛擬內存、共享內存、物理內存,這裡簡要說明,更多複雜的linux內存管理機制,有興趣的同學可以自己深入了解,說實話我也沒有很深入學習。物理內存:就是系統硬體提供的內存大小,是真正的內存,一般叫做內存條,是與CPU直接交換數據的內部存儲器,也叫主存(內存)。 虛擬內存:相對於物理內存,在Linux下還有一個虛擬內存的概念,虛擬內存就是為了滿足物理內存的不足而提出的策略,它是利用磁碟空間虛擬出的一塊邏輯內存,用作虛擬內存的磁碟空間被稱為交換空間(Swap Space)。Linux會在物理內存不足時,使用虛擬內存,內核會把暫時不用的內存塊信息寫到虛擬內存,這樣物理內存就得到了釋放,這塊兒內存就可以用於其他目的,而需要用到這些內容的時候,這些信息就會被重新從虛擬內存讀入物理內存。一般來說,如果系統要用到了虛擬內存,那表明系統的內存資源存在瓶頸了。 共享內存:就是多個進程間共同地使用同一段物理內存空間,它是通過將同一段物理內存映射到不同進程的虛擬空間來實現的,是進程間通信中最簡單的方式之一。

2、命令查看系統內存和進程內存

通常使用free命令查看作業系統整體的內存使用狀況,如下是centos7的示意圖(不同系統或者統一系統不同版本的命令輸出也會有一定的區別)buff/cache:被 buffer 和 cache 使用的物理內存大小。buffers是指用來給塊設備做的緩衝大小(塊設備的讀寫緩衝區),它只記錄文件系統的metadata以及 tracking in-flight pages。cached是作為page cache的內存, 文件系統的cache。你讀寫文件的時候,Linux內核為了提高讀寫性能與速度,會將文件在內存中進行緩存,這部分內存就是Cache Memory(緩存內存)。即使你的程序運行結束後,Cache Memory也不會自動釋放。這就會導致你在Linux系統中程序頻繁讀寫文件後,你會發現可用物理內存會很少。其實這緩存內存(Cache Memory)在你需要使用內存的時候會自動釋放,所以你不必擔心沒有內存可用。available:還可以被應用程式使用的物理內存大小。在Linux中經常發現空閒的內存很少,似乎所有的內存都被消耗殆盡了,表面上看是內存不夠用了,很多新手看到內存被「消耗殆盡」非常緊張,其實這個是因為Linux系統將空閒的內存用來做磁碟文件數據的緩存。這個導致你的系統看起來處於內存非常緊急的狀況。但是實際上不是這樣。這個區別於Windows的內存管理。Linux會充分利用空閒的內存來做cached & buffers。在 上面的centos7中的free 命令的輸出中,有一個 available 列, available 就比較有意思了,它是從應用程式的角度看到的可用內存數量。Linux 內核為了提升磁碟操作的性能,會消耗一部分內存去緩存磁碟數據,就是我們介紹的 buffer 和 cache。所以對於內核來說,buffer 和 cache 都屬於已經被使用的內存。當應用程式需要內存時,如果沒有足夠的 free 內存可以用,內核就會從 buffer 和 cache 中回收內存來滿足應用程式的請求。所以從應用程式的角度來說,真正還可以用的內存是available包括free 、部分的buffer、  部分的cache。其實 free 命令中的信息都來自於 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息,只是看起來不太直觀。應用程式可用內存/系統物理內存>80%時,表示系統內存資源非常充足,不影響系統性能,應用程式可用內存/系統物理內存<20%時,表示系統內存資源緊缺,需要增加系統內存,20%<應用程式可用內存/系統物理內存<80%時,表示系統內存資源基本能滿足應用需求,暫時不影響系統性能。在知道了系統如果存在內存資源瓶頸後,如何進一步定位到底是哪個進程導致的內存問題呢?通常採用top和ps aux命令即可。Mem: 8010172 total, 4973948 used,並不是代表你的應用程式已經使用了4973948的內存,這裡包含了:應用程式內存 + 緩衝 + 緩存的內存的。所以不能簡單的通過這個來評判系統內存資源是否充足。虛擬內存是一個假象的內存空間,在程序運行過程中虛擬內存空間中需要被訪問的部分會被映射到物理內存空間中。虛擬內存空間大只能表示程序運行過程中可訪問的空間比較大,不代表物理內存空間佔用也大。注意:這裡的虛擬內存和最上面介紹的使用磁碟作為swap的虛擬內存是不一樣的概念,注意區別!!CODE  可執行代碼佔用的物理內存大小,單位kb   DATA  可執行代碼以外的部分(數據段+棧)佔用的物理內存大小,單位kb  RES就是進程實實在在佔用的物理內存。一般我們所講的進程佔用了多少內存,其實就是說的佔用了多少駐留內存而不是多少虛擬內存。SHR:進程使用的共享內存值,譬如一些外部動態庫(.so)所以某個進程佔用的內存除了和別的進程共享的內存之外就是自己的獨佔內存了,要計算進程獨佔內存的大小隻要用RES的值減去SHR值即可。%MEM這一列的值加起來會大於100呢?這個是因為這裡計算的時候包含了共享內存的緣故,另外由於共享內存的緣故,你看到進程使用VIRT或RES都非常高。由於大部分的物理內存通常在多個應用程式之間共享,將各進程的RES值相加,通常會超出整個系統的內存消耗,這是因為RES中包含了各進程間共享的內存。VSZ(或VSS)列 表示,程序佔用了多少虛擬內存,類似top的VIRT列。RSS列 表示, 程序佔用了多少物理內存,類似top的RES列。所以平時看到很多內存相關的英文縮寫,給人感覺好複雜,其實很多都指的是同一個東西。ps -aux | sort -k4nr | head 5

3、知識擴展

測量一個進程佔用了多少內存,linux為我們提供了一個很方便的方法,/proc目錄為我們提供了所有的信息,實際上top等工具也通過這裡來獲取相應的信息。所以如果是自己寫代碼的方式完全可以從這些源頭獲取數據。 /proc/pid/maps pid為進程號,顯示當前進程所佔用的虛擬地址。情況說明:centos系統,buff/cache佔用過高,導致伺服器內存居高不下,但是通過top查看系統進程並無過多佔用內存。

echo 3 > /proc/sys/vm/drop_caches

sync 指令會將存於 buffer 中的資料強制寫入硬碟中,避免丟失數據。
echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。
echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的對象

(包括目錄項緩存和inode緩存)。

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


免費領取例子腳本和代碼

免費PMP考試資料

免費python學習資料

掃一掃,加小T

相關焦點

  • 郭健:Linux內存管理系統參數配置之OOM(內存耗盡)
    MEMCG就是memory control group,Cgroup這東西太複雜,這裡不適合多說,Cgroup中的memory子系統就是控制系統memory資源分配的控制器,通俗的將就是把一組進程的內存使用限定在一個範圍內。當這一組的內存使用超過上限就會OOM,在這種情況下的OOM就是CONSTRAINT_MEMCG類型的OOM。OK,了解基礎知識後,我們來看看內核代碼。
  • 獨家|Linux進程內存用量分析之堆內存篇
    本文將介紹幾種內存洩漏檢測工具,並通過實際例子介紹一種分析堆內存佔用量的工具和方法,幫助定位內存膨脹問題。背景進程的內存管理是每一個開發者必須要考慮的問題,對於C++程序進程來說,出現問題很多情況下都與內存掛鈎。進程崩潰問題通常可以使用gdb等調試工具輕鬆排查並解決。
  • 如何快速讀取Mac進程的內存映射
    由於它們就在我正在查看的Ruby二進位文件的符號表中,所以通常獲取這兩個變量的地址並不難,但是由於ASLR的存在,二進位文件會隨機加載到內存中。所以我需要做到以下幾點:1. 在符號表中找到ruby_version的地址;2. 找出Ruby二進位文件在內存中加載的位置(來自進程的內存映射);3.
  • 系統軟體工程師必備技能-進程內存的working set size(WSS)測量...
    阿里雲系統團隊,是由原淘寶內核組擴建而成,2013年淘寶內核組響應阿里巴巴集團的號召,整建制轉入阿里雲,開始為雲計算底層系統構建完善的系統支持。 阿里雲系統團隊是由一群具有高度使命感和自我追求的內核開發人員組成,團隊中的大多數人,都是活躍的社區內核開發人員。目前的工作領域主要涉及(但不限於) Linux內核的內存管理、文件系統、網絡和內核維護構建,以及和內核相關聯的用戶態庫和工具。
  • 探討Linux作業系統虛擬內存和物理內存的關係
    探討Linux作業系統虛擬內存和物理內存的關係 TOMORROW 星辰 發表於 2020-12-10 16:12:20 為了高效、準確測試出該系統下,單個進程能夠申請到的最大虛存空間
  • 一條進程的棧區、堆區、數據區和代碼區在內存中的映射
    注意:1)堆向高內存地址生長;2)棧向低內存地址生長;3)堆和棧相向而生,堆和棧之間有個臨界點,稱為stkbrk。1、一條進程在內存中的映射假設現在有一個程序,它的函數調用順序如下:main(...)當一個程序被作業系統調入內存運行,其對應的進程在內存中的映射如下圖所示:注意:l隨著函數調用層數的增加,函數棧幀是一塊塊地向內存低地址方向延伸的;l隨著進程中函數調用層數的減少(即各函數調用的返回),棧幀會一塊塊地被遺棄而向內存的高址方向回縮;l各函數的棧幀大小隨著函數的性質的不同而不等
  • 內存初始化代碼分析(三):創建系統內存地址映射
    偌大的物理地址空間中,系統內存佔據了一段或者幾段地址空間,這些信息被保存在了memblock模塊中的memory type類型的數組中,數組中每一個memory region描述了一段系統內存信息(base、size以及node id)。
  • JVM中的五大內存區域劃分詳解及快速掃盲
    一、快速掃盲1. JVM是什麼JVM是JavaVirtualMachine的縮寫,即咱們經常提到的Java虛擬機。虛擬機是一種抽象化的計算機,有著自己完善的硬體架構,如處理器、堆棧等,具體有什麼咱們不做了解。
  • Android 內存管理詳解
    二、共享內存為了適應不同的RAM需求,Android 嘗試在不同進程之間共享內存,共享內存的方法如下:1. APP共享Framework框架代碼以及資源每個APP的進程都是從Zygote進程中分離出來的。Zygote 進程:Zygote進程是在系統啟動並加載Framwork框架代碼和資源(如Activity Theme)時開始。
  • 每個程式設計師都該了解一點 Linux 內存管理知識
    通過 ping 可以知道這臺伺服器還「活著」,但是無法通過 ssh 登錄,網絡鏈路確認了沒有問題,在線系統日誌也查不出什麼端倪。排除了所有的可能性之後,我們只能認為,這臺伺服器不僅幹掉了我們部署的服務,而且幹掉了 sshd 進程。
  • 七日殺內存不足怎麼辦 自動釋放內存軟體推薦
    ,幾乎十個玩家中就有八九個人會說玩遊戲的時候很卡,這個不容置疑還是由於七日殺內存不足的問題導致。下面巴士單機遊戲小編為大家介紹下七日殺釋放內存方法,推薦一款自動釋放內存軟體,感興趣的朋友不要錯過。 使用槍枝打倒樹木速度會快點哦   七日殺自動釋放內存軟體:   下載地址:http://kuai.xunlei.com/d/2Bh2Brx4ivMjUgQAa1a
  • 嵌入式Linux內存管理的一些知識點總結
    這個內存管理的知識點還真的需要我們專門的去理解一下,今天大家一起來學習學習嵌入式Linux內存管理的知識。1.不涉及linux內核的彙編知識,僅C語言層面解析1.回答:彙編主要處理的是寄存器地址(包括內容)的計算,進行一部分的地址轉換工作(當然,它是重要的);C語言處理了極大部分的系統內存管理工作。
  • WinCE內存管理報告
    在低內存的情況下,系統會請求用戶把部分可用的存儲對象空間提供給運行程序使用,以滿足程序運行的RAM需要。u PC機上,ROM用來存儲BIOS,通常是64-128K。在WindowCE系統中,ROM用來存儲整個作業系統以及和OS綁定的應用程式,大小可以4-32M不等。因此,WinCE下的ROM就像一個很小的只讀硬碟一樣。
  • 雲主機的13G內存去哪裡了 聊聊Hugepages大頁內存管理
    一、雲主機13G內存被無故佔用今天群裡的小夥伴在巡檢雲主機時發現一臺雲主機的內存監控報警了,登陸該雲主機系統後發現系統內存被莫名佔用了13G,空閒內存為「0」,所以導致監控報警,如圖一所示:圖一 內存使用截圖接著小夥伴查看了進程相關信息,如圖二所示
  • 《Dump進程內存鏡像並查找字符串工具》的舉例應用
    《Dump進程內存鏡像並查找字符串工具》一文引發了眾多「號」友(公眾號)的留言,給予了很高的評價,我非常開心,感謝你們的熱情支持!應廣大號友的要求,我今天來介紹個「獲取密碼框中密碼」的例子,這也是我開發這個工具軟體的初衷原因;通過這個場景,希望你能舉一反三,開拓出它的更多的用法。
  • 最全的Android內存優化技巧
    代碼混淆可以去除無用代碼,通過語意模糊對類、欄位進行重命名,從而縮小、優化代碼,產生更少量的內存映射有關代碼混淆的更多知識見:最全的Android混淆使用手冊6.復用系統自帶的資源Android系統本身內置了很多的資源,比如string、color、drawable、anim、style以及簡單layout等,這些資源都可以在應用程式中直接引用。這樣做不僅能減小APK的大小,還可以在一定程度上減少內存的開銷2.
  • Linux的共享內存與自旋鎖
    Linux的共享內存(shared memory)是進程間通信的一種機制之一,用於在多個進程之間共享數據。共享的數據屬於多個進程的共同資源,類似於多線程的數據一樣,也要使用鎖來保護。線程是使用pthread_mutex來保護,進程可以使用fcntl()對共享內存的文件描述符加鎖,也可以把共享內存的前4位元組當作自旋鎖spinlock來使用。自旋鎖,可以像之前的文章提到的,以xchg指令為基礎來實現。
  • Tachyon:Spark生態系統中的分布式內存文件系統
    Tachyon是Spark生態系統內快速崛起的一個新項目。 本質上, Tachyon是個分布式的內存文件系統, 它在減輕Spark內存壓力的同時,也賦予了Spark內存快速大量數據讀寫的能力。Tachyon把內存存儲的功能從Spark中分離出來, 使Spark可以更專注計算的本身, 以求通過更細的分工達到更高的執行效率。
  • 手機內存科普:你說的「內存」,其實不是內存?
    很長一段時間以來,普通用戶對「內存」和「快閃記憶體」都不甚了解,在日常交流中常常會出現一些交流的困難。今年,旗艦手機基本都標配了UFS 3.0(或3.1)、LPDDR5,普通用戶對這些名詞大概更是一頭霧水。今天,我們就來簡單聊一下手機內存和存儲,釐清一些常見的誤區,同時,也為不太了解這些知識的用戶提供一些購機參考。
  • Android 輕鬆解決內存洩漏
    基礎知識Java 的內存分配簡述另一方面,內存變少,將可能使得系統會額外分配給你一些內存,而影響整個系統的運行狀況。運行崩潰問題: 內存洩露是內存溢出(OOM)的重要原因之一,會導致 Crash。如果應用程式在消耗光了所有的可用堆空間,那麼再試圖在堆上分配新對象時就會引起 OOM(Out Of Memory Error) 異常,此時應用程式就會崩潰退出。