free

free显示系统内存整体使用情况。Linux内核可以将内存作为用于硬盘读取的高速缓存和作为用于硬盘写入的缓冲区。 free命令可以显示空闲内存加减这些cache和buffer。

1free -g
2              total        used        free      shared  buff/cache   available
3Mem:             31          22           1           0           7           7
4Swap:            15           4          10

vmstat

vmstat即虚拟内存统计,使用它可以获取系统虚拟内存信息。

先来看几个例子:

1vmstat
2procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
3 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
4 1  1 3017360 1360500     16 6152036    1    1     9   120    1    4  4  1 94  1  0
  • swpd: 当前交换到磁盘的内存量,单位KB
  • free: 还未被系统或应用程序使用的物理内存总量,单位KB
  • buff: 系统缓冲区大小,单位KB。用来存放等待保存到硬盘的数据的内存大小
  • cache: 系统缓存大小,单位KB。用来保存之前从硬盘读取的数据,后续应用再需要该数据时,可以直接从内存获取数据以提高性能
  • si: 上次采样中从硬盘交换入内存的交换速率,单位KB/s
  • so: 上次采样中从内存交换到硬盘的交换速率,单位KB/s
1vmstat -a
2procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
3 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
4 1  0 3016912 1351096 6952456 22147520    1    1     9   120    1    4  4  1 94  1  0
  • inact: 不活跃的内存大小,即适合交换到硬盘的内存大小,单位KB,
  • act: 被使用的获取的内存大小
  • 活跃内存是指当前被进程使用的内存,不活跃内存是指已经分配但暂时还未使用的内存
  • buff和cache的内存即可以是活跃的,也可以是不活跃的
 1vmstat -s
 2     32531016 K total memory
 3     25015072 K used memory
 4     22148052 K active memory
 5      6956176 K inactive memory
 6      1346884 K free memory
 7           16 K buffer memory
 8      6169044 K swap cache
 9     16383996 K total swap
10      3016724 K used swap
11     13367272 K free swap
12     35973318 non-nice user cpu ticks
13          856 nice user cpu ticks
14      7150678 system cpu ticks
15    940254202 idle cpu ticks
16     13302172 IO-wait cpu ticks
17            0 IRQ cpu ticks
18       230890 softirq cpu ticks
19            0 stolen cpu ticks
20     90115333 pages paged in
21   1195522454 pages paged out
22      1358399 pages swapped in
23      2175658 pages swapped out
24   3364058660 interrupts
25   1803704790 CPU context switches
26   1503886288 boot time
27      2985037 forks
  • pages paged in: 从硬盘读入系统缓冲区的内存大小,单位为页,一般1页为4KB
  • pages paged out: 从系统高速缓存写到硬盘的内存大小,单位为页,一般1页为4KB
  • pages swapped in: 从交换分区读入系统内存的内存大小,单位为页
  • pages swapped out: 从系统内存写到交换区的内存大小,单位为页
  • used swap: 当前使用的交换分区大小
  • free swap: 当前可用的交换分区大小
  • total swap: 系统的交换分区大小

物理内存在寻址时,Linux将其分成内存页。当分配内存时,Linux操作的单位是页,而不是单个字节。对IA32(即Intel Architecture 32bit),页面大小为4KB。 在某些情况下,这样的页面大小会带来很高的跟踪开销,因此内存可以使用更大的块来操作内存,这些块被称为HugePage,容量为2048KB,这就可以降低管理和跟踪的开销,但如果HugePage不能被填满就会浪费内存。 HugePage对管理8GB以上内存更加高效。

 1vmstat -m
 2Cache                       Num  Total   Size  Pages
 3nf_conntrack_ffff880710706180    867    867    320     51
 4nf_conntrack_ffff8805fd6b9380    408    408    320     51
 5nf_conntrack_ffff8807f13e4e00   1887   1887    320     51
 6nf_conntrack_ffff8807f0eaba80    255    255    320     51
 7nf_conntrack_ffff8807f0ea9380   1785   1887    320     51
 8nf_conntrack_ffff880633e12700   2295   2295    320     51
 9nf_conntrack_ffff88003de61380    408    408    320     51
10nf_conntrack_ffff8807f13e1380    408    408    320     51
11nf_conntrack_ffffffff81a9cd80   2275   2805    320     51
12kvm_vcpu                      0      0  16576      1
13kvm_mmu_page_header           0      0    168     48
14xfs_dqtrx                     0      0    528     62
15xfs_dquot                     0      0    472     69
16xfs_ili                  452694 458397    152     53
17xfs_inode                477255 477963   1088     30
18xfs_efd_item               1640   1640    400     40
19......
  • vmstat -m输出Linux内核分片信息,该信息展现了内核内存是符合分配的,可以帮助确认那部分内核消耗内存最多

top

top命令运行时可以使用一些选项进行切换。

输入切换项m会将内存使用信息显示出来

1top - 08:11:45 up 33 days, 20:30,  1 user,  load
2Tasks: 184 total,   1 running, 183 sleeping,   0
3%Cpu(s):  0.5 us,  0.0 sy,  0.0 ni, 99.5 id,  0.
4KiB Mem : 21.0/15474852 [|||||||||||            ]
5KiB Swap:  0.0/4194300  [

输入切换项M,将按内存使用量排序,实际分配给进程的内存可能大于其使用量,该选项实际是按进程驻留集大小排序,驻留集即进程的实际使用量,而不是其请求量。

1  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
2  522 root      20   0   83028  34248  33916 S   0.0  0.2   0:47.11 systemd-journal
3  937 root      20   0  303776  21548  18704 S   0.0  0.1   0:18.68 rsyslogd
423217 65534     20   0  161224  20228  12884 S   0.0  0.1   0:24.99 php-fpm7
514762 65534     20   0  158944  18388  13380 S   0.0  0.1   2:46.82 php-fpm7
612154 65534     20   0  160976  16892   9852 S   0.0  0.1   0:04.86 php-fpm7
  • VIRT: 进程虚拟内存的使用量。其中包含已经分配给应用程序但还未使用的全部内存
  • RES: 进程实际使用的物理内存总量
  • %MEM: 进程使用内存量占系统物理内存的百分比
  • SHR: 可以和其他进程共享的内存大小(单位KB)

procinfo

procinfo是一个低开销的命令,适合长时间在控制台运行,procinfo从/proc文件系统显示系统的一些整体信息。

1procinfo -n 1 -D
2Memory:        Total        Used        Free     Buffers
3RAM:        32531016    31682756      848260          16
4Swap:       16383996     4351072    12032924
5......
  • Total: 内存总量
  • Used: 使用的物理内存总量
  • Free: 未使用的物理内存总量
  • Buffer: 用于磁盘写缓冲区的物理内存总量