介绍
内存管理是 Linux 系统管理的一个关键方面,它直接影响系统的性能和稳定性。了解 Linux 系统中内存是如何分配、使用和报告的,能让管理员优化系统性能、解决问题,并确保应用程序有足够的资源。
在这个实验中,你将学习如何使用命令行工具来监控和分析 Linux 系统的内存使用情况。你将探索 free 命令,它能提供有关系统内存分配和使用的重要信息。通过掌握这些工具,你将获得有效监控系统内存资源并就系统优化做出明智决策所需的技能。
在这个实验结束时,你将能够检查系统内存状态、解读内存统计信息并创建基本的内存使用报告,这些都是任何 Linux 用户或系统管理员必备的基本技能。
使用基本的 free 命令
free 命令是一个基础的 Linux 实用工具,用于显示系统中可用和已使用的内存量。这些信息能帮助你了解系统当前的内存状态,并判断系统是否有足够的资源来运行应用程序。
运行基本的 free 命令
在默认工作区 /home/labex/project 中打开终端,并执行基本的 free 命令:
free
你应该会看到类似如下的输出:
total used free shared buff/cache available
Mem: 8000000 3000000 1000000 25000 4000000 4700000
Swap: 0 0 0
该输出以字节为单位显示内存值,这可能不太容易阅读。若要使用更易读的格式,可使用 -h 选项(人类可读格式):
free -h
现在输出将更像这样:
total used free shared buff/cache available
Mem: 7.6Gi 2.9Gi 954Mi 24Mi 3.8Gi 4.5Gi
Swap: 0B 0B 0B
这种格式会使用合适的单位(KB、MB、GB)来显示内存大小,使其更易于解读。
创建工作目录
让我们创建一个目录来存储你在本次实验中创建的文件:
mkdir -p ~/project/memory_data
将内存统计信息保存到文件
现在,让我们将 free -h 命令的输出保存到一个文件中,以备将来参考:
free -h > ~/project/memory_data/memory_stats.txt
要验证文件是否已创建并包含预期的信息,请使用 cat 命令:
cat ~/project/memory_data/memory_stats.txt
你应该会看到与之前在终端中显示的相同输出。
理解内存输出列
既然你已经获取了基本的内存统计信息,接下来让我们了解 free 命令输出中每一列的含义。这些知识将帮助你更有效地解读系统的内存状态。
内存输出列解释
打开你在上一步中创建的内存统计信息文件:
cat ~/project/memory_data/memory_stats.txt
输出包含以下几列:
- total:系统中安装的内存(RAM)总量。
- used:系统当前正在使用的内存量。
- free:当前未被用于任何用途的内存量。
- shared:由多个进程共享的内存,通常由 tmpfs(临时文件系统)和共享内存段使用。
- buff/cache:内核缓冲区和页面缓存使用的内存:
- buffers:内核在将数据写入磁盘之前临时存储数据所使用的内存。
- caches:用于存储从磁盘读取的数据以实现更快访问的内存。
- available:在不使用交换空间的情况下,可用于启动新应用程序的可用内存估计值。
创建内存报告
现在,让我们创建一份详细的内存报告,解释每一列的含义并记录当前的值。创建一个名为 memory_report.txt 的新文件:
nano ~/project/memory_data/memory_report.txt
在 nano 编辑器中,添加以下内容(将占位符值替换为你系统中的实际值):
Memory Report - Created on $(date)
total: [Your value here]
The total amount of physical RAM installed on the system.
used: [Your value here]
The amount of memory currently being used by applications and the operating system.
free: [Your value here]
The amount of memory that is completely unused and available.
shared: [Your value here]
Memory used by tmpfs and shared memory segments that can be accessed by multiple processes.
buff/cache: [Your value here]
Memory used for kernel buffers and disk cache to improve system performance.
available: [Your value here]
An estimate of how much memory is available for starting new applications without swapping.
要获取当前值,你可以参考之前保存的 memory_stats.txt 文件。
添加内容后,按 Ctrl+O 然后按 Enter 保存文件,再按 Ctrl+X 退出 nano。
以不同单位查看内存
free 命令允许你以不同单位显示内存。让我们创建一个文件,展示不同单位的内存信息:
free -b | head -2 > ~/project/memory_data/memory_units.txt
echo "Memory in bytes (above)" >> ~/project/memory_data/memory_units.txt
echo "" >> ~/project/memory_data/memory_units.txt
free -k | head -2 >> ~/project/memory_data/memory_units.txt
echo "Memory in kilobytes (above)" >> ~/project/memory_data/memory_units.txt
echo "" >> ~/project/memory_data/memory_units.txt
free -m | head -2 >> ~/project/memory_data/memory_units.txt
echo "Memory in megabytes (above)" >> ~/project/memory_data/memory_units.txt
echo "" >> ~/project/memory_data/memory_units.txt
free -g | head -2 >> ~/project/memory_data/memory_units.txt
echo "Memory in gigabytes (above)" >> ~/project/memory_data/memory_units.txt
查看该文件,以不同单位查看内存信息:
cat ~/project/memory_data/memory_units.txt
这有助于你了解如何根据自己的需求以最合适的单位显示内存信息。
实时监控内存
系统管理员通常需要随时间监控内存使用情况,以检测趋势或排查问题。在这一步中,你将学习如何实时监控内存使用情况,并创建一个简单的脚本,以定期记录内存使用信息。
将 watch 命令与 free 结合使用
watch 命令允许你定期运行一个命令并显示其输出。这对于实时监控内存使用情况非常有用:
watch -n 2 free -h
此命令每 2 秒运行一次 free -h 并显示更新后的输出。你应该会看到内存统计信息实时更新。
要退出 watch 命令,请按 Ctrl+C。
使用带有间隔选项的 free 命令
free 命令本身可以按固定间隔显示内存使用情况。语法如下:
free -s [seconds] -c [count]
其中:
-s指定更新之间的间隔(以秒为单位)-c指定要显示的更新次数
让我们每 3 秒监控一次内存使用情况,总共进行 4 次更新:
free -h -s 3 -c 4
这将显示 4 次内存统计信息,每次更新之间暂停 3 秒。
创建内存监控脚本
让我们创建一个脚本,以定期记录内存使用信息。首先,创建一个新的脚本文件:
nano ~/project/memory_data/memory_monitor.sh
在文件中添加以下内容:
#!/bin/bash
## Create a log file with the current date and time
log_file=~/project/memory_data/memory_log_$(date +%Y%m%d_%H%M%S).txt
## Write header to the log file
echo "Memory Usage Log - Started at $(date)" > $log_file
echo "Monitoring every 5 seconds for 5 readings" >> $log_file
echo "----------------------------------------" >> $log_file
## Loop 5 times, capturing memory info every 5 seconds
for i in {1..5}; do
echo "Reading $i - $(date)" >> $log_file
free -h >> $log_file
echo "----------------------------------------" >> $log_file
sleep 5
done
echo "Monitoring completed at $(date)" >> $log_file
echo "Log saved to $log_file"
按 Ctrl+O 然后按 Enter 保存文件,再按 Ctrl+X 退出。
现在,使脚本可执行:
chmod +x ~/project/memory_data/memory_monitor.sh
运行脚本:
~/project/memory_data/memory_monitor.sh
脚本将运行约 25 秒(5 秒 × 5 次读取),并创建一个包含内存使用信息的日志文件。完成后,你将看到一条消息,指示日志文件的保存位置。
要查看日志文件:
cat ~/project/memory_data/memory_log_*
这个日志文件显示了内存使用情况随时间的变化,这对于排查与内存相关的问题或了解内存使用模式非常有价值。
探索高级内存信息
Linux 提供的内存信息比基本的 free 命令显示的内容更详细。在这一步中,你将探索其他内存信息来源,并创建一份全面的内存摘要。
探索 /proc/meminfo
/proc/meminfo 文件包含了系统的详细内存信息。让我们来查看一下:
head -20 /proc/meminfo
这个文件包含了数十个与内存相关的值,其中包括:
MemTotal:可用的总 RAMMemFree:空闲内存MemAvailable:可用内存Buffers:内核缓冲区使用的内存Cached:用于文件缓存的内存SwapTotal:总的交换空间SwapFree:空闲的交换空间
让我们从这个文件中提取一些关键信息:
grep -E "MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree" /proc/meminfo > ~/project/memory_data/meminfo_excerpt.txt
查看提取的信息:
cat ~/project/memory_data/meminfo_excerpt.txt
创建全面的内存摘要
现在,让我们创建一个脚本,生成一份全面的内存摘要报告。创建一个新的脚本文件:
nano ~/project/memory_data/create_summary.sh
添加以下内容:
#!/bin/bash
## Set output file with timestamp
output_file=~/project/memory_data/memory_summary_$(date +%Y%m%d_%H%M%S).txt
## Create header
echo "LINUX MEMORY SUMMARY REPORT" > $output_file
echo "===========================" >> $output_file
echo "Date: $(date)" >> $output_file
echo "" >> $output_file
## Basic memory statistics
echo "BASIC MEMORY STATISTICS:" >> $output_file
free -h >> $output_file
echo "" >> $output_file
## Detailed memory information
echo "DETAILED MEMORY INFORMATION:" >> $output_file
echo "Total RAM: $(grep MemTotal /proc/meminfo | awk '{print $2 " " $3}')" >> $output_file
echo "Free RAM: $(grep MemFree /proc/meminfo | awk '{print $2 " " $3}')" >> $output_file
echo "Available RAM: $(grep MemAvailable /proc/meminfo | awk '{print $2 " " $3}')" >> $output_file
echo "Buffer memory: $(grep Buffers /proc/meminfo | awk '{print $2 " " $3}')" >> $output_file
echo "Cache memory: $(grep "^Cached:" /proc/meminfo | awk '{print $2 " " $3}')" >> $output_file
echo "" >> $output_file
## Swap information
echo "SWAP INFORMATION:" >> $output_file
echo "Total Swap: $(grep SwapTotal /proc/meminfo | awk '{print $2 " " $3}')" >> $output_file
echo "Free Swap: $(grep SwapFree /proc/meminfo | awk '{print $2 " " $3}')" >> $output_file
echo "" >> $output_file
## Memory usage percentage calculation
total_mem=$(grep MemTotal /proc/meminfo | awk '{print $2}')
used_mem=$(grep MemTotal /proc/meminfo | awk '{print $2}')
used_mem=$((used_mem - $(grep MemFree /proc/meminfo | awk '{print $2}')))
used_mem=$((used_mem - $(grep Buffers /proc/meminfo | awk '{print $2}')))
used_mem=$((used_mem - $(grep "^Cached:" /proc/meminfo | awk '{print $2}')))
mem_percentage=$((used_mem * 100 / total_mem))
echo "MEMORY USAGE SUMMARY:" >> $output_file
echo "Memory usage percentage: ${mem_percentage}%" >> $output_file
echo "" >> $output_file
echo "Memory summary report generated at $output_file"
按 Ctrl+O 然后按 Enter 保存文件,再按 Ctrl+X 退出。
使脚本可执行:
chmod +x ~/project/memory_data/create_summary.sh
运行脚本以生成摘要报告:
~/project/memory_data/create_summary.sh
脚本执行完成后,查看生成的摘要报告:
cat ~/project/memory_data/memory_summary_*
这份全面的报告通过整合多个来源的数据,让你详细了解系统的内存状态。
创建简单的内存状态命令
最后,让我们创建一个简单的单行命令,以简洁的格式显示当前的内存状态:
echo "Memory status: $(free -h | grep Mem | awk '{print "Total:"$2, "Used:"$3, "Free:"$4, "Available:"$7}')" > ~/project/memory_data/memory_status.txt
查看内存状态:
cat ~/project/memory_data/memory_status.txt
这个命令从 free 命令的输出中提取最重要的信息,并以紧凑的格式呈现。
总结
在本次实验中,你探索了在 Linux 系统中监控和分析内存使用情况的重要技术。你从基本的内存报告逐步深入到高级分析,掌握了对系统管理和故障排除非常有价值的技能。
你学到的关键概念和技能如下:
- 基本内存报告:你使用
free命令查看基本的内存统计信息,并学会了如何解读输出列。 - 理解内存指标:你了解了每个内存指标(总量、已使用、空闲、共享、缓冲/缓存、可用)的含义,以及如何以不同单位显示内存。
- 实时监控:你学会了如何使用
watch命令实时监控内存使用情况,并创建了一个脚本以定期记录内存使用信息。 - 高级内存分析:你探索了
/proc/meminfo文件中的详细内存信息,并创建了全面的内存摘要报告。
这些技能对于有效的系统管理至关重要,因为内存管理直接影响系统性能。通过监控内存使用情况,你可以:
- 识别与内存相关的性能问题
- 判断系统是否需要更多资源
- 了解应用程序如何使用内存
- 检测内存泄漏或过度使用内存的情况
- 为系统优化做出明智的决策
你在本次实验中学到的技术为 Linux 系统的内存管理奠定了坚实的基础,并且可以结合更高级的监控工具和自动化技术进一步拓展。



