在 Linux 操作系统中,为需要运行的进程提供足够的可用物理内存 (内存) 非常重要。
如果此内存用完,接下来将开始使用交换空间,这将导致性能降低,因为 I/O 操作将需要写入磁盘。
如果主内存和交换区都已满, Linux 系统可能会完全僵死。
检查 Linux 内存使用情况的命令
“free”命令。
'free' 命令将提供显示内存使用的最准确方式,当使用 -m 标志运行时,输出更容易阅读,因为值将以 MB 显示。
jack@onitroad [~]# free -m total used free shared buffers cached Mem: 3948 3248 700 0 245 2036 -/+ buffers/cache: 966 2982 Swap: 3999 675 3324
如果我们看到已使用的 Mem 量很高而空闲 Mem 量很低,请不要惊慌(至少不是立即),因为通常会保留用于缓存目的的内存以帮助加快速度。
未使用内存的最佳指示是缓冲区/缓存行的空闲列。
这显示了有多少内存完全未使用和可用,因为缓冲区/缓存使用的内存可以在需要时快速用于其他地方。
Linux 足够聪明,可以将一些未使用的内存用于磁盘缓存以提高性能,但是它可能会使我们看起来好像可用内存比实际少。
从技术上讲,操作系统正在使用它,这就是它显示为正在使用的原因,但是如果我们实际上在其他地方需要任何这些内存,它将立即准备好使用,因此我们不一定内存不足。
在上面的例子中,使用的 Mem 显示为 3248mb,有 700mb 空闲,但这并不是空闲内存的最佳指示。
最好的是缓冲区/缓存中列出的 2982mb 空闲空间。
free 命令还将显示已用和空闲交换使用情况,理想情况下将使用 0 交换,这意味着没有任何内容从物理内存交换到硬盘。
如果此值大于 0,我们应该调查内存使用情况,因为它可能已经填满并在某个时候溢出到磁盘。
在我们上面的例子中,我们有一些小的交换使用,它在一段时间内没有改变,并且有足够的空闲内存,所以目前看起来没问题。
如果交换已满,则可以分配更多磁盘空间来增加它,但是首先我们最好确认需要另外的内存使用量,然后我们会想要增加物理内存。
“top”命令。
top 命令是一种众所周知的方式,可以实时动态地快速了解 Linux 中的资源使用情况。
Top 向我们展示了可用的总内存,包括其中有多少正在使用中,有多少是空闲的。
top 命令还向我们展示了有多少交换空间可用,包括有多少正在使用和空闲。
这些值包括缓冲区和缓存使用的内存,类似于“free”命令中显示的第一行。
top - 22:39:56 up 7 days, 9:58, 1 user, load average: 0.03, 0.05, 0.00 Tasks: 124 total, 1 running, 123 sleeping, 0 stopped, 0 zombie Cpu(s): 0.2%us, 0.0%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 4043720k total, 3325664k used, 718056k free, 251452k buffers Swap: 4095992k total, 691520k used, 3404472k free, 2085212k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 5034 mysql 15 0 1443m 207m 6552 S 0.0 5.3 20:07.09 mysqld 8320 username 16 0 149m 46m 6848 S 0.0 1.2 0:11.94 php 8631 username 16 0 148m 45m 6832 S 0.0 1.2 0:21.39 php 8269 username 16 0 146m 43m 7252 S 0.0 1.1 0:14.85 php 8694 username 15 0 145m 43m 7272 S 0.0 1.1 0:12.74 php 8695 username 16 0 145m 42m 7276 S 0.0 1.1 0:12.60 php 9110 username 16 0 142m 40m 7248 S 0.0 1.0 0:03.30 php 8604 username 16 0 140m 37m 7192 S 0.0 1.0 0:03.86 php 8603 username 15 0 138m 35m 7204 S 0.0 0.9 0:05.54 php 8289 username 16 0 184m 29m 6648 S 0.0 0.7 0:06.77 php 2158 root 11 -10 28704 22m 1744 S 0.0 0.6 0:00.01 iscsiuio 8768 username 16 0 179m 20m 6680 S 0.0 0.5 0:01.44 php 8290 username 16 0 175m 17m 6336 S 0.0 0.5 0:14.69 php 8106 nobody 20 0 416m 12m 7316 S 0.0 0.3 0:00.97 httpd 8113 nobody 19 0 351m 10m 6832 S 0.0 0.3 0:00.08 httpd
然后,我们可以更进一步,按照使用的内存量对进程进行排序,允许我们将进程从最高内存使用到最低排名。
这我们查看是否有任何可能需要进一步调查的内存繁重的进程。
要按内存对顶部输出进行排序,请按“shift + m”键。
上面示例中的输出已按这种方式排序,我们可以看到 mysqld 进程使用了最多的内存,这是有道理的,因为它已配置为缓存数据库。
/proc/meminfo 文件
如果我们对内存进行更详细的分解,请查看 /proc/meminfo 文件。
jack@onitroad [~]# cat /proc/meminfo MemTotal: 4043720 kB MemFree: 715944 kB Buffers: 251940 kB Cached: 2085324 kB SwapCached: 206052 kB Active: 1862372 kB Inactive: 1141632 kB HighTotal: 0 kB HighFree: 0 kB LowTotal: 4043720 kB LowFree: 715944 kB SwapTotal: 4095992 kB SwapFree: 3404472 kB Dirty: 740 kB Writeback: 0 kB AnonPages: 626324 kB Mapped: 34684 kB Slab: 284540 kB PageTables: 15068 kB NFS_Unstable: 0 kB Bounce: 0 kB CommitLimit: 6117852 kB Committed_AS: 3057500 kB VmallocTotal: 34359738367 kB VmallocUsed: 265844 kB VmallocChunk: 34359471351 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 Hugepagesize: 2048 kB