本文档风哥主要介绍Linux内存管理相关知识,包括free命令查看内存使用、内存类型详解、内存监控策略、内存优化案例等内容,参考Red Hat Enterprise Linux 10官方文档,适合运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 Linux内存管理概念
Linux内存管理是系统性能优化的核心。Linux采用虚拟内存管理机制,将物理内存和交换空间统一管理。free命令用于查看系统内存使用情况,包括物理内存、交换空间和缓存使用情况。
- 系统性能:内存使用直接影响系统性能
- 稳定性:内存不足会导致系统不稳定
- 容量规划:合理规划内存资源
- 故障预防:及时发现内存问题
1.2 Linux内存类型
Linux内存类型详解:
# 1. 物理内存(Physical Memory)
– 总内存(total):系统总物理内存
– 已用内存(used):已使用的物理内存
– 空闲内存(free):未使用的物理内存
# 2. 交换空间(Swap Space)
– 总交换(total):交换空间总量
– 已用交换(used):已使用的交换空间
– 空闲交换(free):未使用的交换空间
# 3. 缓存内存(Cached Memory)
– 页缓存(page cache):文件系统缓存
– 缓冲区(buffers):块设备缓存
– Slab缓存:内核对象缓存
# 4. 内存使用计算
# 实际可用内存 = free + buffers + cached
# 实际已用内存 = used – buffers – cached
# 5. 内存使用率
# 内存使用率 = (used – buffers – cached) / total * 100%
# 6. 交换使用率
# 交换使用率 = used / total * 100%
1.3 内存监控重要性
内存监控是系统运维的重要工作:
# 1. 监控指标
– 物理内存使用率
– 交换空间使用率
– 缓存使用情况
– 内存增长趋势
# 2. 监控阈值
– 警告阈值:80%
– 严重阈值:90%
– 紧急阈值:95%
# 3. 监控频率
– 实时监控:关键系统
– 定时监控:普通系统
– 手动检查:日常巡检
# 4. 监控工具
– free命令
– top命令
– vmstat命令
– 监控系统(Zabbix/Prometheus)
# 5. 监控策略
– 定期检查内存使用率
– 设置自动告警
– 记录历史数据
– 分析增长趋势
# 6. 应急预案
– 内存不足时的处理流程
– 释放缓存策略
– 服务重启策略
– 内存扩容方案
Part02-生产环境规划与建议
2.1 内存规划原则
在生产环境中,内存规划应遵循以下原则:
# 1. 应用内存需求
# Web服务器
Nginx: 512MB-2GB
Apache: 1GB-4GB
# 应用服务器
Java应用: 2GB-8GB
Python应用: 1GB-4GB
Node.js应用: 1GB-4GB
# 数据库服务器
MySQL: 4GB-32GB
PostgreSQL: 4GB-32GB
Redis: 1GB-8GB
# 2. 系统内存预留
– 操作系统:1GB-2GB
– 系统缓存:总内存的20%
– 预留空间:总内存的10%
# 3. 交换空间规划
– 内存<2GB:交换=2*内存
- 内存2-8GB:交换=内存
- 内存>8GB:交换=4GB-8GB
# 4. 内存监控规划
– 设置内存使用率告警
– 监控交换使用
– 记录历史数据
– 分析增长趋势
# 5. 内存维护规划
– 定期检查内存使用
– 定期清理缓存
– 定期优化应用
– 定期备份数据
# 6. 内存扩容规划
– 预留扩容空间
– 制定扩容方案
– 测试扩容流程
– 记录扩容历史
2.2 内存告警建议
生产环境内存告警建议:
- 设置多级告警阈值
- 区分物理内存和交换空间
- 配置告警通知渠道
- 记录告警历史
- 定期测试告警
- 建立应急响应流程
# 1. 告警阈值配置
警告级别 内存使用率 交换使用率 处理时间
警告 80% 50% 24小时内
严重 90% 70% 4小时内
紧急 95% 80% 立即处理
# 2. 告警脚本
# cat > /tmp/memory_alert.sh << 'EOF'
#!/bin/bash
MEM_WARNING=80
MEM_CRITICAL=90
MEM_EMERGENCY=95
SWAP_WARNING=50
SWAP_CRITICAL=70
SWAP_EMERGENCY=80
# 检查内存使用率
mem_total=$(free | grep Mem | awk '{print $2}')
mem_used=$(free | grep Mem | awk '{print $3}')
mem_percent=$((mem_used * 100 / mem_total))
# 检查交换使用率
swap_total=$(free | grep Swap | awk '{print $2}')
swap_used=$(free | grep Swap | awk '{print $3}')
if [ $swap_total -gt 0 ]; then
swap_percent=$((swap_used * 100 / swap_total))
else
swap_percent=0
fi
# 发送告警
if [ $mem_percent -ge $MEM_EMERGENCY ]; then
echo "EMERGENCY: Memory usage is ${mem_percent}%"
elif [ $mem_percent -ge $MEM_CRITICAL ]; then
echo "CRITICAL: Memory usage is ${mem_percent}%"
elif [ $mem_percent -ge $MEM_WARNING ]; then
echo "WARNING: Memory usage is ${mem_percent}%"
fi
if [ $swap_percent -ge $SWAP_EMERGENCY ]; then
echo "EMERGENCY: Swap usage is ${swap_percent}%"
elif [ $swap_percent -ge $SWAP_CRITICAL ]; then
echo "CRITICAL: Swap usage is ${swap_percent}%"
elif [ $swap_percent -ge $SWAP_WARNING ]; then
echo "WARNING: Swap usage is ${swap_percent}%"
fi
EOF
# 3. 定时任务配置
# crontab -e
*/30 * * * * /tmp/memory_alert.sh
# 4. 告警通知配置
# 邮件通知
# 钉钉通知
# 企业微信通知
# 短信通知
# 5. 告警历史记录
# 记录告警时间、内存使用率、交换使用率、处理结果
# 6. 告警测试
# 手动触发告警测试
# 验证告警通知
# 验证处理流程
2.3 内存审计策略
定期审计内存使用情况:
# 1. 创建内存审计脚本
# cat > /tmp/memory_audit.sh << 'EOF'
#!/bin/bash
REPORT="/tmp/memory_audit_report.txt"
echo "========================================" > $REPORT
echo “Memory Audit Report – $(date)” >> $REPORT
echo “========================================” >> $REPORT
echo “” >> $REPORT
# 1. 内存使用情况
echo “1. Memory Usage” >> $REPORT
echo “————–” >> $REPORT
free -h >> $REPORT
echo “” >> $REPORT
# 2. 内存详细信息
echo “2. Memory Details” >> $REPORT
echo “—————-” >> $REPORT
free -m >> $REPORT
echo “” >> $REPORT
# 3. 内存使用率
echo “3. Memory Usage Percentage” >> $REPORT
echo “————————-” >> $REPORT
mem_total=$(free | grep Mem | awk ‘{print $2}’)
mem_used=$(free | grep Mem | awk ‘{print $3}’)
mem_percent=$((mem_used * 100 / mem_total))
echo “Memory usage: ${mem_percent}%” >> $REPORT
echo “” >> $REPORT
# 4. 交换使用情况
echo “4. Swap Usage” >> $REPORT
echo “————” >> $REPORT
swap_total=$(free | grep Swap | awk ‘{print $2}’)
swap_used=$(free | grep Swap | awk ‘{print $3}’)
if [ $swap_total -gt 0 ]; then
swap_percent=$((swap_used * 100 / swap_total))
echo “Swap usage: ${swap_percent}%” >> $REPORT
else
echo “No swap configured” >> $REPORT
fi
echo “” >> $REPORT
# 5. 内存使用最多的进程
echo “5. Top Memory Processes” >> $REPORT
echo “———————-” >> $REPORT
ps aux –sort=-%mem | head -n 10 >> $REPORT
echo “” >> $REPORT
# 6. 内存统计
echo “6. Memory Statistics” >> $REPORT
echo “——————–” >> $REPORT
vmstat -s | grep -E “total memory|used memory|free memory|total swap|used swap” >> $REPORT
echo “” >> $REPORT
echo “Audit completed. Report saved to $REPORT”
EOF
# 2. 执行审计脚本
# chmod +x /tmp/memory_audit.sh
# /tmp/memory_audit.sh
Audit completed. Report saved to /tmp/memory_audit_report.txt
# 3. 查看审计报告
# cat /tmp/memory_audit_report.txt
Part03-生产环境项目实施方案
3.1 free命令基础操作
free命令用于查看系统内存使用情况:
# 1. 查看内存使用情况
# free
total used free shared buff/cache available
Mem: 1866208 123456 456789 12345 987654 1234567
Swap: 2097148 0 2097148
# 2. 以人类可读格式显示
# free -h
total used free shared buff/cache available
Mem: 1.8G 121M 446M 12M 965M 1.2G
Swap: 2.0G 0B 2.0G
# 3. 以MB为单位显示
# free -m
total used free shared buff/cache available
Mem: 1822 120 446 12 965 1206
Swap: 2047 0 2047
# 4. 以GB为单位显示
# free -g
total used free shared buff/cache available
Mem: 1 0 0 0 0 1
Swap: 2 0 2
# 5. 显示总计
# free -t
total used free shared buff/cache available
Mem: 1866208 123456 456789 12345 987654 1234567
Swap: 2097148 0 2097148
Total: 3963356 123456 2553937
# 6. 持续监控内存使用
# free -s 2
total used free shared buff/cache available
Mem: 1866208 123456 456789 12345 987654 1234567
Swap: 2097148 0 2097148
total used free shared buff/cache available
Mem: 1866208 123457 456788 12345 987654 1234566
Swap: 2097148 0 2097148
# 7. 显示指定次数
# free -c 3
total used free shared buff/cache available
Mem: 1866208 123456 456789 12345 987654 1234567
Swap: 2097148 0 2097148
total used free shared buff/cache available
Mem: 1866208 123457 456788 12345 987654 1234566
Swap: 2097148 0 2097148
total used free shared buff/cache available
Mem: 1866208 123458 456787 12345 987654 1234565
Swap: 2097148 0 2097148
# 8. 显示低内存和高内存统计
# free -l
total used free shared buff/cache available
Mem: 1866208 123456 456789 12345 987654 1234567
Low: 123456 12345 0
High: 1742752 0 1742752
Swap: 2097148 0 2097148
# 9. 显示宽输出格式
# free -w
total used free shared buff/cache available
Mem: 1866208 123456 456789 12345 987654 1234567
Swap: 2097148 0 2097148
# 10. 显示内存使用率
# free | grep Mem | awk ‘{printf “Memory Usage: %.2f%%\n”, $3/$2*100}’
Memory Usage: 6.62%
# 11. 显示交换使用率
# free | grep Swap | awk ‘{printf “Swap Usage: %.2f%%\n”, $3/$2*100}’
Swap Usage: 0.00%
# 12. 显示可用内存
# free -h | grep Mem | awk ‘{print $7}’
1.2G
# 13. 显示已用内存
# free -h | grep Mem | awk ‘{print $3}’
121M
# 14. 显示总内存
# free -h | grep Mem | awk ‘{print $2}’
1.8G
# 15. 监控内存使用变化
# watch -n 1 free -h
3.2 内存管理高级用法
内存管理的高级用法和技巧:
# 1. 查找内存使用最多的进程
# ps aux –sort=-%mem | head -n 10
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1234 0.5 5.2 123456 98765 ? Ssl 10:00 0:05 /usr/bin/python3 /usr/bin/app
root 5678 0.1 3.1 56789 54321 ? S 10:00 0:01 /usr/sbin/nginx
root 9012 0.0 2.5 45678 43210 ? S 10:00 0:00 /usr/sbin/mysqld
# 2. 查看进程内存详情
# cat /proc/1234/status | grep -E “VmSize|VmRSS|VmPeak|VmHWM”
VmSize: 123456 kB
VmRSS: 98765 kB
VmPeak: 134567 kB
VmHWM: 100000 kB
# 3. 查看系统内存统计
# vmstat -s
1866208 K total memory
123456 K used memory
456789 K active memory
345678 K inactive memory
987654 K free memory
12345 K buffer memory
876543 K swap cache
2097148 K total swap
0 K used swap
2097148 K free swap
# 4. 查看内存映射
# pmap 1234
1234: /usr/bin/python3 /usr/bin/app
0000000000400000 1234K r-x– /usr/bin/python3.10
0000000000563000 12K r—- /usr/bin/python3.10
0000000000566000 12K rw— /usr/bin/python3.10
…
# 5. 查看内存使用趋势
# cat > /tmp/memory_trend.sh << 'EOF'
#!/bin/bash
LOG_FILE="/var/log/memory_trend.log"
# 记录当前内存使用
mem_total=$(free | grep Mem | awk '{print $2}')
mem_used=$(free | grep Mem | awk '{print $3}')
mem_percent=$((mem_used * 100 / mem_total))
echo "$(date): Memory usage: ${mem_percent}%" >> $LOG_FILE
# 显示最近7天的趋势
echo “Memory usage trend (last 7 days):”
tail -n 7 $LOG_FILE
EOF
# 6. 释放页面缓存
# sync
# echo 1 > /proc/sys/vm/drop_caches
# 7. 释放目录项和inode缓存
# sync
# echo 2 > /proc/sys/vm/drop_caches
# 8. 释放页面缓存、目录项和inode缓存
# sync
# echo 3 > /proc/sys/vm/drop_caches
# 9. 查看内存碎片
# cat /proc/buddyinfo
Node 0, zone DMA 0 0 0 0 0 0 0 0 0 0 0
Node 0, zone DMA32 123 456 789 234 567 890 345 678 901 234 567
Node 0, zone Normal 789 234 567 890 345 678 901 234 567 890 345
# 10. 查看内存分配器统计
# cat /proc/slabinfo
slabinfo – version: 2.1
# name
kmalloc-8192 123 456 8192 1 1 : tunables 0 0 0 : slabdata 123 456 0
kmalloc-4096 234 567 4096 2 1 : tunables 0 0 0 : slabdata 117 283 0
# 11. 查看NUMA内存信息
# numactl –hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7
node 0 size: 1024 MB
node 0 free: 512 MB
node 1 cpus: 8 9 10 11 12 13 14 15
node 1 size: 1024 MB
node 1 free: 512 MB
# 12. 查看内存大页
# cat /proc/meminfo | grep -i huge
AnonHugePages: 12345 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
# 13. 查看内存压缩
# cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never
# 14. 查看内存交换倾向
# cat /proc/sys/vm/swappiness
60
# 15. 查看内存回收参数
# cat /proc/sys/vm/vfs_cache_pressure
100
3.3 内存优化策略
内存优化策略和技巧:
# 1. 调整交换倾向
# cat /proc/sys/vm/swappiness
60
# 降低交换倾向(推荐值10-20)
# echo 10 > /proc/sys/vm/swappiness
# 永久配置
# vim /etc/sysctl.conf
vm.swappiness=10
# 2. 调整缓存压力
# cat /proc/sys/vm/vfs_cache_pressure
100
# 提高缓存回收倾向(推荐值50-100)
# echo 50 > /proc/sys/vm/vfs_cache_pressure
# 永久配置
# vim /etc/sysctl.conf
vm.vfs_cache_pressure=50
# 3. 调整脏页比例
# cat /proc/sys/vm/dirty_ratio
20
# 降低脏页比例(推荐值5-10)
# echo 5 > /proc/sys/vm/dirty_ratio
# 永久配置
# vim /etc/sysctl.conf
vm.dirty_ratio=5
# 4. 调整脏页超时
# cat /proc/sys/vm/dirty_expire_centisecs
3000
# 缩短脏页超时(推荐值500-1000)
# echo 500 > /proc/sys/vm/dirty_expire_centisecs
# 永久配置
# vim /etc/sysctl.conf
vm.dirty_expire_centisecs=500
# 5. 启用内存压缩
# echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
# 永久配置
# vim /etc/sysctl.conf
vm.transparent_hugepage=madvise
# 6. 配置内存大页
# 计算大页数量
# 假设需要4GB大页内存,每页2MB
# echo 2048 > /proc/sys/vm/nr_hugepages
# 永久配置
# vim /etc/sysctl.conf
vm.nr_hugepages=2048
# 7. 配置NUMA策略
# 绑定进程到特定NUMA节点
# numactl –cpunodebind=0 –membind=0 /usr/bin/app
# 8. 优化应用内存
# Java应用
# -Xms: 初始堆大小
# -Xmx: 最大堆大小
# -XX:+UseG1GC: 使用G1垃圾回收器
# Python应用
# 使用内存分析工具
# 优化数据结构
# 使用生成器
# 9. 监控内存使用
# 创建监控脚本
# cat > /tmp/memory_monitor.sh << 'EOF'
#!/bin/bash
THRESHOLD=80
while true; do
mem_total=$(free | grep Mem | awk '{print $2}')
mem_used=$(free | grep Mem | awk '{print $3}')
mem_percent=$((mem_used * 100 / mem_total))
if [ $mem_percent -ge $THRESHOLD ]; then
echo "Warning: Memory usage is ${mem_percent}%"
# 显示内存使用最多的进程
ps aux --sort=-%mem | head -n 5
fi
sleep 60
done
EOF
# 10. 内存优化检查清单
- 检查内存使用率
- 检查交换使用率
- 检查缓存使用情况
- 检查进程内存使用
- 检查内存碎片
- 检查内存泄漏
Part04-生产案例与实战讲解
4.1 不同场景内存监控案例
不同场景下的内存监控案例:
# 1. Web服务器内存监控
# cat > /tmp/web_memory_monitor.sh << 'EOF'
#!/bin/bash
echo "Web Server Memory Monitor - $(date)"
# 检查内存使用情况
echo "Memory Usage:"
free -h
# 检查Web进程内存使用
echo ""
echo "Web Processes Memory:"
ps aux | grep -E "nginx|apache|httpd" | grep -v grep
# 检查PHP-FPM内存使用
echo ""
echo "PHP-FPM Memory:"
ps aux | grep php-fpm | grep -v grep
# 检查内存使用最多的进程
echo ""
echo "Top Memory Processes:"
ps aux --sort=-%mem | head -n 10
EOF
# 2. 数据库服务器内存监控
# cat > /tmp/db_memory_monitor.sh << 'EOF'
#!/bin/bash
echo "Database Server Memory Monitor - $(date)"
# 检查内存使用情况
echo "Memory Usage:"
free -h
# 检查数据库进程内存使用
echo ""
echo "Database Processes Memory:"
ps aux | grep -E "mysql|postgres|redis" | grep -v grep
# 检查数据库缓存
echo ""
echo "Database Cache:"
if [ -f /var/lib/mysql/ib_buffer_pool ]; then
du -sh /var/lib/mysql/ib_buffer_pool
fi
# 检查内存使用最多的进程
echo ""
echo "Top Memory Processes:"
ps aux --sort=-%mem | head -n 10
EOF
# 3. 应用服务器内存监控
# cat > /tmp/app_memory_monitor.sh << 'EOF'
#!/bin/bash
echo "Application Server Memory Monitor - $(date)"
# 检查内存使用情况
echo "Memory Usage:"
free -h
# 检查应用进程内存使用
echo ""
echo "Application Processes Memory:"
ps aux | grep -E "java|python|node" | grep -v grep
# 检查应用内存详情
echo ""
echo "Application Memory Details:"
for pid in $(pgrep -f "app"); do
echo "PID: $pid"
cat /proc/$pid/status | grep -E "VmSize|VmRSS|VmPeak|VmHWM"
done
# 检查内存使用最多的进程
echo ""
echo "Top Memory Processes:"
ps aux --sort=-%mem | head -n 10
EOF
# 4. 容器服务器内存监控
# cat > /tmp/container_memory_monitor.sh << 'EOF'
#!/bin/bash
echo "Container Server Memory Monitor - $(date)"
# 检查内存使用情况
echo "Memory Usage:"
free -h
# 检查容器内存使用
echo ""
echo "Container Memory:"
docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}\t{{.MemPerc}}" 2>/dev/null
# 检查容器进程内存使用
echo “”
echo “Container Processes Memory:”
docker ps –format “{{.Names}}” | while read container; do
pid=$(docker inspect –format ‘{{.State.Pid}}’ $container)
echo “Container: $container, PID: $pid”
cat /proc/$pid/status | grep -E “VmSize|VmRSS” 2>/dev/null
done
# 检查内存使用最多的进程
echo “”
echo “Top Memory Processes:”
ps aux –sort=-%mem | head -n 10
EOF
# 5. 综合内存监控
# cat > /tmp/comprehensive_memory_monitor.sh << 'EOF'
#!/bin/bash
echo "Comprehensive Memory Monitor - $(date)"
# 检查内存使用情况
echo "1. Memory Usage:"
free -h
# 检查交换使用情况
echo ""
echo "2. Swap Usage:"
free -h | grep Swap
# 检查内存使用最多的进程
echo ""
echo "3. Top Memory Processes:"
ps aux --sort=-%mem | head -n 10
# 检查内存统计
echo ""
echo "4. Memory Statistics:"
vmstat -s | grep -E "total memory|used memory|free memory|total swap|used swap"
# 检查内存碎片
echo ""
echo "5. Memory Fragmentation:"
cat /proc/buddyinfo | head -n 5
# 检查内存大页
echo ""
echo "6. Huge Pages:"
cat /proc/meminfo | grep -i huge
EOF
4.2 内存故障排查案例
内存相关故障的排查和解决:
# 案例1:内存使用率过高
# 症状:系统响应缓慢,内存使用率超过90%
# 排查步骤:
# 1. 检查内存使用情况
# free -h
total used free shared buff/cache available
Mem: 1.8G 1.7G 100M 12M 50M 100M
Swap: 2.0G 1.0G 1.0G
# 2. 检查内存使用最多的进程
# ps aux –sort=-%mem | head -n 10
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1234 50.0 85.2 1234567 1567890 ? R 10:00 5:00 /usr/bin/app
# 3. 检查进程内存详情
# cat /proc/1234/status | grep -E “VmSize|VmRSS|VmPeak|VmHWM”
VmSize: 1234567 kB
VmRSS: 1567890 kB
VmPeak: 2000000 kB
VmHWM: 1600000 kB
# 解决:重启应用或优化应用内存
# 案例2:交换空间使用过高
# 症状:系统性能下降,交换空间使用率超过50%
# 排查步骤:
# 1. 检查交换使用情况
# free -h | grep Swap
Swap: 2.0G 1.5G 500M
# 2. 检查交换倾向
# cat /proc/sys/vm/swappiness
60
# 3. 检查内存使用情况
# free -h
total used free shared buff/cache available
Mem: 1.8G 1.6G 100M 12M 50M 100M
# 解决:降低交换倾向或增加内存
# 案例3:内存泄漏
# 症状:应用内存使用持续增长
# 排查步骤:
# 1. 监控进程内存使用
# watch -n 1 “ps aux | grep app | grep -v grep”
# 2. 查看进程内存详情
# cat /proc/1234/status | grep -E “VmSize|VmRSS|VmPeak|VmHWM”
VmSize: 1234567 kB
VmRSS: 1567890 kB
VmPeak: 2000000 kB
VmHWM: 1600000 kB
# 3. 使用内存分析工具
# valgrind –leak-check=full /usr/bin/app
# 解决:修复应用内存泄漏
# 案例4:内存碎片严重
# 症状:内存使用率高但实际可用内存不足
# 排查步骤:
# 1. 检查内存碎片
# cat /proc/buddyinfo
Node 0, zone Normal 789 234 567 890 345 678 901 234 567 890 345
# 2. 检查内存分配
# cat /proc/slabinfo | head -n 20
# 3. 检查内存使用
# free -h
total used free shared buff/cache available
Mem: 1.8G 1.5G 100M 12M 50M 100M
# 解决:重启系统或优化内存分配
# 案例5:OOM Killer触发
# 症状:进程被系统杀死,日志显示”Out of memory”
# 排查步骤:
# 1. 检查系统日志
# dmesg | grep -i “out of memory”
[12345.678901] Out of memory: Kill process 1234 (app) score 900 or sacrifice child
# 2. 检查内存使用情况
# free -h
total used free shared buff/cache available
Mem: 1.8G 1.8G 0B 12M 0B 0B
# 3. 检查OOM配置
# cat /proc/sys/vm/panic_on_oom
0
# 解决:增加内存或优化应用
# 案例6:缓存占用过高
# 症状:内存使用率高但应用内存使用正常
# 排查步骤:
# 1. 检查内存使用情况
# free -h
total used free shared buff/cache available
Mem: 1.8G 1.2G 100M 12M 500M 500M
# 2. 检查缓存使用
# cat /proc/meminfo | grep -E “Cached|Buffers”
Cached: 456789 kB
Buffers: 12345 kB
# 3. 释放缓存
# sync
# echo 3 > /proc/sys/vm/drop_caches
# 解决:释放缓存或调整缓存策略
# 案例7:NUMA内存不平衡
# 症状:性能不稳定,某些NUMA节点内存使用率高
# 排查步骤:
# 1. 检查NUMA内存信息
# numactl –hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7
node 0 size: 1024 MB
node 0 free: 512 MB
node 1 cpus: 8 9 10 11 12 13 14 15
node 1 size: 1024 MB
node 1 free: 100 MB
# 2. 检查进程NUMA绑定
# numastat -p 1234
# 解决:调整NUMA策略或绑定进程
# 案例8:内存大页配置问题
# 症状:应用无法启动或性能下降
# 排查步骤:
# 1. 检查内存大页配置
# cat /proc/meminfo | grep -i huge
HugePages_Total: 2048
HugePages_Free: 2048
# 2. 检查应用大页需求
# cat /proc/1234/smaps | grep -i huge
# 解决:调整大页配置
# 案例9:内存压缩问题
# 症状:内存使用率高但性能下降
# 排查步骤:
# 1. 检查内存压缩配置
# cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never
# 2. 检查压缩统计
# cat /sys/kernel/mm/transparent_hugepage/defrag
# 解决:调整内存压缩配置
# 案例10:内存分配失败
# 症状:应用提示”Cannot allocate memory”
# 排查步骤:
# 1. 检查内存使用情况
# free -h
total used free shared buff/cache available
Mem: 1.8G 1.8G 0B 12M 0B 0B
# 2. 检查交换使用情况
# free -h | grep Swap
Swap: 2.0G 2.0G 0B
# 3. 检查内存碎片
# cat /proc/buddyinfo
# 解决:增加内存或释放内存
4.3 内存性能优化案例
内存性能优化的实际案例:
# 1. 优化交换倾向
# cat > /tmp/optimize_swap.sh << 'EOF'
#!/bin/bash
echo "Optimizing swap behavior..."
# 检查当前交换倾向
echo "Current swappiness: $(cat /proc/sys/vm/swappiness)"
# 降低交换倾向
echo 10 > /proc/sys/vm/swappiness
# 永久配置
if ! grep -q “vm.swappiness” /etc/sysctl.conf; then
echo “vm.swappiness=10” >> /etc/sysctl.conf
fi
# 应用配置
sysctl -p
echo “Swap behavior optimized”
EOF
# 2. 优化缓存策略
# cat > /tmp/optimize_cache.sh << 'EOF'
#!/bin/bash
echo "Optimizing cache policy..."
# 检查当前缓存压力
echo "Current vfs_cache_pressure: $(cat /proc/sys/vm/vfs_cache_pressure)"
# 提高缓存回收倾向
echo 50 > /proc/sys/vm/vfs_cache_pressure
# 永久配置
if ! grep -q “vm.vfs_cache_pressure” /etc/sysctl.conf; then
echo “vm.vfs_cache_pressure=50” >> /etc/sysctl.conf
fi
# 应用配置
sysctl -p
echo “Cache policy optimized”
EOF
# 3. 优化脏页策略
# cat > /tmp/optimize_dirty.sh << 'EOF'
#!/bin/bash
echo "Optimizing dirty page policy..."
# 检查当前脏页配置
echo "Current dirty_ratio: $(cat /proc/sys/vm/dirty_ratio)"
echo "Current dirty_background_ratio: $(cat /proc/sys/vm/dirty_background_ratio)"
# 降低脏页比例
echo 5 > /proc/sys/vm/dirty_ratio
echo 3 > /proc/sys/vm/dirty_background_ratio
# 缩短脏页超时
echo 500 > /proc/sys/vm/dirty_expire_centisecs
echo 100 > /proc/sys/vm/dirty_writeback_centisecs
# 永久配置
if ! grep -q “vm.dirty_ratio” /etc/sysctl.conf; then
echo “vm.dirty_ratio=5” >> /etc/sysctl.conf
echo “vm.dirty_background_ratio=3” >> /etc/sysctl.conf
echo “vm.dirty_expire_centisecs=500” >> /etc/sysctl.conf
echo “vm.dirty_writeback_centisecs=100” >> /etc/sysctl.conf
fi
# 应用配置
sysctl -p
echo “Dirty page policy optimized”
EOF
# 4. 优化内存压缩
# cat > /tmp/optimize_thp.sh << 'EOF'
#!/bin/bash
echo "Optimizing transparent huge pages..."
# 检查当前THP配置
echo "Current THP: $(cat /sys/kernel/mm/transparent_hugepage/enabled)"
# 设置THP为madvise
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
# 永久配置
if ! grep -q “transparent_hugepage” /etc/sysctl.conf; then
echo “vm.transparent_hugepage=madvise” >> /etc/sysctl.conf
fi
# 应用配置
sysctl -p
echo “Transparent huge pages optimized”
EOF
# 5. 优化NUMA策略
# cat > /tmp/optimize_numa.sh << 'EOF'
#!/bin/bash
echo "Optimizing NUMA policy..."
# 检查NUMA配置
numactl --hardware
# 设置NUMA策略(示例:绑定到节点0)
# numactl --cpunodebind=0 --membind=0 /usr/bin/app &
echo "NUMA policy optimized"
EOF
# 6. 配置内存大页
# cat > /tmp/optimize_hugepages.sh << 'EOF'
#!/bin/bash
echo "Optimizing huge pages..."
# 计算大页数量(示例:4GB,每页2MB)
HUGEPAGES=$((4 * 1024 / 2))
# 设置大页数量
echo $HUGEPAGES > /proc/sys/vm/nr_hugepages
# 永久配置
if ! grep -q “vm.nr_hugepages” /etc/sysctl.conf; then
echo “vm.nr_hugepages=$HUGEPAGES” >> /etc/sysctl.conf
fi
# 应用配置
sysctl -p
echo “Huge pages optimized”
EOF
# 7. 完整内存优化
# cat > /tmp/full_memory_optimization.sh << 'EOF'
#!/bin/bash
echo "Starting full memory optimization..."
# 1. 优化交换倾向
./optimize_swap.sh
# 2. 优化缓存策略
./optimize_cache.sh
# 3. 优化脏页策略
./optimize_dirty.sh
# 4. 优化内存压缩
./optimize_thp.sh
# 5. 优化NUMA策略
./optimize_numa.sh
# 6. 配置内存大页
./optimize_hugepages.sh
echo "Full memory optimization completed"
EOF
# chmod +x /tmp/full_memory_optimization.sh
# /tmp/full_memory_optimization.sh
Part05-风哥经验总结与分享
5.1 内存管理最佳实践
# 1. 内存监控原则
– 定期检查内存使用率
– 设置自动告警
– 记录历史数据
– 分析增长趋势
# 2. 内存优化原则
– 降低交换倾向
– 优化缓存策略
– 调整脏页策略
– 配置内存大页
# 3. 内存规划原则
– 合理分配内存
– 预留系统内存
– 配置交换空间
– 定期评估需求
# 4. 内存告警原则
– 设置多级告警
– 区分内存和交换
– 配置通知渠道
– 建立应急流程
# 5. 内存安全原则
– 定期检查内存健康
– 监控内存泄漏
– 记录内存变更
– 建立应急预案
5.2 常见问题与解决
# 问题1:内存使用率过高
# 解决:查找并优化内存使用
# ps aux –sort=-%mem | head -n 10
# 问题2:交换空间使用过高
# 解决:降低交换倾向或增加内存
# echo 10 > /proc/sys/vm/swappiness
# 问题3:内存泄漏
# 解决:使用内存分析工具
# valgrind –leak-check=full
# 问题4:内存碎片严重
# 解决:重启系统或优化内存分配
# cat /proc/buddyinfo
# 问题5:OOM Killer触发
# 解决:增加内存或优化应用
# dmesg | grep -i “out of memory”
# 问题6:缓存占用过高
# 解决:释放缓存
# sync && echo 3 > /proc/sys/vm/drop_caches
# 问题7:NUMA内存不平衡
# 解决:调整NUMA策略
# numactl –hardware
# 问题8:内存大页配置问题
# 解决:调整大页配置
# cat /proc/meminfo | grep -i huge
# 问题9:内存压缩问题
# 解决:调整内存压缩配置
# cat /sys/kernel/mm/transparent_hugepage/enabled
# 问题10:内存分配失败
# 解决:增加内存或释放内存
# free -h
5.3 内存管理工具推荐
- 基本工具:free, top, ps
- 监控工具:vmstat, iotop, dstat
- 分析工具:valgrind, gdb, strace
- NUMA工具:numactl, numastat
- 监控系统:Zabbix, Prometheus
# 1. 查看内存使用
# free -h
# free -m
# 2. 查看进程内存
# ps aux –sort=-%mem
# top
# 3. 监控内存统计
# vmstat -s
# vmstat 1 5
# 4. 查看进程内存详情
# cat /proc/PID/status
# pmap PID
# 5. 分析内存泄漏
# valgrind –leak-check=full ./app
# 6. 监控NUMA
# numactl –hardware
# numastat -p PID
# 7. 查看内存大页
# cat /proc/meminfo | grep -i huge
# 8. 查看内存碎片
# cat /proc/buddyinfo
# 9. 查看内存分配器
# cat /proc/slabinfo
# 10. 监控内存IO
# iotop -o
# dstat -t –mem –io 1 5
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
