一、基本概念
(1)物理內存和虛擬內存
物理內存:系統硬件提供的真實物理內存
虛擬內存:利用磁盤空間虛擬出的一塊邏輯內存,用作虛擬內存的磁盤空間被稱為swap,swap類似于windows的虛擬內存。
1、linux的內存管理采取的分頁存取機制,會將內存中不經常使用的數據塊交換到虛擬內存中。linux會不時地進行頁面交換操作,以保持盡可能多的空閑物理內存,即使并沒有什么事需要內存,linux也會交換出暫時不用的內存頁面。
(2)buddy內存分配
linux內核中引入的伙伴系統算法,將空閑頁框分為11個塊鏈表:1、2、4、8、16、32、64、128、256、512、1024個連續的頁框塊,每個頁框為4K。比如,當申請100K的空間時,會先在大于100/4=25的頁框中尋找,釋放后,會將相鄰的頁框合并。但是頻繁的申請和釋放,會導致已分配頁框的內存塊中分散了很多小塊的空閑頁框。
(3)slab內存分配
針對經常分配/釋放的對象,如進程描述符等,在用伙伴系統進行分配釋放時會造成大量的內存碎片,處理速度也慢。而slab是基于對象管理的,每當申請時,就從slab列表中分配一個出去,釋放時,也是釋放到slab表中,而不是返回給伙伴系統,從而避免碎片化(也就是直接在內存中進行)。
查看slab信息的命令是slabtop,其是讀取/proc/slabinfo中的信息
(4)頁存大小
linux支持大頁內存技術hugepage,從而減少TLB miss(Translation lookaside buffer?頁表寄存器緩沖)。一般來講,使用較小的頁存可以減少碎片化,但是會導致進程的頁表過長、降低頁面換進換出的效率。
可以在/proc/meminfo中查看大頁內存相關信息(HugePages*)
也可通過echo 2000 > /proc/sys/vm/nr_hugepages生效。
二、內存查看:
[plain]?view plain?copy
[root@localhost?Desktop]#?free?-m??
total????????used????????free??????shared??buff/cache???available??
Mem:??????????977?????????690?????????71?????????3????????215???????111??
Swap:??????????2047????????150????????1897??
?
(1)?其中含義:
mem:物理內存(第二行顯示)
swap:交換區內存(第三行顯示)
total:總的物理內存大小977,總的交換內存2047
used:已經使用的
free:空閑的
shared:多個進程共享的內存
buff/cache:磁盤緩存的大小
buffer是為了解決寫磁盤的效率
cache是為了解決讀磁盤的效率
available:可用的
關系:total = used + free +Buffers/cached
這里重點描述一下free和available的區別:
free =?當前空閑的物理內存
available = free + Buffers/cached -?不可回收的
參見:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
/proc/meminfo: provide estimated available memory
Many load balancing and workload placing programs check /proc/meminfo to estimate how much free memory is available. They generally do this by adding up "free" and "cached", which was fine ten years ago, but is pretty much guaranteed to be wrong today. It is wrong because Cached includes memory that is not freeable as page cache, for example shared memory segments, tmpfs, and ramfs, and it does not include reclaimable slab memory, which can take up a large fraction of system memory on mostly idle systems with lots of files.
(2)?free命令查詢的結果是/proc/meminfo中的信息,也可以用cat查看具體的meminfo中的內存。
三、內存釋放和擴容:
(1)?內存釋放:
在linux中,buffer和cached主要是用于緩存已打開的文件、目錄信息、inode等,頻繁的文件訪問,會導致cache使用的增加,使用free的大小減少。
命令1:sync,將緩存(即buffer)中的待寫入磁盤的內容立即寫入到磁盤中
命令2:清空/proc/sys/vm/drop_caches中的內容
(詳情參見:https://www.kernel.org/doc/Documentation/sysctl/vm.txt)
cache中文件包括page cache和buffer cache兩種,前者用于文件、inode等操作,后者用于塊設備操作
/proc/sys/vm/下的文件包括虛擬內存的管理,以及臟數據寫入磁盤。
To free pagecache(頁面內存):
[plain]?view plain?copy
echo?1?>?/proc/sys/vm/drop_caches??
To?free?reclaimable?slab?objects?(includes?dentries?and?inodes)(索引節點鏈接):??
echo?2?>?/proc/sys/vm/drop_caches??
To?free?slab?objects?and?pagecache:??
echo?3?>?/proc/sys/vm/drop_caches??
?
不過還是建議使用:
sysctl -w vm.vfs_cache_pressure=200
因為直接使用echo會太暴力。
(2)?內存擴容:
實際上,并不是對物理內存擴容,而是增加swap交換分區,間接的增加內存,因為swap分區會存放內存溢出的、使用頻次較低的數據:
[plain]?view plain?copy
[root@localhost?Desktop]#?free?-m??
total????????used????????free??????shared??buff/cache???available??
Mem:????????????977?????????419??????????62???????????3?????????495?????????390??
Swap:??????????2047?????????160????????1887??
[root@localhost?Desktop]#?dd?if=/dev/zero?of=/home/swap?bs=1024?count=512000????#?創建一個塊??
512000+0?records?in??
512000+0?records?out??
524288000?bytes?(524?MB)?copied,?2.83537?s,?185?MB/s??
[root@localhost?Desktop]#?du?/home/swap?-sh??
500M????/home/swap??
[root@localhost?Desktop]#?mkswap?/home/swap?#?變為swap分區??
Setting?up?swapspace?version?1,?size?=?511996?KiB??
no?label,?UUID=b10175fc-d933-43ee-8979-a1d466fea54f??
[root@localhost?Desktop]#?/sbin/swapon?/home/swap???#?使其生效??
swapon:?/home/swap:?insecure?permissions?0644,?0600?suggested.??
[root@localhost?Desktop]#?free?-m??
total????????used????????free??????shared??buff/cache???available??
Mem:????????????977?????????420??????????71???????????3?????????485?????????389??
Swap:??????????2547?????????160????????2387??
?
很明顯,可以看到swap分區變大了。
?
評論
查看更多