# 查看整体内存使用情况
free -h
# 动态监控内存变化
vmstat 1 5
# 显示内存统计信息
cat /proc/meminfo
# 按进程查看内存使用
top
# 或
htop
# 详细内存分析
sudo smem -s swap -r
# 内存泄漏检测工具
valgrind --leak-check=yes your_program
# 内核内存分析
sudo slabtop
识别泄漏进程:
ps aux --sort=-%mem | head
分析进程内存:
pmap -x <PID>
使用strace跟踪系统调用:
strace -p <PID> -e trace=mmap,munmap,brk
调整OOM killer行为:
# 查看进程OOM得分
cat /proc/<PID>/oom_score
# 调整进程OOM优先级
echo -1000 > /proc/<PID>/oom_score_adj
增加交换空间:
# 创建交换文件
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 永久生效
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
手动释放缓存:
# 释放页面缓存
echo 1 > /proc/sys/vm/drop_caches
# 释放目录项和inodes
echo 2 > /proc/sys/vm/drop_caches
# 释放页面缓存、目录项和inodes
echo 3 > /proc/sys/vm/drop_caches
调整内核参数:
# 减少脏页写回阈值(单位:百分比)
echo 10 > /proc/sys/vm/dirty_background_ratio
echo 20 > /proc/sys/vm/dirty_ratio
# 减少脏页在内存中保留时间(单位:百分之一秒)
echo 500 > /proc/sys/vm/dirty_expire_centisecs
内核参数调优:
# 编辑/etc/sysctl.conf添加以下内容:
vm.swappiness = 10
vm.vfs_cache_pressure = 50
vm.overcommit_memory = 1
vm.overcommit_ratio = 80
# 应用配置
sysctl -p
使用cgroups限制进程内存:
# 创建cgroup
sudo cgcreate -g memory:limited_group
# 设置内存限制为1GB
echo 1G > /sys/fs/cgroup/memory/limited_group/memory.limit_in_bytes
# 将进程加入cgroup
echo <PID> > /sys/fs/cgroup/memory/limited_group/tasks
监控与警报设置:
# 安装监控工具
sudo apt install sysstat
# 配置sar定期收集数据
# 编辑/etc/default/sysstat 设置ENABLED="true"
sudo systemctl enable sysstat
sudo systemctl start sysstat
使用perf分析内存:
perf stat -e cache-misses,cache-references,page-faults <command>
使用SystemTap分析:
sudo stap -e 'probe vfs.read {bytes += $count} probe end {printf("Total bytes read: %d\n", bytes)}'
使用ebpf/bcc工具:
sudo /usr/share/bcc/tools/cachestat
sudo /usr/share/bcc/tools/memleak -p <PID>
通过以上方法和工具,您可以有效地诊断和解决Linux系统中的各种内存问题。