min_free_kbytes
內存域水印值:min_free_kbytes
當不設置的時候:sqrt(16M)=4k 4k*4 = 16k
設置內存水印值的函數是:
6792 /* 6793 * Initialise min_free_kbytes. 6794 * 6795 * For small machines we want it small (128k min). For large machinemis 6796 * we want it large (64MB max). But it is not linear, because network 6797 * bandwidth does not increase linearly with machine size. We use 6798 * 6799 * min_free_kbytes = 4 * sqrt(lowmem_kbytes), for better accuracy: 6800 * min_free_kbytes = sqrt(lowmem_kbytes * 16) 6801 * 6802 * which yields 6803 * 6804 * 16MB: 512k 6805 * 32MB: 724k 6806 * 64MB: 1024k 6807 * 128MB: 1448k 6808 * 256MB: 2048k 6809 * 512MB: 2896k 6810 * 1024MB: 4096k 6811 * 2048MB: 5792k 6812 * 4096MB: 8192k 6813 * 8192MB: 11584k 6814 * 16384MB: 16384k 6815 */ 6
__setup_per_zone_wmarks 中會設置每個內存zone中的min/low/high水印
內存域的這些值都是怎么玩的?
突然間發現了一個函數,可以看到每個內存域的各種內存的信息:show_free_areas竟然是printk,只有在內存很低的時候才打印!
min: 在vmscan時會用到:pfmemalloc_watermark_ok , __zone_watermark_ok這里會判斷是不是超過了內存的水位。
./include/linux/mmzone.h:258:#define min_wmark_pages(z) (z->watermark[WMARK_MIN])
low:
high
