1. 首页 > Linux教程 > 正文

Linux教程FG069-free命令内存使用查看

本文档风哥主要介绍Linux内存管理相关知识,包括free命令查看内存使用、内存类型详解、内存监控策略、内存优化案例等内容,参考Red Hat Enterprise Linux 10官方文档,适合运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 Linux内存管理概念

Linux内存管理是系统性能优化的核心。Linux采用虚拟内存管理机制,将物理内存和交换空间统一管理。free命令用于查看系统内存使用情况,包括物理内存、交换空间和缓存使用情况。

Linux内存管理的重要性:

  • 系统性能:内存使用直接影响系统性能
  • 稳定性:内存不足会导致系统不稳定
  • 容量规划:合理规划内存资源
  • 故障预防:及时发现内存问题

1.2 Linux内存类型

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命令用于查看系统内存使用情况:

# 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 : tunables : slabdata
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 内存管理最佳实践

风哥提示:内存管理是Linux系统性能优化的核心,必须建立完善的内存监控和优化机制。

# 内存管理最佳实践清单

# 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

风哥总结:内存管理是Linux系统性能优化的核心,掌握free命令,理解内存管理机制,建立完善的内存监控和优化机制,是每个运维人员必备的技能。更多视频教程www.fgedu.net.cn

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息