釋放內存有三種方法(官方有解釋)


面試中發現大量的人對這塊幾乎是空白,誰都知道free -m  但是究竟什么意思,都說的不是很清楚了。 因為網上很多寫的也不是很詳細。或者本身就有誤區
我這塊也是在不斷調整闡述的內容和方式以及樣式。出了多個版本,力求更好的進行解釋呈現。


系統采樣

[root@fp-web-112 ~]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 


查看機器內存占用情況

 我們簡單解釋一下輸出的信息:
1、總的內存15G
2、已經使用將近1個G
3、buff數據即等待寫入設備的數據+磁盤讀取出來放在cache中提高訪問速度的加起來是11G
     這部分屬於臨時的,我們可以在內存遇到瓶頸的時候,想辦法釋放出來的。
    buffer是用於存放要寫入到磁盤或者其他塊設備的數據,cache是存放從磁盤或其他文件系統上讀出的數據。這二者是為了提高IO性能的,並由OS管理。
    我們狹義的理解:在歷史上,它們一個(buffer)被用來當成對io設備寫的緩存,而另一個(cache)被用來當作對io設備的讀緩存,
    這里的io設備,主要指的是塊設備文件和文件系統上的普通文件。我們如果深入了解過linux或讀過操作系統原理就知道linux內存管理方式是.
4、cache這里實際就是page cache(系統內核層面就叫page cache,這是linux內存頁管理機制,page cache跟磁盤io密切相關)
   它的具體大小,我們是可以通過/proc/meminfo來查看的,本身free命令也是讀取的/proc/meminfo數據提取的.
5、free列表示可用3.2G,因為buff+cache占用了11G
6、swap空間 也交換空間,linux根據自己的算法把暫時不用的內存塊數據,放到這里來.

如果你的內存存在問題,你也最好用slabtop也查看下內核占用內存情況,往往slab占用的緩存也不是不少的(slab+buddy是linux內存管理機制)

 

上面的輸出中內存計算公式

 MemTotal = MemFree +【Slab+ VmallocUsed + PageTables + KernelStack + HardwareCorrupted + Bounce + X】+【Active + Inactive + Unevictable + (HugePages_Total * Hugepagesize)】
MemTotal = MemFree +【Slab+ VmallocUsed + PageTables + KernelStack + HardwareCorrupted + Bounce + X】+【Cached + AnonPages + Buffers + (HugePages_Total * Hugepagesize)】
MemTotal = MemFree +【Slab+ VmallocUsed + PageTables + KernelStack + HardwareCorrupted + Bounce + X】+【ΣPss + (Cached – mapped) + Buffers + (HugePages_Total * Hugepagesize)】

 

為了提高磁盤存取效率, 除了對dentry進行緩存(用於VFS,加速文件路徑名到inode的轉換),還采取了兩種主要Cache方式:Buffer Cache和Page Cache。
前者針對磁盤塊的讀寫,后者針對文件inode的讀寫。

dentry解釋:dentry是一個純粹的內存結構,由文件系統在提供文件訪問的過程中在內存中直接建立,dentry,即directory entry,目錄項,就是多個文件或者目錄的鏈接,通過這個鏈接可以找尋到目錄之下的文件或者是目錄項。dentry在文件系統里是極其重要的一個概念,dentry結構體在linux內核里也是用處廣泛,這個結構體定義在include/linux/dcache.h里。

這些Cache有效縮短了 I/O系統調用(比如read,write,getdents)的時間。

inode僅僅只是保存了文件對象的屬性信息,包括:權限、屬組、數據塊的位置、時間戳等信息。但是並沒有包含文件名,文件在文件系統的目錄樹中所處的位置信息。那么內核又是怎么管理文件系統的目錄樹呢?答案是目錄項。目錄項在內核中起到了連接不同的文件對象inode的作用,進而起到了維護文件系統目錄樹的作用。 

關於inode可以看我的另一篇 https://www.cnblogs.com/aozhejin/p/15873245.html

 

內存信息文件位置在/proc/meminfo中,該文件記錄內存的實時信息。/proc/meminfo是了解Linux系統內存使用狀況的主要接口
平常使用的“free", "vmstat"等命令都是通過這個文件獲取數據的。
我們知道 /proc目錄是linux中的虛擬文件目錄,記錄着內核中實時相關的數據以及進程的相關信息,通過這個目錄下的文件修改,可以干預linux的行為
所以另外章節說明一下/proc 這里面的內容.
可參考內核官方解釋:  https://www.kernel.org/doc/Documentation/filesystems/proc.txt   //這個可能需要你掌握比較多的系統原理性內容以及英語。

