当前位置: 首页 > news >正文

Linux 系统内存不足导致服务崩溃的排查方法

59bf3f0d0cd40f186b0e387439919140

 

当 Linux 系统内存不足导致服务崩溃时,需要系统性地排查问题,以找出内存耗尽的根本原因。以下是一套详细的排查步骤和方法,包括实时监控、日志分析、配置优化等。


1. 确认问题:内存不足的表现

内存不足的情况通常包括以下现象:

  1. 服务崩溃
    • 服务进程被系统强制终止(可能触发 OOM Killer)。
  2. 系统性能下降
    • 响应慢,命令执行卡顿。
  3. 系统日志报错
    • 如 "Out of memory" 或 "Killed process ..." 等。
  4. 高 Swap 使用
    • 系统频繁使用交换分区(Swap),导致磁盘 IO 性能下降。

2. 排查内存不足的原因

2.1 检查当前内存使用情况

  1. 使用 free 查看内存状态

    bash
    free -h
    • 输出示例:
      apache
                    total        used        free      shared  buff/cache   available
      Mem:           8.0G        7.6G        0.1G        0.2G        0.3G        0.2G
      Swap:          2.0G        1.9G        0.1G
    • 关键点:
      • used:已用内存。
      • available:可用内存(包含 buff/cache)。
      • Swap 使用率:如果 Swap 使用率很高,说明物理内存不足。
  2. 使用 vmstat 查看内存和 Swap

    bash
    vmstat 1 5
    • 重点关注:
      • si/so:Swap 输入/输出速率(高值表示频繁使用 Swap)。
      • freebuff/cache:内存剩余情况。
  3. 使用 tophtop 实时监控内存

    bash
    top
    • M 键按内存占用排序,找出高内存占用的进程。
  4. 使用 smem 查看详细内存分配

    • 安装:
      bash
      sudo apt install smem  # Ubuntu/Debian
      sudo yum install smem  # CentOS/RHEL
    • 命令:
      bash
      smem -tk
    • 输出内存分配情况,包括共享内存和实际使用的内存。

2.2 检查系统日志

  1. 查看 OOM Killer 日志

    • 系统在内存不足时,会触发 OOM Killer 强制终止占用内存过多的进程。
    • 查看日志:
      bash
      sudo dmesg | grep -i "out of memory"
      sudo dmesg | grep -i "killed process"
    • 示例输出:
       
      [12345.678901] Out of memory: Kill process 1234 (java) score 987 or sacrifice child
      [12345.678902] Killed process 1234 (java) total-vm:4096000kB, anon-rss:2048000kB
    • 分析:
      • 确认被杀进程的名称和内存使用量。
  2. 检查 /var/log/messages/var/log/syslog

    • 搜索与内存相关的关键字:
      bash
      sudo grep -i "memory" /var/log/messages
      sudo grep -i "oom" /var/log/syslog

2.3 定位高内存占用的进程

  1. 使用 ps 查找大内存进程

    bash
    ps aux --sort=-%mem | head -n 10
    • 输出示例:
      apache
      USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
      root      1234  50.0 30.0 2048000 1024000 ?    Ssl  10:00   5:00 java
  2. 使用 pmap 查看进程内存分布

    • 针对某个进程(如 PID 为 1234):
      bash
      sudo pmap -x 1234
    • 总内存使用量显示在最后一行。
  3. 分析服务日志

    • 如果某个服务占用大量内存,查看其日志文件是否存在异常(如无限循环、内存泄漏等)。
    • 示例:
      bash
      tail -f /var/log/service.log

