Linux缺页异常运维解决方案
概述
系统级性能调优与内存管理
缺页异常(Page Fault Exception)
当一个进程访问某个虚拟地址时,CPU 会检查对应的页表项,如果该虚拟地址还没有映射到物理内存(页表项无效),或者该地址对应的页数据暂时不在内存里(比如被换出到磁盘 Swap 区), 或者访问权限不符合(读写越权),就会触发 缺页异常(Page Fault Exception)。
大量缺页异常通常表明:
主要异常(Major Page Fault)
需要从磁盘加载数据,I/O开销大,严重影响性能
次要异常(Minor Page Fault)
内存中存在但未映射,主要是内存管理开销
系统瓶颈指标
内存不足、I/O压力、进程调度异常
实时监控与诊断命令
vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 3 524288 85432 12456 345678 15 23 156 89 678 234 25 15 45 15 0 3 4 528896 82341 12234 342345 18 26 234 123 789 345 28 18 38 16 0 关键指标解读: - si/so: swap in/out,高值表明内存压力 - bi/bo: block in/out,高值表明I/O瓶颈 - wa: iowait,高值表明等待I/O时间长
sar -B 1 10
Average: pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff Average: 245.67 123.45 1234.56 45.67 567.89 23.45 12.34 34.56 87.65 关键指标解读: - fault/s: 总缺页异常率 - majflt/s: 主要缺页异常率(重点关注) - pgscank/s: kswapd扫描页面数 - %vmeff: 内存回收效率
iostat -x 1 5
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util sda 15.67 8.23 123.45 67.89 2.34 1.23 13.45 8.76 12.34 23.45 0.23 7.89 8.25 8.9 23.45 关键指标解读: - %util: 设备利用率,>80%需要关注 - r_await/w_await: 读写延迟 - aqu-sz: 平均队列长度
紧急响应阶段
echo 3 > /proc/sys/vm/drop_caches
清理页面缓存,释放内存压力
进程分析
ps aux --sort=-%mem | head -20
找出内存占用最高的进程
内存映射分析
cat /proc/PID/smaps | grep -E "(Size|Rss|Pss)"
详细分析进程内存使用情况
系统参数调优
sysctl vm.swappiness=10
降低swap使用倾向
核心调优参数
关键内核参数优化
# 内存管理优化 echo 'vm.swappiness=10' >> /etc/sysctl.conf echo 'vm.vfs_cache_pressure=50' >> /etc/sysctl.conf echo 'vm.dirty_ratio=15' >> /etc/sysctl.conf echo 'vm.dirty_background_ratio=5' >> /etc/sysctl.conf echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf echo 'vm.overcommit_ratio=80' >> /etc/sysctl.conf # 应用配置 sysctl -p
vm.swappiness
推荐值:10-20控制swap使用积极程度,降低值减少swap
vm.vfs_cache_pressure
推荐值:50-100控制内核回收文件系统缓存的倾向
vm.dirty_ratio
推荐值:10-20脏页比例阈值,影响写入性能
vm.overcommit_memory
推荐值:1内存超分配策略,1为启发式overcommit
JVM应用优化
# JVM堆内存调优示例
export JAVA_OPTS="-Xms4g -Xmx4g -XX:NewRatio=3 -XX:+UseG1GC
-XX:MaxGCPauseMillis=200 -XX:+DisableExplicitGC
-XX:+HeapDumpOnOutOfMemoryError"数据库优化
# MySQL innodb调优 echo 'innodb_buffer_pool_size=70%' >> /etc/mysql/my.cnf echo 'innodb_log_file_size=512M' >> /etc/mysql/my.cnf echo 'innodb_flush_method=O_DIRECT' >> /etc/mysql/my.cnf
nginx/apache调优
# nginx worker进程调优 worker_processes auto; worker_connections 65535; worker_rlimit_nofile 65535;
建立监控脚本
#!/bin/bash
# 缺页异常监控脚本
while true; do
MAJFLT=$(sar -B 1 1 | tail -1 | awk '{print $5}')
if (( $(echo "$MAJFLT > 50" | bc -l) )); then
echo "$(date): High major page faults: $MAJFLT/s" >> /var/log/pagefault.log
# 触发告警机制
echo "High page fault detected" | mail -s "System Alert" admin@company.com
fi
sleep 60
done性能基线建立
正常基线指标
Major faults < 10/sMemory usage < 80%Swap usage < 20%
告警阈值
Major faults > 50/sMemory usage > 90%I/O wait > 30%
关键监控工具
Prometheus + GrafanaZabbixNagios
立即响应
• 检查系统负载和内存使用 • 识别占用内存最多的进程 • 清理不必要的缓存
短期缓解
• 重启占用内存过多的服务 • 调整swap策略 • 临时增加交换空间
中期优化
• 应用程序代码优化 • 数据库查询优化 • 系统参数精细调优
长期规划
• 硬件升级评估 • 架构优化设计 • 容量规划制定