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 53、知識擴展
測量一個進程佔用了多少內存,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