一、基本概念
(1)物理內(nèi)存和虛擬內(nèi)存
物理內(nèi)存:系統(tǒng)硬件提供的真實(shí)物理內(nèi)存
虛擬內(nèi)存:利用磁盤空間虛擬出的一塊邏輯內(nèi)存,用作虛擬內(nèi)存的磁盤空間被稱為swap,swap類似于windows的虛擬內(nèi)存。
1、linux的內(nèi)存管理采取的分頁(yè)存取機(jī)制,會(huì)將內(nèi)存中不經(jīng)常使用的數(shù)據(jù)塊交換到虛擬內(nèi)存中。linux會(huì)不時(shí)地進(jìn)行頁(yè)面交換操作,以保持盡可能多的空閑物理內(nèi)存,即使并沒有什么事需要內(nèi)存,linux也會(huì)交換出暫時(shí)不用的內(nèi)存頁(yè)面。
(2)buddy內(nèi)存分配
linux內(nèi)核中引入的伙伴系統(tǒng)算法,將空閑頁(yè)框分為11個(gè)塊鏈表:1、2、4、8、16、32、64、128、256、512、1024個(gè)連續(xù)的頁(yè)框塊,每個(gè)頁(yè)框?yàn)?K。比如,當(dāng)申請(qǐng)100K的空間時(shí),會(huì)先在大于100/4=25的頁(yè)框中尋找,釋放后,會(huì)將相鄰的頁(yè)框合并。但是頻繁的申請(qǐng)和釋放,會(huì)導(dǎo)致已分配頁(yè)框的內(nèi)存塊中分散了很多小塊的空閑頁(yè)框。
(3)slab內(nèi)存分配
針對(duì)經(jīng)常分配/釋放的對(duì)象,如進(jìn)程描述符等,在用伙伴系統(tǒng)進(jìn)行分配釋放時(shí)會(huì)造成大量的內(nèi)存碎片,處理速度也慢。而slab是基于對(duì)象管理的,每當(dāng)申請(qǐng)時(shí),就從slab列表中分配一個(gè)出去,釋放時(shí),也是釋放到slab表中,而不是返回給伙伴系統(tǒng),從而避免碎片化(也就是直接在內(nèi)存中進(jìn)行)。
查看slab信息的命令是slabtop,其是讀取/proc/slabinfo中的信息
(4)頁(yè)存大小
linux支持大頁(yè)內(nèi)存技術(shù)hugepage,從而減少TLB miss(Translation lookaside buffer?頁(yè)表寄存器緩沖)。一般來講,使用較小的頁(yè)存可以減少碎片化,但是會(huì)導(dǎo)致進(jìn)程的頁(yè)表過長(zhǎng)、降低頁(yè)面換進(jìn)換出的效率。
可以在/proc/meminfo中查看大頁(yè)內(nèi)存相關(guān)信息(HugePages*)
也可通過echo 2000 > /proc/sys/vm/nr_hugepages生效。
二、內(nèi)存查看:
[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:物理內(nèi)存(第二行顯示)
swap:交換區(qū)內(nèi)存(第三行顯示)
total:總的物理內(nèi)存大小977,總的交換內(nèi)存2047
used:已經(jīng)使用的
free:空閑的
shared:多個(gè)進(jìn)程共享的內(nèi)存
buff/cache:磁盤緩存的大小
buffer是為了解決寫磁盤的效率
cache是為了解決讀磁盤的效率
available:可用的
關(guān)系:total = used + free +Buffers/cached
這里重點(diǎn)描述一下free和available的區(qū)別:
free =?當(dāng)前空閑的物理內(nèi)存
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命令查詢的結(jié)果是/proc/meminfo中的信息,也可以用cat查看具體的meminfo中的內(nèi)存。
三、內(nèi)存釋放和擴(kuò)容:
(1)?內(nèi)存釋放:
在linux中,buffer和cached主要是用于緩存已打開的文件、目錄信息、inode等,頻繁的文件訪問,會(huì)導(dǎo)致cache使用的增加,使用free的大小減少。
命令1:sync,將緩存(即buffer)中的待寫入磁盤的內(nèi)容立即寫入到磁盤中
命令2:清空/proc/sys/vm/drop_caches中的內(nèi)容
(詳情參見:https://www.kernel.org/doc/Documentation/sysctl/vm.txt)
cache中文件包括page cache和buffer cache兩種,前者用于文件、inode等操作,后者用于塊設(shè)備操作
/proc/sys/vm/下的文件包括虛擬內(nèi)存的管理,以及臟數(shù)據(jù)寫入磁盤。
To free pagecache(頁(yè)面內(nèi)存):
[plain]?view plain?copy
echo?1?>?/proc/sys/vm/drop_caches??
To?free?reclaimable?slab?objects?(includes?dentries?and?inodes)(索引節(jié)點(diǎn)鏈接):??
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
因?yàn)橹苯邮褂胑cho會(huì)太暴力。
(2)?內(nèi)存擴(kuò)容:
實(shí)際上,并不是對(duì)物理內(nèi)存擴(kuò)容,而是增加swap交換分區(qū),間接的增加內(nèi)存,因?yàn)閟wap分區(qū)會(huì)存放內(nèi)存溢出的、使用頻次較低的數(shù)據(jù):
[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????#?創(chuàng)建一個(gè)塊??
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?#?變?yōu)閟wap分區(qū)??
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分區(qū)變大了。
?
評(píng)論
查看更多