-V表示打印出版本信息; -n表示在周期性循环输出时,输出的头部信息仅显示一次; delay是两次输出之间的延迟时间; count是指按照这个时间间隔统计的次数。
MemTotal
MemFree
MemAvailable
内存黑洞
# grep vmalloc /proc/vmallocinfo
.
.
.
0xffffc90004702000
-
0xffffc9000470b000
36864
alloc_large_system_hash
+
0x171
/
0x239
pages
=
8
vmalloc
N0
=
8
0xffffc9000470b000
-
0xffffc90004710000
20480
agp_add_bridge
+
0x2aa
/
0x440
pages
=
4
vmalloc
N0
=
4
0xffffc90004710000
-
0xffffc90004731000
135168
raw_init
+
0x41
/
0x141
pages
=
32
vmalloc
N0
=
32
0xffffc90004736000
-
0xffffc9000473f000
36864
drm_ht_create
+
0x55
/
0x80
[
drm
]
pages
=
8
vmalloc
N0
=
8
0xffffc90004744000
-
0xffffc90004746000
8192
dm_table_create
+
0x9e
/
0x130
[
dm_mod
]
pages
=
1
vmalloc
N0
=
1
0xffffc90004746000
-
0xffffc90004748000
8192
dm_table_create
+
0x9e
/
0x130
[
dm_mod
]
pages
=
1
vmalloc
N0
=
1
.
.
.
|
# grep vmalloc /proc/vmallocinfo | awk '{total+=$2}; END {print total}'
23375872
|
# lsmod | less
Module
Size
Used
by
rpcsec_gss
_krb5
31477
0
auth
_rpcgss
59343
1
rpcsec_gss_krb5
nfsv4
474429
0
dns
_resolver
13140
1
nfsv4
nfs
246411
1
nfsv4
lockd
93977
1
nfs
sunrpc
295293
5
nfs
,
rpcsec_gss_krb5
,
auth_rpcgss
,
lockd
,
nfsv4
fscache
57813
2
nfs
,
nfsv4
.
.
.
|
// kernel/module.c
static
int
m_show
(
struct
seq_file
*
m
,
void
*
p
)
{
.
.
.
seq_printf
(
m
,
"%s %u"
,
mod
->
name
,
mod
->
init_size
+
mod
->
core_size
)
;
.
.
.
}
|
// kernel/module.c
static
int
move_module
(
struct
module
*
mod
,
struct
load_info
*
info
)
{
.
.
.
ptr
=
module_alloc_update_bounds
(
mod
->
core_size
)
;
.
.
.
if
(
mod
->
init_size
)
{
ptr
=
module_alloc_update_bounds
(
mod
->
init_size
)
;
.
.
.
}
// 注:module_alloc_update_bounds()最终会调用vmalloc_exec()
|
# 先卸载floppy模块
$
modprobe
-
r
floppy
# 确认floppy模块已经不在了
$
lsmod
|
grep
floppy
# 记录vmallocinfo以供随后比较
$
cat
/
proc
/
vmallocinfo
>
vmallocinfo
.
1
# 加载floppy模块
$
modprobe
-
a
floppy
# 注意floppy模块的大小是69417字节:
$
lsmod
|
grep
floppy
floppy
69417
0
$
cat
/
proc
/
vmallocinfo
>
vmallocinfo
.
2
# 然而,我们看到vmallocinfo中记录的是分配了73728字节:
$
diff
vmallocinfo
.
1
vmallocinfo
.
2
68a69
>
0xffffffffa03d7000
-
0xffffffffa03e9000
73728
module_alloc_update_bounds
+
0x14
/
0x70
pages
=
17
vmalloc
N0
=
17
# 为什么lsmod看到的内存大小与vmallocinfo不同呢?
# 因为给kernel module分配内存是以page为单位的,而且外加一个guard page
# 我们来验证一下:
$
bc
-
q
69417
%
4096
3881
<
--
-
不能被
4096整除
69417
/
4096
16
<
--
-
相当于
16
pages,加上面的
3881字节,会分配
17
pages
18
*
4096
<
--
-
17
pages
加上
1个
guard
page
73728
<
--
-
正好是
vmallocinfo记录的大小
|
MemFree
:
570736
kB
.
.
.
HugePages_Total
:
0
HugePages_Free
:
0
HugePages_Rsvd
:
0
HugePages_Surp
:
0
Hugepagesize
:
2048
kB
|
# echo 128 > /proc/sys/vm/nr_hugepages
# cat /proc/meminfo
.
.
.
MemFree
:
308592
kB
.
.
.
HugePages_Total
:
128
HugePages_Free
:
128
HugePages_Rsvd
:
0
HugePages_Surp
:
0
Hugepagesize
:
2048
kB
|
HugePages_Total
:
128
HugePages_Free
:
128
HugePages_Rsvd
:
128
HugePages_Surp
:
0
Hugepagesize
:
2048
kB
|
HugePages_Total
:
128
HugePages_Free
:
0
HugePages_Rsvd
:
0
HugePages_Surp
:
0
Hugepagesize
:
2048
kB
|
.
.
.
2aaaaac00000
-
2aaabac00000
rw
-
p
00000000
00
:
0c
311151
/
anon_hugepage
(
deleted
)
Size
:
262144
kB
Rss
:
0
kB
Pss
:
0
kB
Shared_Clean
:
0
kB
Shared_Dirty
:
0
kB
Private_Clean
:
0
kB
Private_Dirty
:
0
kB
Referenced
:
0
kB
Anonymous
:
0
kB
AnonHugePages
:
0
kB
Swap
:
0
kB
KernelPageSize
:
2048
kB
MMUPageSize
:
2048
kB
Locked
:
0
kB
VmFlags
:
rd
wr
mr
mw
me
de
ht
.
.
.
|
7efcf0000000
-
7efd30000000
rw
-
p
00000000
00
:
00
0
Size
:
1048576
kB
Rss
:
313344
kB
Pss
:
313344
kB
Shared_Clean
:
0
kB
Shared_Dirty
:
0
kB
Private_Clean
:
0
kB
Private_Dirty
:
313344
kB
Referenced
:
239616
kB
Anonymous
:
313344
kB
AnonHugePages
:
313344
kB
Swap
:
0
kB
KernelPageSize
:
4
kB
MMUPageSize
:
4
kB
Locked
:
0
kB
VmFlags
:
rd
wr
mr
mw
me
dc
ac
hg
mg
|
# grep AnonHugePages /proc/[1-9]*/smaps | awk '{total+=$2}; END {print total}'
782336
# grep AnonHugePages /proc/meminfo
AnonHugePages
:
782336
kB
|
fs
/
proc
/
meminfo
.
c
:
static
int
meminfo_proc_show
(
struct
seq_file *
m
,
void
*
v
)
{
.
.
.
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
K
(
global_page_state
(
NR_ANON_PAGES
)
+
global_page_state
(
NR_ANON_TRANSPARENT_HUGEPAGES
)
*
HPAGE_PMD_NR
)
,
.
.
.
|
fs
/
proc
/
meminfo
.
c
:
static
int
meminfo_proc_show
(
struct
seq_file *
m
,
void
*
v
)
{
.
.
.
cached
=
global_page_state
(
NR_FILE_PAGES
)
-
total_swapcache_pages
(
)
-
i
.
bufferram
;
.
.
.
}
|
DirectMap
Dirty pages到底有多少?
为什么【Active(anon)+Inactive(anon)】不等于AnonPages?
为什么【Active(file)+Inactive(file)】不等于Mapped?
为什么【Active(file)+Inactive(file)】不等于 Cached?
kernel内存的统计方式应该比较明确,即
# grep vmalloc /proc/vmallocinfo | awk '{total+=$2}; END {print total}'
23375872
|
用户进程的内存主要有三种统计口径:
所以系统内存的使用情况可以用以下公式表示: