sysrq mm log里Free swap、Total swap是什么含义?

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)

























原文地址:https://www.cnblogs.com/aspirs/p/13977558.html