我們查看/proc/meminfo 這個文件的內容同時做一些注解,但是要注意Linux 內核並沒有統計到所有的內存分配,
內核動態分配的內存中就有一部分沒有計入/proc/meminfo中。

[root@fp-web-112 ~]# cat /proc/meminfo

MemTotal: 16418116 kB  //系統從加電開始到引導完成,firmware/BIOS要保留一些內存,kernel本身要占用一些內存,最后剩下可供kernel支配的內存就是MemTotal
MemFree: 1717744 kB //表示系統尚未使用的內存,但是MemFree不能代表全部可用的內存,系統中有些內存雖然已被使用但是可以回收的,
比如cache/buffer、slab都有一部分可以回收,所以這部分可回收的內存加上MemFree才是系統可用的內存。
MemAvailable: 15052664 kB    //是內核使用特定的算法估算出來的,要注意這是一個估計值,並不精確
Buffers: 2772 kB          //緩沖區使用的內存,臨時存儲原始磁盤塊的總量
Cached: 13101368 kB          //文件緩存頁
SwapCached: 0 kB           //交換分區內存,這個需要開啟swap.
Active: 12044148 kB        //最近經常被使用的內存大小總量(包括文件頁緩存和匿名頁緩存), 我們使用的vmstat -a 命令也是讀取的這個文件中的這個項。
Inactive: 1829524 kB        //最近不是經常使用的內存(可以被釋放的pagecache memory)
Active(anon): 769896 kB      //匿名和tmpfs/shmem內存總量
Inactive(anon): 852 kB       //不活躍的匿名頁緩存
Active(file): 11274252 kB    //活躍的文件頁緩存,
Inactive(file): 1828672 kB   //不活躍的文件頁緩存
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 39145464 kB   //交換空間總的大小
SwapFree: 39145464 kB    //空閑的交換空間
Dirty: 980 kB            //需要寫入磁盤緩存數據(一般叫磁盤寫緩沖),980k即占用的內存大小,如果很多,可以使用 sync 同步一下也就是寫入磁盤,釋放寫緩沖
Writeback: 0 kB          //正在被寫回的內存區的大小
AnonPages: 769536 kB
Mapped: 177700 kB
Shmem: 1212 kB
Slab: 564860 kB          //slab緩存大小,這個大小有時候不可以忽略,需要關注。slab分配的內存會被精確統計 (可以使用slabtop查看linux內核的數據結構對象的緩存情況)
SReclaimable: 485412 kB  //SReclaimable指可收回Slab的大小(slab就是內核緩存,可查看 /proc/slabinfo)
SUnreclaim: 79448 kB     
//slab不可回收部分(2.6.2之后linux引入的內存管理機器,我們通過用buddy分配內存是以4k為單位(4k是否看系統,一般都是4k),
但是也有一些幾k或幾百字節的數據結構要存儲,所以slab就很好的解決了這個問題)
KernelStack: 11312 kB
PageTables: 10580 kB   //管理內存分頁的索引表的大小(頁表數量)
NFS_Unstable: 0 kB     //NFS_Unstable是發給NFS server但尚未寫入硬盤的緩存頁
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 47354520 kB
Committed_AS: 2404288 kB
VmallocTotal: 34359738367 kB   //通過vmalloc分配的內存(以字節為單位分配虛擬地址連續的內存塊),該內存屬於內核動態內存的內存
VmallocUsed: 218620 kB         //kernel module的內存被包含在VmallocUsed中
VmallocChunk: 34359409616 kB
HardwareCorrupted: 0 kB
AnonHugePages: 112640 kB
HugePages_Total: 0        //大頁總的數量,如果你的linux設置了大頁模式。當前的page頁大小可以通過 getconf PAGE_SIZE 命令得到,一般是4092/1024=4k
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap 4k: 116544 kB     //表示映射為4kB的內存數量
DirectMap 2M: 4077568 kB    //示映射為2MB的內存數量,DirectMap所統計的不是關於內存的使用,而是一個反映TLB效率的指標。
TLB(Translation Lookaside Buffer)是位於CPU上的緩存,用於將內存的虛擬地址翻譯成物理地址,由於TLB的大小有限,
不能緩存的地址就需要訪問內存里的page table來進行翻譯,速度慢很多。為了盡可能地將地址放進TLB緩存,新的CPU硬件支持比4k更大的頁面從而達到減少地址數量的目的,
比如2MB,4MB,甚至1GB的內存頁,視不同的硬件而定。”DirectMap4k”表示映射為4kB的內存數量, “DirectMap2M”表示映射為2MB的內存數量,以此類推。
所以DirectMap其實是一個反映TLB效率的指標
DirectMap 1G: 14680064 kB   //表示映射為1G的內存數量(cpu二級內存--》物理地址映射)

