当涉及到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 键,进入选择排序列的界面,这里可以选择要显示的信息列,要按照哪些信息列进行排序等
参照红框的说明来选择是否显示那些列就行,标*的就是显示。
用上下键来移动,用空格键来确定/否定