2.4 检查内核参数与系统配置

  1. 检查系统是否限制了内存使用

    • 使用 ulimit 检查当前会话的内存限制:
      bash
      ulimit -a
    • 如果 max memory size 被限制,可能导致应用进程被杀。
  2. 检查 Swap 空间是否不足

    • 查看 Swap 空间:
      bash
      swapon --show
    • 如果 Swap 空间不足,可以增加:
      bash
      sudo fallocate -l 2G /swapfile
      sudo chmod 600 /swapfile
      sudo mkswap /swapfile
      sudo swapon /swapfile
  3. 检查内存分配策略(vm.overcommit_memory

    • 查看当前值:
      bash
      cat /proc/sys/vm/overcommit_memory
      • 0:内核自动决定是否允许分配内存(默认)。
      • 1:允许超量分配(可能导致 OOM)。
      • 2:严格检查,不允许分配超过实际可用内存。
    • 修改为更安全的值(如 0 或 2):
      bash
      echo 2 | sudo tee /proc/sys/vm/overcommit_memory

2.5 检查内存泄漏

  1. 检查服务是否存在内存泄漏

    • 运行时间长的服务(如 Java 应用、数据库)可能存在内存泄漏。
    • 使用 valgrindperf 对程序进行内存分析。
    • 示例:
      bash
      valgrind --leak-check=full /path/to/application
  2. 监控内存使用趋势

    • 使用工具(如 sarvmstat)定期记录内存使用情况:
      bash
      sar -r 1 10

3. 解决内存不足的方法

3.1 短期解决方案

  1. 手动释放缓存

    • 如果内存被缓存占满,可以释放:
      bash
      echo 3 | sudo tee /proc/sys/vm/drop_caches
    • 注意:缓存释放会对性能产生短暂影响。
  2. 重启高内存进程

    • 针对占用内存的服务,尝试重启:
      bash
      sudo systemctl restart <service_name>

3.2 长期优化方案

  1. 增加物理内存

    • 如果内存不足是常态,可以考虑升级服务器硬件。
  2. 增加 Swap 空间

    • 增加 Swap 空间缓解内存不足问题。
  3. 优化服务配置

    • 调整服务的内存限制(如 Java 的 -Xmx 参数)。
    • 优化数据库的内存使用(如 MySQL 的 innodb_buffer_pool_size)。
  4. 监控和报警

    • 部署内存监控工具(如 Prometheus + Grafana)设置内存使用报警。
  5. 调整 OOM Killer 策略

    • 优先保护关键服务:
      bash
      echo -17 > /proc/<PID>/oom_score_adj

4. 总结

排查 Linux 内存不足导致服务崩溃的步骤:

  1. 确认问题:使用 freetop 等工具查看内存使用情况。
  2. 定位原因:分析日志、查找高内存占用的进程。
  3. 检查系统配置:检查 Swap 空间、内核参数和服务配置。
  4. 短期解决:释放缓存、重启服务。
  5. 长期优化:增加内存、优化服务参数、部署监控。

通过系统性排查和优化,可以有效减少内存不足导致服务崩溃的风险。

http://www.vanclimg.com/news/3032.html

相关文章:

  • C++教程 4
  • 定位与专长的分野:ThingsBoard 物联网平台与 MyEMS 能源管理系统的深度对比
  • 总复习 1
  • INFINI Labs 产品更新 - Coco AI v0.7.0 发布 - 全新的文件搜索体验与全屏化的集成功能
  • Tita 项目管理,重塑广告行业执行路径
  • 探寻内核环境创建cgroup组的可行性
  • Flink的常用API
  • linux大磁盘(超过3T及以上)分区、格式化及挂载
  • 探索 LanceDB 在多种存储方案下的查询效率
  • 如何在FastAPI中让后台任务既高效又不会让你的应用崩溃?
  • 【OpenGL】ios_base::failbit set: iostream stream error
  • php8通过url获取飞书文档公开内容
  • 莫比乌斯反演
  • E. Light Up the Grid 题解
  • rust学习笔记之基础:智能指针和不安全的rust
  • C语言基础-跳转语句
  • MIT6.s081_Lab9
  • css 压缩字体文件
  • php-cs-fixer 集成 blade-formatter 来格式化 blade 模板
  • 2025/7/30 模拟赛总结
  • 73、把姓名转为一列
  • CRMEB会员电商系统集群部署实战:腾讯云镜像优化指南
  • 跨平台文件对比工具中的字体与布局兼容性问题深度解析
  • 5.2 表示程序性能
  • C语言基础-练习:九九乘法表
  • P12247 跳舞机(平衡树+动态规划)
  • 跨域问题处理
  • 15个好用的网络抓包工具,开箱即用
  • linux使用非交互的方式修改指定用户密码
  • 模拟赛day4题解