当涉及到Linux系统性能优化的时候,物理内存是一个最重要的因素。自然的,Linux提供了丰富的选择来监测珍贵的内存资源的使用情况。不同的工具,在监测粒度(例如:全系统范围,每个进程,每个用户),接口方式(例如:图形用户界面,命令行,ncurses)或者运行模式(交互模式,批量处理模式)上都不尽相同。

1、meminfo

        一种最简单的方法是通过“/proc/meminfo”来检查内存使用状况。

        这个动态更新的虚拟文件事实上是诸如free,top和ps这些与内存相关的工具的信息来源。从可用/闲置物理内存数量到等待被写入缓存的数量或者已写回磁盘的数量,只要是你想要的关于内存使用的信息,“/proc/meminfo”应有尽有。特定进程的内存信息也可以通过“/proc/statm”和“/proc/status”来获取。

[root@devvm ~]# cat /proc/meminfo
MemTotal:        7990068 kB      // 总内存
MemFree:         7436764 kB      // 空闲内存(MemTotal - MemFree:就是已被用掉的内存)
MemAvailable:    7361412 kB      // 可用内存(MemFree + 可回收的内存),系统中有些内存虽然已被使用但是可以回收,比如cache、buffer、slab都有一部分可以回收。
Buffers:            2076 kB      // 给文件的缓冲大小
Cached:           108916 kB      // 高速缓冲存储器
SwapCached:            0 kB      // 被高速缓冲存储用的交换空间的大小
Active:           101260 kB      // 活跃使用中的高速缓冲存储器页面文件的大小
Inactive:          79568 kB      // 不经常使用中的高速缓冲存储器页面文件的大小
Active(anon):      70532 kB      // 活跃的匿名内存(进程中堆上分配的内存,用malloc分配的内存)
Inactive(anon):    11232 kB      // 不活跃的匿名内存
Active(file):      30728 kB      // 活跃的file内存
Inactive(file):    68336 kB      // 不活跃的file内存
Unevictable:           0 kB      // 不能被释放的内存页
Mlocked:               0 kB      // mlock系统调用锁定的内存大小



SwapTotal:       3145724 kB      // 交换空间总大小
SwapFree:        3145724 kB      // 空闲交换空间
Dirty:                 4 kB      // 等待被写回到磁盘的大小
Writeback:             0 kB      // 正在被写回的大小
AnonPages:         69880 kB      // 未映射页的大小
Mapped:            26708 kB      // 设备和文件映射的大小
Shmem:             11928 kB      // 已经被分配的共享内存大小
Slab:              74944 kB      // 内核数据结构缓存大小
SReclaimable:      23992 kB      // 可收回slab的大小
SUnreclaim:        50952 kB      // 不可收回slab的大小
KernelStack:        4720 kB      // kernel消耗的内存
PageTables:         4204 kB      // 管理内存分页的索引表的大小
NFS_Unstable:          0 kB      // 不稳定页表的大小
Bounce:                0 kB      // 
WritebackTmp:          0 kB      // USE用于临时写回缓冲区的内存
CommitLimit:     7140756 kB      // 系统实际可分配内存总量
Committed_AS:     292612 kB      // 当前已分配的内存总量
VmallocTotal:   34359738367 kB   // 虚拟内存大小
VmallocUsed:      193656 kB      // 已经被使用的虚拟内存大小
VmallocChunk:   34359310332 kB   // malloc可分配的最大的逻辑连续的内存大小
Percpu:            33280 kB      
HardwareCorrupted:     0 kB      
AnonHugePages:      8192 kB
CmaTotal:              0 kB      // 总的连续可用内存
CmaFree:               0 kB      // 空闲的连续内存
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      149312 kB
DirectMap2M:     4044800 kB
DirectMap1G:     6291456 kB

2、free

        free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。

