-
内存页面
操作系统和cpu使用的内存单位。一般是4k或8k。 -
常驻内存
当前处于主存中的内存。 -
虚拟内存
一个抽象的主存概念,几乎是无限和非竞争的。它向每个进程和内核提供巨大的,线性的,私有的地址空间。 -
交换与换页的区别
换页是将页面换入和调出主存,在linux系统中,交换和换页的意义一样。 -
按需换页的用途
将虚拟内存按需映射到物理内存,cpu创建映射的开销推迟到实际需要或访问时。 -
内存的使用率和饱和度
使用率由已用的内存除以总内存得出。对内存的需求超过了主存的情况称为主存饱和。 -
mmu和tlb的用途
mmu内存管理单元,负责虚拟到物理地址的转换。按页做转换,对于页内的偏移量则直接映射。
tlb是translation lookaside buffer的简称,地址转换后援缓冲器,也可简称为“快表”。存储了当前最可能被访问到的页表项,只有在tlb无法完成地址翻译任务时,才会到内存中查询页表,这样就减少了页表查询导致的处理器性能下降。 -
页面换出守护进程的作用
当内存不足时检查哪些页面可以交换以释放内存。 -
oom终结者的作用
搜索并杀死可牺牲的进程以释放内存。 -
什么是匿名换页,为什么比分析文件系统换页更重要?
文件系统换页由读写位于内存中的映射文件页引发。文件系统换页,如果在主存修改过,要求将该页写回磁盘,如果没有修改,页面换出操作仅仅释放内存没有磁盘io操作。所以文件系统换页不一定会产生io阻塞。
匿名换页涉及进程的私有数据,包括进程堆和栈。匿名换页将进程的堆和栈数据交换到磁盘,会产生磁盘io阻塞。匿名换页后对进程的后续操作影响比较大。 -
内存即将耗尽时内核释放内存采取的步骤
1.页缓存(文件系统缓存)或交换(换页)
linux系统提供一个调节方法,交换倾向,一个0-100范围的参数(默认值为60),较高的值倾向用换页释放内存,较低的值倾向回收页缓存。
2.回收
内存低于某个阈值
3.oom终结者
内存耗尽
一般检查
- 物理内存和虚拟内存使用率
- 饱和度:换页、交换、oom终结者
- 内核和文件系统缓存使用情况
- 每个进程的物理和虚拟内存使用情况
- 是否存在内存资源控制
高级特征检查
- 内核内存用在何处?每个slab呢?
- 文件系统缓存(或页缓存)中不活跃与活跃的比例是多少?
- 进程内存用在何处?
- 进程如何分配内存(调用路径)?
- 内核如何分配内存(调用路径)?
- 哪些进程被持续地页面换出?
- 哪些进程曾经被页面换出?
- 进程或内核是否有内存泄漏?
- numa内存是否被分配到合适的节点中?
- cpi和内存停滞周期频率是多少?
- 内存总线的平衡性?
- 相对于远程内存io,执行了多少本地内存io?
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 325752 20 13789256 0 0 0 12 0 1 2 1 97 0 0
0 0 0 325736 20 13789256 0 0 0 120 6261 11181 2 2 96 0 0
3 0 0 323408 20 13789260 0 0 0 0 5339 9552 1 2 97 0 0
0 0 0 327524 20 13789264 0 0 0 174 9606 15230 6 4 90 0 0
默认单位为kb
swpd:交换出的内存;
free:空闲的内存;
buff:用于缓冲缓存的内存;
cache:用于页缓存的内存;
si:换入的内存(换页);
so:换出的内存(换页)。
如果si、so一直为非0,表示系统存在内存压力并换页到交换设备或文件。
$ vmstat 1 -sm
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 334 0 14120 0 0 0 12 0 1 2 1 97 0 0
0 0 0 334 0 14120 0 0 0 44 5077 9018 3 1 95 0 0
0 0 0 333 0 14120 0 0 0 76 5307 9382 2 2 97 0 0
0 0 0 334 0 14120 0 0 0 72 4645 8354 1 1 98 0 0
更改单位为mb,数据显得对齐。
$ vmstat -a 1 -sm
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free inact active si so bi bo in cs us sy id wa st
1 0 0 321 6426 7771 0 0 0 12 0 1 2 1 97 0 0
0 0 0 335 6426 7757 0 0 0 102 5537 9379 1 2 97 0 0
0 0 0 335 6426 7757 0 0 0 258 8207 13917 7 3 90 0 0
-a,显示非活动和活动页缓存明细。
报告历史统计数据
-b换页统计信息
$ sar -b
linux 3.10.0-957.1.3.el7.x86_64 (k8snode-4) 02/20/2019 _x86_64_ (8 cpu)
12:00:01 am pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
12:10:01 am 0.00 85.76 3930.63 0.00 1984.07 0.00 0.00 0.00 0.00
12:20:02 am 0.00 88.14 3910.43 0.00 1950.23 0.00 0.00 0.00 0.00
12:30:01 am 0.00 90.88 4315.21 0.00 2147.01 32.59 0.00 32.10 98.50
12:40:01 am 0.00 98.42 4087.32 0.00 2066.15 0.00 0.00 0.00 0.00
12:50:01 am 0.00 89.81 4150.86 0.00 2197.82 9.17 0.00 9.16 99.96
.........
average: 0.42 88.77 3949.02 0.00 1980.47 0.77 0.00 0.76 98.83
pgpgin/s:页面换入,单位千字节/秒;
pgpgout/s:页面换出,单位千字节/秒;
fault/s:严重及轻微缺页,单位次数/秒;
majflt/s:严重缺页,单位次数/秒;
pgfree/s:页面加入空闲链表,单位次数/秒;
pgscank/s:被后台页面换出守护进程扫描过的页面(kswapd),单位次数/秒;
pgscand/s:直接扫描页面,单位次数/秒;
pgsteal/s:页面及交换高速缓存回收,单位次数/秒;
%vmeff:页面窃取/页面扫描比率,显示页面回收的效率。高数值表示成功从非活动列表中回收了页,低数值表示系统在挣扎中。
-h大页面统计信息
$ sar -h
linux 3.10.0-957.1.3.el7.x86_64 (k8snode-4) 02/20/2019 _x86_64_ (8 cpu)
12:00:01 am kbhugfree kbhugused %hugused
12:10:01 am 0 0 0.00
12:20:02 am 0 0 0.00
12:30:01 am 0 0 0.00
12:40:01 am 0 0 0.00
12:50:01 am 0 0 0.00
kbhugfree:空闲巨型页面存储器(大页面尺寸) ,单位千字节;
kbhugused:占用的巨型页面存储器,单位千字节;
-r内存使用率
$ sar -r
linux 3.10.0-957.1.3.el7.x86_64 (k8snode-4) 02/20/2019 _x86_64_ (8 cpu)
12:00:01 am kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
12:10:01 am 338640 16092368 97.94 20 12112008 6298656 38.33 7508492 6333340 48
12:20:02 am 303028 16127980 98.16 20 12115128 6284316 38.25 7543500 6333852 72
12:30:01 am 189504 16241504 98.85 20 12041248 6731932 40.97 7691620 6290424 80
12:40:01 am 169348 16261660 98.97 20 12044336 6731912 40.97 7713344 6290908 40
12:50:01 am 426236 16004772 97.41 20 12018764 6284044 38.25 7488324 6271412 36
kbmemfree:空闲存储器,单位千字节;
kbmemused:占用存储器(不包括内核),单位千字节;
kbbuffers:缓冲高速缓存尺寸,单位千字节;
kbcached:页面高速缓存尺寸,单位千字节;
kbcommit:提交的主存储器,服务当前工作负载需要量的估计,单位千字节;
%commit:为当前工作负载提交的主存储器,估计值;
kbactive:活动列表储存器尺寸,单位千字节;
kbinact:非活动列表储存器尺寸,单位千字节;
-r内存统计信息
$ sar -r
linux 3.10.0-957.1.3.el7.x86_64 (k8snode-4) 02/20/2019 _x86_64_ (8 cpu)
12:00:01 am frmpg/s bufpg/s campg/s
12:10:01 am 7.37 0.00 1.29
12:20:02 am -14.84 0.00 1.30
12:30:01 am -47.37 0.00 -30.83
12:40:01 am -8.40 0.00 1.29
12:50:01 am 107.02 0.00 -10.65
bufpg/s:缓冲高速缓存增加值(增长),单位页面/秒;
campg/s:页面高速缓存增加值(增长),单位页面/秒;
-s交换空间统计信息
$ sar -s
linux 3.10.0-957.1.3.el7.x86_64 (k8snode-4) 02/20/2019 _x86_64_ (8 cpu)
12:00:01 am kbswpfree kbswpused %swpused kbswpcad %swpcad
12:10:01 am 0 0 0.00 0 0.00
12:20:02 am 0 0 0.00 0 0.00
12:30:01 am 0 0 0.00 0 0.00
12:40:01 am 0 0 0.00 0 0.00
12:50:01 am 0 0 0.00 0 0.00
01:00:01 am 0 0 0.00 0 0.00
kbswpfree:释放交换空间,单位千字节;
kbswpused:占用交换空间,单位千字节;
kbswpcad:高速缓存的交换空间:它同时保存在主储存器和交换设备中,因此不需要磁盘io就能被页面换出,单位千字节;
-w交换统计信息
$ sar -w
linux 3.10.0-957.1.3.el7.x86_64 (k8snode-4) 02/20/2019 _x86_64_ (8 cpu)
12:00:01 am pswpin/s pswpout/s
12:10:01 am 0.00 0.00
12:20:02 am 0.00 0.00
12:30:01 am 0.00 0.00
pswpin/s:页面换入,单位页面/秒;
pswpout/s:页面换出,单位页面/秒;
内核slab缓存使用统计,类似top,需要root用户才能使用
# slabtop -sc
active / total objects (% used) : 813271 / 875117 (92.9%)
active / total slabs (% used) : 12335 / 12335 (100.0%)
active / total caches (% used) : 71 / 98 (72.4%)
active / total size (% used) : 113120.00k / 126549.70k (89.4%)
minimum / average / maximum object : 0.01k / 0.14k / 8.00k
objs active use obj size slabs obj/slab cache size name
17550 17535 99% 1.06k 585 30 18720k xfs_inode
7952 7665 96% 2.00k 497 16 15904k kmalloc-2048
19085 16713 87% 0.58k 347 55 11104k inode_cache
14504 11330 78% 0.57k 259 56 8288k radix_tree_node
71916 60172 83% 0.10k 1844 39 7376k buffer_head
13184 10651 80% 0.50k 206 64 6592k kmalloc-512
34566 34566 100% 0.19k 823 42 6584k dentry
86208 77393 89% 0.06k 1347 64 5388k kmalloc-64
17472 12972 74% 0.25k 273 64 4368k kmalloc-256
objs:对象数量;
active :活动数量;
use:使用百分比;
obj size:对象大小;
cache size :缓存大小。
-sc按缓存大小排列
$ ps aux
user pid %cpu %mem vsz rss tty stat start time command
root 1 0.0 0.0 194500 7456 ? ss jan22 3:50 /usr/lib/systemd/systemd --system --deserialize 17
root 2 0.0 0.0 0 0 ? s jan22 0:01 [kthreadd]
root 3 0.0 0.0 0 0 ? s jan22 0:27 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? s< jan22 0:00 [kworker/0:0h]
root 7 0.0 0.0 0 0 ? s jan22 0:30 [migration/0]
%mem :主存使用(物理内存、rss)占总内存的百分比;
vsz :虚拟内存大小(kb);
rss:常驻集合大小(kb);
$ top
top - 10:27:09 up 28 days, 16:45, 1 user, load average: 0.25, 0.47, 0.60
tasks: 306 total, 2 running, 304 sleeping, 0 stopped, 0 zombie
%cpu(s): 2.3 us, 2.5 sy, 0.0 ni, 93.8 id, 1.3 wa, 0.0 hi, 0.1 si, 0.0 st
kib mem : 16431008 total, 236088 free, 2360464 used, 13834456 buff/cache
kib swap: 0 total, 0 free, 0 used. 12730344 avail mem
pid user pr ni virt res shr s %cpu %mem time command
9735 root 20 0 1745260 191220 42240 s 9.9 1.2 325:55.35 kubelet
8607 root 20 0 868816 658428 38560 s 7.3 4.0 304:17.26 kube-apiserver
4439 root 20 0 10.1g 125368 23352 s 3.3 0.8 103:16.56 etcd
32733 root 20 0 1246248 89860 25232 s 2.3 0.5 78:55.41 dockerd
11715 root 20 0 49748 22488 13432 s 2.0 0.1 50:20.19 calico-node
mem :主存;
swap:虚拟内存;
buff:缓冲缓存;
cache:页缓存;
dtrace能跟踪用户和内核级的内存分配、轻微和严重缺页以及页面换出守护进程的运行。
systemtap适用于linux系统的动态跟踪文件系统事件。
- free报告空闲内存,包括缓冲区高速缓存和页缓存;
- dmesg检查oom