在Linux系统中,内存管理是一个非常重要的部分,涉及查看内存使用情况、优化内存分配、排查内存问题等操作。以下是与内存相关的常见操作和命令:
1. 查看内存使用情况
-
free
: 显示系统内存使用情况。free -h
: 以人类可读的格式显示内存使用情况(如KB、MB、GB)。free -m
: 以MB为单位显示内存使用情况。free -s 5
: 每5秒刷新一次内存使用情况。
-
top
: 实时显示系统资源使用情况,包括内存。- 按
M
键:按内存使用排序进程。 - 按
q
键:退出top
。
- 按
-
htop
:top
的增强版,提供更友好的界面。- 按
F6
键:选择按内存排序。
- 按
-
vmstat
: 显示虚拟内存统计信息。vmstat 1
: 每秒刷新一次内存和CPU使用情况。
-
cat /proc/meminfo
: 查看详细的内存信息。- 显示总内存、空闲内存、缓存、交换分区等信息。
-
ps
: 查看进程的内存使用情况。ps aux --sort=-%mem
: 按内存使用率排序显示进程。
2. 监控内存使用
-
sar
: 系统活动报告工具,可以监控内存使用情况。sar -r 1
: 每秒显示内存使用情况。sar -S 1
: 每秒显示交换分区使用情况。
-
smem
: 显示进程的内存使用情况。smem -s rss
: 按RSS(常驻内存)排序显示进程。
-
glances
: 实时监控系统资源,包括内存。glances
: 启动监控界面。
3. 内存优化与清理
-
清理缓存
sync; echo 1 > /proc/sys/vm/drop_caches
: 清理页缓存。sync; echo 2 > /proc/sys/vm/drop_caches
: 清理目录项和inode缓存。sync; echo 3 > /proc/sys/vm/drop_caches
: 清理页缓存、目录项和inode缓存。
-
调整交换分区
swapon /dev/sdX
: 启用交换分区。swapoff /dev/sdX
: 禁用交换分区。swapon -s
: 查看当前启用的交换分区。
-
调整内存分配策略
sysctl vm.swappiness=10
: 调整系统使用交换分区的倾向(值越小,越少使用交换分区)。sysctl vm.overcommit_memory=1
: 允许内存超额分配(适用于特定场景)。
4. 内存泄漏排查
-
valgrind
: 检测内存泄漏的工具(适用于C/C++程序)。valgrind --leak-check=full ./your_program
: 检测程序的内存泄漏。
-
pmap
: 查看进程的内存映射。pmap -x <PID>
: 显示进程的详细内存映射。
-
gdb
: 调试工具,可以用于分析内存问题。gdb ./your_program
: 启动调试。gdb attach <PID>
: 附加到正在运行的进程。
-
strace
: 跟踪系统调用和信号。strace -p <PID>
: 跟踪指定进程的系统调用。
5. 内存压力测试
-
stress
: 模拟内存压力。stress --vm 1 --vm-bytes 1G
: 分配1GB内存并持续占用。
-
memtester
: 测试内存的稳定性和错误。memtester 1G 10
: 测试1GB内存,运行10次。
6. 虚拟内存管理
-
swap
: 管理交换分区。mkswap /dev/sdX
: 创建交换分区。swapon /dev/sdX
: 启用交换分区。swapoff /dev/sdX
: 禁用交换分区。
-
zram
: 使用压缩内存作为交换分区。modprobe zram
: 加载zram模块。echo 1 > /sys/class/zram-control/hot_add
: 添加zram设备。
7. 内存相关配置文件
/proc/meminfo
: 系统内存信息。/proc/sys/vm/swappiness
: 控制交换分区的使用倾向。/proc/sys/vm/overcommit_memory
: 控制内存超额分配策略。/proc/sys/vm/drop_caches
: 控制缓存清理。
8. 内存相关内核参数调整
-
sysctl
: 动态调整内核参数。sysctl vm.swappiness=10
: 调整交换分区使用倾向。sysctl vm.overcommit_memory=1
: 允许内存超额分配。sysctl vm.dirty_ratio=20
: 调整脏页写回磁盘的阈值。
-
持久化内核参数
- 编辑
/etc/sysctl.conf
文件,添加参数并执行sysctl -p
生效。
- 编辑
9. 内存相关工具
-
numactl
: 控制NUMA(非一致性内存访问)策略。numactl --hardware
: 显示NUMA节点信息。numactl --cpunodebind=0 --membind=0 ./your_program
: 绑定程序到指定NUMA节点。
-
numastat
: 显示NUMA节点的内存统计信息。numastat
: 显示NUMA节点的内存分配情况。
10. 内存相关日志
-
dmesg
: 查看内核日志,包括内存相关错误。dmesg | grep -i memory
: 过滤内存相关的日志。
-
/var/log/messages
: 系统日志文件,可能包含内存相关错误。
11. 内存相关故障排查
-
OOM Killer(内存不足杀手)
dmesg | grep -i oom
: 查看OOM Killer是否杀死了进程。/proc/<PID>/oom_score
: 查看进程的OOM分数(分数越高,越容易被杀死)。
-
内存泄漏
- 使用
valgrind
、pmap
、gdb
等工具排查。
- 使用
-
内存碎片
- 使用
cat /proc/buddyinfo
查看内存碎片情况。
- 使用
12. 内存相关高级操作
-
HugePages(大页内存)
cat /proc/meminfo | grep Huge
: 查看大页内存使用情况。sysctl vm.nr_hugepages=1024
: 设置大页内存数量。
-
Transparent HugePages(透明大页)
cat /sys/kernel/mm/transparent_hugepage/enabled
: 查看透明大页状态。echo never > /sys/kernel/mm/transparent_hugepage/enabled
: 禁用透明大页。
以上是与Linux内存相关的常见操作和命令,涵盖了从查看内存使用情况到优化和故障排查的各个方面。根据具体需求,可以选择合适的工具和方法进行操作。