[root@devvm ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           7802         409        7261          11         131        7188
Swap:          3071           0        3071
[root@devvm ~]#

可用内存=free +buffers +cached

3. vmstat

        vmstat指令用来显示虚拟内存使用状态,同时也可以显示进程、cpu活动情况。vmstat报告有关进程、内存、分页、块IO、陷阱和CPU活动的信息。生成的第一份报告给出了自上次重新启动以来的平均值。其他报告提供了长度延迟取样周期的信息。在这两种情况下,进程和内存报告都是瞬时的。

[root@devvm ~]# vmstat 2 4
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 7436244   2076 132984    0    0    13     1   24   28  0  0 100  0  0
 0  0      0 7436244   2076 132984    0    0     0     0   61   90  0  0 100  0  0
 0  0      0 7436244   2076 132984    0    0     0     1   49   79  0  0 100  0  0
 0  0      0 7436244   2076 132984    0    0     0     0   59   95  0  0 100  0  0
[root@devvm ~]#

memory 内存有关的参数:

        swpd:使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。

        free:空闲物理内存大小。

        buff:用作缓冲的内存大小。

        cache:用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。

swap 交换区

        si:每秒从交换区写到内存的大小,由磁盘调入内存。

        so:每秒写入交换区的内存大小,由内存调入磁盘。

        注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。不能光看空闲内存(free)很少或接近于0时,就认为内存不够用了,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。因为Linux总是先把内存用光。

4.top

        top 命令查看系统的实时负载, 包括进程、CPU负载、内存使用等等。

        直接输入top命令

top - 22:19:23 up 29 min,  1 user,  load average: 0.00, 0.01, 0.05
Tasks: 142 total,   1 running, 141 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  7990068 total,  7435352 free,   419336 used,   135380 buff/cache
KiB Swap:  3145724 total,  3145724 free,        0 used.  7360200 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                
    40 root      20   0       0      0      0 S   0.3  0.0   0:00.22 kworker/6:0                                                                                                            
     1 root      20   0  193824   6876   4148 S   0.0  0.1   0:01.07 systemd                                                                                                                
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd                                                                                                               
     4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                                                                                           
     6 root      20   0       0      0      0 S   0.0  0.0   0:00.00 ksoftirqd/0                                                                                                            
     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.05 migration/0                                                                                                            
     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh                                                                                                                 
     9 root      20   0       0      0      0 S   0.0  0.0   0:00.15 rcu_sched                                                                                                              
    10 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 lru-add-drain                                                                                                          
    11 root      rt   0       0      0      0 S   0.0  0.0   0:00.00 watchdog/0                                                                                                             
    12 root      rt   0       0      0      0 S   0.0  0.0   0:00.00 watchdog/1                                                                                                             
    13 root      rt   0       0      0      0 S   0.0  0.0   0:00.03 migration/1                                                                                                            
    14 root      20   0       0      0      0 S   0.0  0.0   0:00.00 ksoftirqd/1                                                                                                            
    16 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/1:0H                                                                                                           
    17 root      rt   0       0      0      0 S   0.0  0.0   0:00.00 watchdog/2                                                                                                             
    18 root      rt   0       0      0      0 S   0.0  0.0   0:00.02 migration/2  
……

4.1 “shift+m”

        进入top的实时互动界面后,默认按照CPU的使用率排序,通过“shift+m”按键将进程按照内存使用情况排序,可以查看哪些进程是当前系统中的内存开销“大户”。

top - 22:18:58 up 29 min,  1 user,  load average: 0.00, 0.01, 0.05
Tasks: 142 total,   1 running, 141 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                
   670 root      20   0  358832  29516   7056 S   0.0  0.4   0:00.44 firewalld                                                                                                              
  1045 root      20   0  574280  19476   6136 S   0.0  0.2   0:00.23 tuned                                                                                                                  
   635 polkitd   20   0  613012  13964   4900 S   0.0  0.2   0:00.05 polkitd                                                                                                                
   710 root      20   0  548016   8952   6792 S   0.0  0.1   0:00.12 NetworkManager                                                                                                         
   467 root      20   0   50612   7120   2868 S   0.0  0.1   0:01.38 systemd-udevd                                                                                                          
     1 root      20   0  193824   6876   4148 S   0.0  0.1   0:01.07 systemd                                                                                                                
  1542 root      20   0  158896   5648   4268 S   0.0  0.1   0:00.19 sshd                                                                                                                   
   841 root      20   0  102904   5500   3440 S   0.0  0.1   0:00.01 dhclient                                                                                                               
  1050 root      20   0  220608   5120   3292 S   0.0  0.1   0:00.11 rsyslogd                                                                                                               
   648 root      20   0  168140   5024   3612 S   0.0  0.1   0:00.01 VGAuthService                                                                                                          
   649 root      20   0  272972   4760   3640 S   0.0  0.1   0:00.89 vmtoolsd                                                                                                               
  1047 root      20   0  112900   4316   3288 S   0.0  0.1   0:00.01 sshd                                                                                                                   
  1432 postfix   20   0   89880   4072   3072 S   0.0  0.1   0:00.00 qmgr                                                                                                                   
  1431 postfix   20   0   89812   4056   3056 S   0.0  0.1   0:00.00 pickup                                                                                                                 
   430 root      20   0   39056   3600   3284 S   0.0  0.0   0:00.08 systemd-journal                                                                                                        
   636 dbus      20   0   66448   2580   1876 S   0.0  0.0   0:00.08 dbus-daemon                                                                                                            
  1603 root      20   0  162104   2288   1572 R   0.0  0.0   0:00.13 top                                                                                                                    
  1412 root      20   0   89708   2124   1112 S   0.0  0.0   0:00.01 master                                                                                                                 
  1546 root      20   0  115544   2092   1656 S   0.0  0.0   0:00.02 bash                                                                                                                   
   652 root      20   0   26384   1752   1448 S   0.0  0.0   0:00.02 systemd-logind                                                                                                         
   638 chrony    20   0  117808   1684   1264 S   0.0  0.0   0:00.02 chronyd                                                                                                                
   662 root      20   0  126384   1672   1036 S   0.0  0.0   0:00.26 crond                                                                                                                  
   650 root      20   0   21692   1312    992 S   0.0  0.0   0:00.05 irqbalance                                                                                                             
   604 root      16  -4   55532    848    448 S   0.0  0.0   0:00.00 auditd

4.2 根据关键词排序

        top命令中,按下 f 键,进入选择排序列的界面,这里可以选择要显示的信息列,要按照哪些信息列进行排序等

        参照红框的说明来选择是否显示那些列就行,标*的就是显示。

        用上下键来移动,用空格键来确定/否定