參考:
https://man7.org/linux/man-pages/man5/slabinfo.5.html 
https://man7.org/linux/man-pages/man5/proc.5.html   

cpu二級緩存查找,下面輸出結果,由於是多核,出現多個

 



釋放內存方法有三種(系統默認值是0,釋放之后你需要再改回0值)


https://www.kernel.org/doc/Documentation/sysctl/vm.txt   

 1、echo 1 > /proc/sys/vm/drop_caches   作用: 釋放 pagecache
 2、echo 2 > /proc/sys/vm/drop_caches   作用: 釋放 dentries and inodes
 3、echo 3 > /proc/sys/vm/drop_caches   作用: 釋放 pagecache, dentries and inodes

 常用方法是:echo 1 > /proc/sys/vm/drop_caches

 查看與操作 
[root@fp-web-112 ~]# cat /proc/sys/vm/drop_caches 

 0

 [root@fp-web-112 ~]# sync
 [root@fp-web-112 ~]#echo 3 > /proc/sys/vm/drop_caches
 [root@fp-web-112 ~]# cat /proc/sys/vm/drop_caches
 [root@fp-web-112 ~]# free -m
 首先,/proc/sys/vm/drop_caches的值,默認為0
 手動執行sync命令(描述:sync 命令運行 sync 子例程。如果必須停止系統,則運行sync 命令以確保文件系統的完整性。
  sync 命令將所有未寫的系統緩沖區寫到磁盤中,包含已修改的 i-node、已延遲的塊 I/O 和讀寫映射文件.


linux 內核官網: https://www.kernel.org 
https://www.kernel.org/doc/Documentation 
https://www.kernel.org/doc/Documentation/sysctl/vm.txt
vm.txt有關/proc/sys/vm/drop_caches說明 
 

 

 linux內核參數vm.swappiness

設置linux內核參數vm.swappiness的值,以盡大限度的使用物理內存

Swappiness是Linux內核的一個屬性,它定義系統多久使用交換空間一次。
swappiness的值的大小對如何使用swap分區是有着很大的聯系的。
swappiness=0的時候表示最大限度使用物理內存,然后才是 swap空間,
swappiness=100的時候表示積極的使用swap分區,並且把內存上的數據及時的搬運到swap空間里面。linux的基本默認設置為60

官網解釋如下:
https://www.kernel.org/doc/Documentation/sysctl/vm.txt


sysctl命令作用在運行時配置內核參數,sysctl命令是從/proc/sys目錄中讀取信息,
/proc/sys是一個虛擬目錄,其中包含可用於查看和設置當前內核參數的文件對象
sysctl vm.swappinesscat /proc/sys/vm/swappiness將給出相同的輸出

查看參數值
[root@fp-web-112 ~]#cat /proc/sys/vm/swappiness
臨時調整
[root@fp-web-112 ~]# sysctl vm.swappiness=10

[root@fp-web-112 ~]# sysctl -q vm.swappiness   

永久設置vm.swappiness

[root@fp-web-112 ~]# echo "vm.swappiness = 10" >> /etc/sysctl.conf
從配置文件“/etc/sysctl.conf”加載內核參數設置,立即生效
[root@fp-web-112 ~]# sysctl -p

 
手動清理釋放swap分區占用的內存

 swapon -s 查看開啟的swap分區


 

如果出現無法釋放掉swap占用的內存的情況下 可以通過前置關閉該設備解決

[root@localhost felix]# swapoff /dev/dm-1


參考文檔

https://www.kernel.org/doc/Documentation 
https://www.kernel.org/doc/Documentation/sysctl/vm.txt
https://www.kernel.org/doc/Documentation/filesystems/proc.txt

https://man7.org/linux/man-pages/man5/slabinfo.5.html 
https://man7.org/linux/man-pages/man5/proc.5.html   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM