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