有很多方法可以让您了解Linux系统内存使用情况。在本综述中,我们将介绍最常用的命令行方法:free、vmstat和top。我们还将直接查看reading/proc/meminfo。
linux如何使用ram
RAM是一种有限的资源,所有进程(如应用程序和守护进程)都需要它的一部分。只有这么多了。内核判断内存争用,并将定量分配的内存分配给所有饥饿的进程。这有点像一只母鸟,张开的喙指向她,而不是她的食物。
未使用的RAM是浪费的RAM。Linux使用任何空闲的RAM作为文件缓冲区空间,以保持计算机以最佳性能运行。很容易产生这样的印象:系统的RAM已经被一些失控的进程或内存泄漏所消耗,但这种情况很少发生。
它通常只是内核在后台顽强地完成它的工作。如果内核为自己的设备挖出了对RAM的其他需求,那么它会立即放弃内存,这样就不会造成伤害。
如果内核决定开始使用交换空间更有效,那么它也会发挥作用。关于Linux中的swappeiss值以及内核何时开始使用swap有很多混淆。swapiness值为触发swap的RAM使用设置了一个阈值,这是不真实的。
但是现在,让我们看看在终端窗口中可以使用哪些不同的技术来查看Linux计算机上RAM的使用情况。
自由命令
free命令为您提供一个表,其中列出了计算机上的总内存、已用内存、可用内存、共享内存、缓冲区/缓存和可用内存。它还显示配置的交换空间总量,以及已使用和可用的交换空间量。
在我们的示例中,我们将使用-m(mebibytes)选项。但是,也可以使用-b(字节)、-k(kibibytes)或-g(gibibytes)。
我们键入以下命令:
free -m
这是我们得到的输出:
total used free shared buff/cache available Mem: 1987 901 95 80 990 811 Swap: 1521 651 869
Mem列包含以下信息:
- 总计:此计算机上物理RAM的总量。
- 已用:从总量中减去空闲+缓冲区+缓存的总和。
- 空闲:未使用的内存量。
- 共享:tmpfs文件系统使用的内存量。
- Buff/cache:用于缓冲区和缓存的内存量。如果需要的话,内核可以快速地释放它。
- 可用:这是对可用于处理来自应用程序和计算机上任何其他操作软件的内存请求的内存的估计。
交换列包含以下信息:
- 总计:交换分区或文件的大小。
- 已用:正在使用的交换空间量。
- 空闲:剩余(未使用)交换空间的数量。
您还可以使用我们从一个读者那里调整的以下妙招来查看使用的交换空间百分比:
free -m | grep Swap | awk '{print ($3/$2)*100}'
相关:如何在Linux上使用free命令
vmstat命令
如果不了解交换空间的状态,就不可能很好地理解Linux系统中RAM的使用方式。RAM和交换空间紧密配合。
您可以使用vmstat命令更深入地了解交换空间(或虚拟内存)的使用方式。它根据上次重新启动后的平均值,为您提供有关各种与交换相关的统计信息的报告。
键入以下内容:
vmstat
这是不带环绕的输出:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 671488 576084 51088 823876 1 7 53 62 99 14 4 1 95 0 0
该报告中有很多数据点,因此我们将对它们进行细分:
- Proc:
- r:“可运行”进程的数量。他们要么在运行,要么在等待下一次CPU周期的分片爆发。
- b:处于不间断睡眠状态的进程数。它们不是休眠,而是执行阻塞系统调用。他们不能被打断,直到他们完成当前的操作。通常,这个过程是一个设备驱动程序等待一些资源空闲。当进程恢复其正常活动时,将处理该进程的任何排队中断。
- Memory:
- swpd:使用的虚拟内存量,即已交换的内存量。
- 空闲:空闲(未使用)内存的数量。
- 缓冲区:用作缓冲区的内存量。
- 缓存:用作缓存的内存量。
- Swap:
- si:从交换空间交换的虚拟内存量。
- 所以:为了交换空间而交换的虚拟内存量。
- IO:
- bi:街区。用于将虚拟内存交换回RAM的数据块数。
- 博:街区外。用于将虚拟内存从RAM交换到交换空间的数据块数。
- System:
- in:每秒中断的次数,包括时钟。
- cs:每秒上下文切换的数目。上下文切换是指内核从系统模式切换到用户模式处理。
- CPU: These values are all percentages of the total CPU time:
- us:运行用户(非内核)代码所花费的时间。
- sy:运行内核代码的时间。
- id:空闲时间。
- wa:等待输入或输出所花费的时间。
- st:虚拟机必须等待hypervisor完成对其他虚拟机的服务,然后才能返回并处理此虚拟机的时间。
相关:如何在Linux上使用vmstat命令
最高指挥部
top命令显示一个包含信息的屏幕。这些值每隔几秒钟更新一次。
要使用它,请键入以下内容:
top
按下了“e”键。这将显示更改为兆字节,这比表示字节的长字符串更容易直观地解析。在屏幕的顶部有五行信息,下面有一个包含数据列的窗格。
以下是您可以在每行中找到的信息:
- 第一行:时间,计算机运行了多长时间,有多少人登录,以及过去1分钟、5分钟和15分钟的平均负载。
- 第二行:任务的数量及其状态:正在运行、已停止、正在睡眠或僵尸。
- 第三行:CPU信息(参见下面字段的分解)。
- 第四行:物理内存总量,以及空闲、使用、缓冲或缓存的内存量。
- 第五行:交换内存的总量,以及空闲、已用和可用的内存量(考虑到预期可以从缓存中恢复的内存)。
第三行的CPU字段如下:
- us:CPU在用户空间中为用户执行进程所花费的时间。
- sy:CPU运行系统“内核空间”进程的时间。
- ni:CPU执行一个手动设置的好值的进程所花费的时间。
- id:CPU空闲时间。
- wa:CPU等待I/O完成的时间。
- 嗨:CPU处理硬件中断的时间。
- si:CPU用来维护软件中断的时间。
- st(steal time):由于运行虚拟机而导致CPU丢失的时间。
可能需要按向左或向右箭头键才能看到所有列。每列中的值描述如下:
- PID:进程ID。
- USER:进程所有者的名称。
- PR:进程优先级。
- 倪:这个过程很有价值。
- VIRT:进程使用的虚拟内存。
- RES:进程使用的驻留内存。
- SHR:进程使用的共享内存。
- S:进程的状态。(请参阅下面此字段可以获取的值列表)。
- %CPU:自上次更新以来进程所用的CPU时间份额。
- %MEM:使用的物理内存的份额。
- TIME+:任务在100分之一秒内使用的CPU总时间。
- 命令:命令名或命令行(名称+选项)。(此列在上图右侧的屏幕外。)
S列中显示的状态可以是以下状态之一:
- D:不间断睡眠。
- R:跑步。
- S:睡觉。
- T:跟踪(停止)。
- Z:僵尸。
按Q退出top。
正在读取/proc/meminfo
Linux中报告内存统计信息的许多(很可能是大多数)工具都从伪文件系统/proc/meminfo中检索信息。我们可以使用cat或less命令来做同样的事情。
我们键入以下内容:
less /proc/meminfo
根据运行的内核和CPU的体系结构,您可能会看到不同的字段。我们在虚拟机上得到以下结果:
MemTotal: 2035260 kB MemFree: 919064 kB MemAvailable: 1300932 kB Buffers: 33528 kB Cached: 457604 kB SwapCached: 29732 kB Active: 313360 kB Inactive: 603276 kB Active(anon): 74648 kB Inactive(anon): 355004 kB Active(file): 238712 kB Inactive(file): 248272 kB Unevictable: 16 kB Mlocked: 16 kB SwapTotal: 1557568 kB SwapFree: 873024 kB Dirty: 80 kB Writeback: 0 kB AnonPages: 414100 kB Mapped: 97436 kB Shmem: 4148 kB KReclaimable: 52932 kB Slab: 94216 kB SReclaimable: 52932 kB SUnreclaim: 41284 kB KernelStack: 9280 kB PageTables: 45264 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 2575196 kB Committed_AS: 5072192 kB VmallocTotal: 34359738367 kB VmallocUsed: 35712 kB VmallocChunk: 0 kB Percpu: 720 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB ShmemHugePages: 0 kB ShmemPmdMapped: 0 kB CmaTotal: 0 kB CmaFree: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB DirectMap4k: 180160 kB DirectMap2M: 1916928 kB
除非另有说明,所有大小均以千字节为单位。以下是它们的含义,以及根据计算机的配置和硬件,您可能会看到的其他一些含义:
- MemTotal:总的可用RAM(除了一些保留位和内核二进制代码)。
- MemFree:LowFree+HighFree之和。当前可用的RAM数量。
- MemAvailable:估计可用于启动新应用程序的内存,无需交换。
- 缓冲区:原始磁盘块的临时存储器。这减少了硬盘驱动器的输入和输出。它还加快了对相同数据的后续请求的访问,因为这些数据已经存在于内存中。
- 缓存:从硬盘上的文件读取的缓存页(不包括SwapCached)。
- SwapCached:在交换空间中保留一个副本的内存。
- 活动:最近使用的内存。除非绝对必要,否则不会回收。
- 非活动:已使用但不是最近使用的内存。很可能是填海造地的候选地。
- 活动(anon):分配给tmpfs伪文件系统中创建的文件的内存。匿名文件不在硬盘上。
- 非活动(anon):候选逐出(内存回收)的匿名、tmpfs和shmem内存量。
- 活动(文件):正在使用的或自上一个内存回收周期以来已使用的文件缓存内存量。
- 非活动(文件):从候选回收的硬盘驱动器读取的文件缓存内存量。
- 不可收回的:应该可以收回的内存量,但不是因为它被用户空间进程锁定在内存中。
- Mlocked:由于被用户空间进程锁定而无法收回的内存总量。
- HighTotal:HighMem的总量,由用户空间程序和页缓存使用。内核可以访问这个内存区域,但是它的访问速度比LowMem慢。
- HighFree:可用HighMem的数量。
- lowtottal:LowMem的数量,它与HighMem有相同的用途,但内核也有自己的用途。
- LowFree:自由LowMem的量。
- MmapCopy:映射到文件数据的内存量。
- SwapTotal:可用交换空间的总量。
- SwapFree:当前未使用的交换空间量。
- 脏:等待写回磁盘的内存量。
- 写回:主动写回磁盘的内存。
- AnonPages:映射到用户空间页表的非文件备份页。
- 映射:映射到内存的文件(如库)。
- Shmem:tmpfs伪文件系统中消耗的内存量。
- KReclaimable:如果对内存的需求足够严重,内核将尝试回收内核内存分配。
- Slab:内核数据结构缓存。
- 可回收的:可回收的板内存量,如缓存。
- sunclaime:无法回收的板内存量。
- KernelStack:分配给内核堆栈的内存量。
- 页表:专用于最低级别页表的内存量。
- 快速列表:因为页面表的分配和删除是一个非常频繁的操作,所以尽可能快的分配和删除页面表是至关重要的。因此,用于页表的页被缓存在许多不同的列表中,这些列表称为“快速列表”
- NFS不稳定:服务器已接收到网络文件系统(NFS)页,但尚未写入非易失性存储。
- 反弹:用于块设备反弹缓冲区的内存。反弹缓冲区位于内存中足够低的位置,以便设备直接访问它。然后将数据复制到HighMem中所需的用户页。
- WritebackTmp:文件系统在用户空间(FUSE)中用于临时写回缓冲区的内存。
- CommitLimit:系统中当前可分配的内存总量。
- 提交的\AS:为满足当前所有需求而估计的内存量。如果一个程序请求一些RAM,则会记录该请求,但只有在程序开始使用RAM时,才会分配该RAM。它也只根据需要分配,直到程序保留的最大数量。可以“分配”的内存比实际交付的内存多。如果所有程序都试图立即兑现RAM芯片,内存赌场可能会破产(而且必须与交换空间融资方携手合作)。
- VmallocTotal:vmalloc内存区的总大小。
- VmallocUsed:使用的vmalloc区域的数量。由于Linux 4.4,这个字段不再计算,而是硬编码的。
- VmallocChunk:自由vmalloc区域的最大连续块。
- HardwareCorrupted:标记为存在物理内存损坏问题的内存量。它不会被分配。
- LazyFree:处于MADV\u FREE状态的内存量。当应用程序在一系列页上设置MADV\u FREE标志时,这表示它不再需要它们,它们现在是回收候选。实际的回收可能会延迟,直到有足够的内存需求。如果应用程序开始写入页面,则可以取消回收。
- anonhuggepages:映射到用户空间页表的非文件备份的巨大页。非文件备份页不是来自硬盘文件。
- ShmemHugePages:共享内存(shmem)和伪文件系统(tmpfs)使用的内存量。
- ShmemPmdMapped: Amount of shared memory mapped into user-space with huge pages.
- CmaTotal: Amount of CMA (Contiguous Memory Allocator) pages. These are used by devices that can only communicate to contiguous regi*** of memory.
- CmaFree: Amount of free CMA (Contiguous Memory Allocator) pages.
- HugePages_Total: Huge page pool size.
- HugePages_Free: Number of unallocated huge pages in the pool.
- HugePages_Rsvd: Number of reserved huge pages. The commitment to allocate has been made, but allocation hasn’t occurred yet.
- HugePages_Surp: Number of huge pages in the pool above the defined system value.
- Hugepagesize: Size of huge pages.
- DirectMap4k: Number of bytes of RAM mapped to 4 kB pages.
- DirectMap4M: Number of bytes of RAM mapped to 4 MB pages.
- DirectMap2M: Number of bytes of RAM mapped to 2 MB pages.
- DirectMap1G: Number of bytes of RAM mapped to 2 GB pages.
与Linux一样,快速概述的方法不止一种,而且总是至少有一种方法可以更深入地了解细节。
您可能会定期使用free、top和vmstate,并保留/proc/meminfo,以便在需要深入调查特定问题时使用。