sysrq mm log里Free swap、Total swap是什么含义?
[22634.588075] Free swap = 0kB
[22634.588076] Total swap = 204796kB
get_nr_swap_pages函数返回swap file或者swap device上空闲的“page frame”数目。本质上,swap file或者swap device上的磁盘空间都是给anonymous page做腾挪之用,其实这里的“page frame”不是真的page frame,我们称之swap page好了。get_nr_swap_pages函数返回了free swap page的数目。这里把free swap page的数目也计入free主要是因为可以把使用中的page frame swap out到free swap page上,因此也算是free page,虽然开销大了一点。至于NR_SLAB_RECLAIMABLE,那就更应该计入free page了,因为slab对象都已经标注自己的reclaim的了,当然是free page了。
我们回到total_swap_pages这个变量,它其实就是系统可以将anonymous page交换到磁盘的大小,如果我们建立32MB的swap file或者swap device,那么total_swap_pages就是(32M/page size)。
from: https://blog.csdn.net/jus3ve/article/details/80681655
top cmd里swap部分字段含义
Swap:
192772k total 交换区总量
0k used 使用的交换区总量
192772k free 空闲交换区总量
123988k cached 缓冲的交换区总量,内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入。
获取所有进程使用swap总量script
(此脚本可能还需要调试下才能拿到准确的数据)
#!/vendor/bin/sh # function getswap { SUM=0 OVERALL=0 for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"` ; do PID=`echo $DIR | cut -d / -f 3` PROGNAME=`ps -p $PID -o comm |sed '1 d'` #嵌入式设备上可能不支持--no-header,所以用sed d将ps的header line删除 for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'` do let SUM=$SUM+$SWAP done echo "PID=$PID - Swap used: $SUM - ($PROGNAME )" let OVERALL=$OVERALL+$SUM SUM=0 done echo "Overall swap used: $OVERALL" } getswap
sysrq m输出log里swap相关信息含义
[12480.103831] 0 pages in swap cache //0 page在swap cache [12480.107169] Swap cache stats: add 2918, delete 2918, find 0/161 //add表示到目前为止有往swap cache添加多少个page,每添加n个page,这个计数器增加n //delete与add相反,从swap cache里delete page时,这个计数器将增加n(每delete n个page时) //find后第一个数字表示在swap cache里查找一个swp_entry_t,如果有找到,表示此swp_entry_t对应的page在swap cache里,此数字对应的计数器自增1;如果没有找到,此计数器维持不变。 //find后第二个数字表示在swap cache里查找的总次数,不管有没有找到都会自增1 [ 6888.563623] Free swap = 204796kB //当前swap设备可用来存放swap page的空间大小,在往swap空间存入page后,这个可用大小减小;从这个swap空间取出返回到DRAM上,这个可用空间大小变大。 [ 6888.566960] Total swap = 204796kB //swap空间总大小,即用来存在swap page总的空间大小
查看系统里的swap area:
console:/vendor/bin # cat /proc/swaps Filename Type Size Used Priority /dev/block/zram0 partition 204796 13408 0
如上,此系统里只有一个swap area,大小为200M,此swap空间已经用了~13M
swap area可以有两种类型:swap partition和swap file,区别是swap partition在磁盘上是连续分布的,就像一个「裸」的磁盘设备一样,而swap file的内容则不一定连续分布,更像是基于磁盘设备的一个文件(参考这篇文章,需要注意的是,有时内核中会用"swapfile"这个术语统称这两者)。
sysrq f swapents含义
sysrq f触发oom,将打印各个进程内存使用情况,其中的swapents表示这个进程有多少个page swap out到了swap空间,这个数字也可以通过cat /proc/$pid/status查看VmSwap域得知,这两个size是要相等的,前者是以page为单位,后者以kB为单位,如下以wservicemanager进程为例,swapents为121 page,/proc/pid/status里的为484KB,121*4 = 484:
[27006.386201] Tasks state (memory values in pages):
[27006.390925] [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name
[27006.399642] [ 1636] 0 1636 9844 1154 86016 343 -1000 init
[27006.407837] [ 1637] 0 1637 9716 1029 90112 304 -1000 init
[27006.415991] [ 1638] 0 1638 9716 1287 81920 201 -1000 ueventd
[27006.424444] [ 2366] 1036 2366 36195 2410 94208 241 -1000 logd
[27006.432560] [ 2367] 1000 2367 8891 753 69632 121 -1000 servicemanager
[27006.441627] [ 2368] 1000 2368 9694 1138 77824 121 -1000 hwservicemanage
[27006.450705] [ 2370] 1000 2370 9054 749 69632 141 -1000 vndservicemanag
[27006.459846] [ 2378] 0 2378 33417 1769 122880 189 -1000 Binder:2378_2
[27006.468783] [ 2397] 2000 2397 8374 729 61440 33 -1000 sh
/proc/pid/status
VmRSS: 3012 kB
RssAnon: 324 kB
RssFile: 2572 kB
RssShmem: 116 kB
VmData: 11068 kB
VmStk: 132 kB
VmExe: 16 kB
VmLib: 3164 kB
VmPTE: 68 kB
VmSwap: 484 kB
上述swapents对应get_mm_counter(task->mm, MM_SWAPENTS)