內容主要來源於:linux的內存回收和交換
各項命令查看的linux環境是:Linux SUSE-33 2.6.32.12-0.7-defaul
zone?
內存管理的相關邏輯都是以zone為單位的,這里zone的含義是指內存的分區管理。Linux將內存分成多個區,主要有直接訪問區(DMA)、一般區(Normal)和高端內存區(HighMemory)。內核對內存不同區域的訪問因為硬件結構因素會有尋址和效率上的差別。如果在NUMA架構上,不同CPU所管理的內存也是不同的zone。
/proc/zoneinfo?
查看當前系統的內存水位標記。
weblogic@SUSE-33:/sbin> cat /proc/zoneinfo
Node 0, zone DMA pages free 3929 min 7 low 7 high 10 scanned 0 spanned 4096 present 3832 nr_free_pages 3929 nr_inactive_anon 0 nr_active_anon 0 nr_inactive_file 0 nr_active_file 0 nr_unevictable 0 nr_mlock 0 nr_anon_pages 0 nr_mapped 0 nr_file_pages 0 nr_dirty 0 nr_writeback 0 nr_slab_reclaimable 0 nr_slab_unreclaimable 0 nr_page_table_pages 0 nr_kernel_stack 0 nr_unstable 0 nr_bounce 0 nr_vmscan_write 0 nr_writeback_temp 0 nr_isolated_anon 0 nr_isolated_file 0 nr_shmem 0 numa_hit 1 numa_miss 0 numa_foreign 0 numa_interleave 0 numa_local 1 numa_other 0 protection: (0, 3768, 4016, 4016) pagesets cpu: 0 count: 0 high: 0 batch: 1 vm stats threshold: 4 cpu: 1 count: 0 high: 0 batch: 1 vm stats threshold: 4 all_unreclaimable: 1 prev_priority: 12 start_pfn: 0 inactive_ratio: 1 Node 0, zone DMA32 pages free 16200 min 1898 low 1898 high 2847 scanned 0 spanned 1044480 present 964664 nr_free_pages 16200 nr_inactive_anon 143811 nr_active_anon 698860 nr_inactive_file 18465 nr_active_file 16433 nr_unevictable 0 nr_mlock 0 nr_anon_pages 830848 nr_mapped 2043 nr_file_pages 46721 nr_dirty 13 nr_writeback 0 nr_slab_reclaimable 5649 nr_slab_unreclaimable 3655 nr_page_table_pages 6618 nr_kernel_stack 371 nr_unstable 0 nr_bounce 0 nr_vmscan_write 26548123 nr_writeback_temp 0 nr_isolated_anon 0 nr_isolated_file 0 nr_shmem 18 numa_hit 12025255812 numa_miss 0 numa_foreign 0 numa_interleave 0 numa_local 12025255812 numa_other 0 protection: (0, 0, 248, 248) pagesets cpu: 0 count: 130 high: 186 batch: 31 vm stats threshold: 24 cpu: 1 count: 133 high: 186 batch: 31 vm stats threshold: 24 all_unreclaimable: 0 prev_priority: 12 start_pfn: 4096 inactive_ratio: 5 Node 0, zone Normal pages free 153 min 125 low 125 high 187 scanned 0 spanned 64512 present 54158 nr_free_pages 153 nr_inactive_anon 11135 nr_active_anon 9662 nr_inactive_file 2144 nr_active_file 2137 nr_unevictable 0 nr_mlock 0 nr_anon_pages 18039 nr_mapped 1155 nr_file_pages 7039 nr_dirty 26 nr_writeback 0 nr_slab_reclaimable 690 nr_slab_unreclaimable 21507 nr_page_table_pages 1063 nr_kernel_stack 205 nr_unstable 0 nr_bounce 0 nr_vmscan_write 1879470 nr_writeback_temp 0 nr_isolated_anon 0 nr_isolated_file 0 nr_shmem 1 numa_hit 443690329 numa_miss 0 numa_foreign 0 numa_interleave 8539 numa_local 443690329 numa_other 0 protection: (0, 0, 0, 0) pagesets cpu: 0 count: 89 high: 90 batch: 15 vm stats threshold: 8 cpu: 1 count: 47 high: 90 batch: 15 vm stats threshold: 8 all_unreclaimable: 0 prev_priority: 12 start_pfn: 1048576 inactive_ratio: 1 weblogic@SUSE-33:/sbin>
從上邊可看出有DMA、DMA32、Normal這三個內存區。
swappiness?
/proc/sys/vm/swappiness這個文件,這個文件的值用來定義內核使用swap的積極程度,是個可以用來調整跟swap相關的參數。值越高,內核就會越積極的使用swap,值越低就會降低對swap的使用積極性。這個文件的默認值是60,可以的取值范圍是0-100。
1)swappiness這個參數實際上是指導內核在清空內存的時候,是更傾向於清空file-backed內存還是更傾向於進行匿名頁的交換的。當然,這只是個傾向性,是指在兩個都夠用的情況下,更願意用哪個,如果不夠用了,那么該交換還是要交換。
2)如果swappiness設置為100,那么匿名頁和文件將用同樣的優先級進行回收。很明顯,使用清空文件的方式將有利於減輕內存回收時可能造成的IO壓力。因為如果file-backed中的數據不是臟數據的話,那么可以不用寫回,這樣就沒有IO發生,而一旦進行交換,就一定會造成IO。所以系統默認將swappiness的值設置為60,這樣回收內存時,對file-backed的文件cache內存的清空比例會更大,內核將會更傾向於進行緩存清空而不是交換。
3)如果這個值為0,那么內存在free和file-backed(文件映射頁的大小)使用的頁面總量小於高水位標記(high water mark)之前,不會發生交換。有剩余內存的情況下可能發生交換。
weblogic@SUSE-33:/proc/sys/vm> cat /proc/sys/vm/swappiness
60
min_free_kbytes?
/proc/sys/vm/min_free_kbytes,這個參數本身決定了系統中每個zone的watermark[min]的值大小,然后內核根據min的大小並參考每個zone的內存大小分別算出每個zone的low水位和high水位值。
weblogic@SUSE-33:/proc/sys/vm> cat /proc/sys/vm/min_free_kbytes 8127
zone_reclaim_mode?
zone_reclaim_mode模式是在2.6版本后期開始加入內核的一種模式,可以用來管理當一個內存區域(zone)內部的內存耗盡時,是從其內部進行內存回收還是可以從其他zone進行回收的選項,我們可以通過/proc/sys/vm/zone_reclaim_mode文件對這個參數進行調整。
weblogic@SUSE-33:/proc/sys/vm> cat /proc/sys/vm/zone_reclaim_mode 0
在申請內存時,內核在當前zone內沒有足夠內存可用的情況下,會根據zone_reclaim_mode的設置來決策是從下一個zone找空閑內存還是在zone內部進行回收。這個值為0時表示可以從下一個zone找可用內存,非0表示在本地回收。這個文件可以設置的值及其含義如下:
- echo 0 > /proc/sys/vm/zone_reclaim_mode:意味着關閉zone_reclaim模式,可以從其他zone或NUMA節點回收內存。
- echo 1 > /proc/sys/vm/zone_reclaim_mode:表示打開zone_reclaim模式,這樣內存回收只會發生在本地節點內。
- echo 2 > /proc/sys/vm/zone_reclaim_mode:在本地回收內存時,可以將cache中的臟數據寫回硬盤,以回收內存。
- echo 4 > /proc/sys/vm/zone_reclaim_mode:可以用swap方式回收內存。
不同的參數配置會在NUMA環境中對其他內存節點的內存使用產生不同的影響。默認情況下,zone_reclaim模式是關閉的。這在很多應用場景下可以提高效率,比如文件服務器,或者依賴內存中cache比較多的應用場景。這樣的場景對內存cache速度的依賴要高於進程本身對內存速度的依賴,所以我們寧可讓內存從其他zone申請使用,也不願意清本地cache。
如果確定應用場景是內存需求大於緩存,而且盡量要避免內存訪問跨越NUMA節點造成的性能下降的話,則可以打開zone_reclaim模式。此時頁分配器會優先回收容易回收的可回收內存(主要是當前不用的page cache頁),然后再回收其他內存。
打開本地回收模式的寫回可能會引發其他內存節點上的大量的臟數據寫回處理。如果一個內存zone已經滿了,那么臟數據的寫回也會導致進程處理速度收到影響,產生處理瓶頸。這會降低某個內存節點相關的進程的性能,因為進程不再能夠使用其他節點上的內存。但是會增加節點之間的隔離性,其他節點的相關進程運行將不會因為另一個節點上的內存回收導致性能下降。
min_unmapped_ratio
這個參數只在NUMA架構的內核上生效。這個值表示NUMA上每個內存區域的pages總數的百分比。在zone_reclaim_mode模式下,只有當相關區域的內存使用達到這個百分比,才會發生區域內存回收。在zone_reclaim_mode設置為4的時候,內核會比較所有的file-backed和匿名映射頁,包括swapcache占用的頁以及tmpfs文件的總內存使用是否超過這個百分比。其他設置的情況下,只比較基於一般文件的未映射頁,不考慮其他相關頁。
weblogic@SUSE-33:/proc/sys/vm> cat /proc/sys/vm/min_unmapped_ratio 1
page-cluster
page-cluster是用來控制從swap空間換入數據的時候,一次連續讀取的頁數,這相當於對交換空間的預讀。這里的連續是指在swap空間上的連續,而不是在內存地址上的連續。因為swap空間一般是在硬盤上,對硬盤設備的連續讀取將減少磁頭的尋址,提高讀取效率。這個文件中設置的值是2的指數。就是說,如果設置為0,預讀的swap頁數是2的0次方,等於1頁。如果設置為3,就是2的3次方,等於8頁。同時,設置為0也意味着關閉預讀功能。
文件默認值為3。我們可以根據我們的系統負載狀態來設置預讀的頁數大小。
weblogic@SUSE-33:/proc/sys/vm> cat /proc/sys/vm/page-cluster 3
手工清理緩存
在系統中除了內存將被耗盡的時候可以清緩存以外,還可以使用下面這個文件來人工觸發緩存清除的操作:
weblogic@SUSE-33:/sbin> cat /proc/sys/vm/drop_caches 0
weblogic@SUSE-33:/sbin> echo 1 > /proc/sys/vm/drop_caches
當然,這個文件可以設置的值分別為1、2、3。它們所表示的含義為:
echo 1 > /proc/sys/vm/drop_caches:表示清除page cache。
echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的對象(包括目錄項緩存和inode緩存)。slab分配器是內核中管理內存的一種機制,其中很多緩存數據實現都是用的pagecache。
echo 3 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的緩存對象。