菜鸟笔记
提升您的技术认知

linux系统内存分析-ag真人游戏

  • 内存页面
    操作系统和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
网站地图