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

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

Linux 系统内存不足会导致服务崩溃、系统变慢甚至无法正常运行。以下是内存不足问题的详细排查方法,包括问题症状、原因分析及解决步骤。


1. 内存不足的常见症状

  1. 服务崩溃

    • 应用程序(如 Web 服务、数据库)无法正常运行,出现崩溃或拒绝服务。
    • 日志中可能提示 Out of MemoryKilled
  2. 系统性能下降

    • 系统响应缓慢,SSH 登录延迟高。
    • 执行命令时卡顿,例如 lstop
  3. 高 Swap 使用

    • 系统频繁使用交换分区(Swap),导致磁盘 IO 增加,性能大幅下降。
  4. 内存不足的系统日志

    • /var/log/messages/var/log/syslog 中,可能发现与内存不足相关的日志,例如:

      复制

      Out of memory: Kill process 12345 (my_service) score 1234 or sacrifice child
      Killed process 12345 (my_service) total-vm:123456kB, anon-rss:12345kB
      

2. 排查内存不足的原因

2.1 检查系统内存使用情况

  1. 查看内存和 Swap 使用情况

    • 运行以下命令:

      bash

      复制

      free -h
      
      输出示例:

      apache

      复制

                    total        used        free      shared  buff/cache   available
      Mem:           8.0G        7.5G        100M        300M        400M        150M
      Swap:          2.0G        1.8G        200M
      
      • used:已使用内存。
      • free:剩余内存。
      • Swap:交换分区使用情况。
  2. 分析内存分配

    • 查看内存是否被缓存占用(buff/cache)。
    • 如果 available 值非常低,说明内存不足。

2.2 找出内存占用高的进程

  1. 使用 top 命令

    • 运行以下命令:

      bash

      复制

      top
      
    • M 键,按照内存占用排序:
      • 找出内存占用最高的进程。
  2. 使用 ps 命令

    • 按内存排序列出进程:

      bash

      复制

      ps aux --sort=-%mem | head -n 10
      
      输出示例:

      apache

      复制

      USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
      root     12345  5.0 75.6 123456 654321 ?       S    10:00   5:00 java -Xmx4G myapp.jar
      
  3. 使用 smem 工具(更详细的内存分析)

    • 如果未安装,可以通过以下命令安装:

      bash

      复制

      sudo apt install smem       # Ubuntu/Debian
      sudo yum install smem       # CentOS/RHEL
      
    • 查看实际内存占用:

      bash

      复制

      smem -tk
      

2.3 检查系统日志

  1. 查看 OOM(Out of Memory)日志

    • 检查 /var/log/messages/var/log/syslog 中是否有 OOM 相关记录:

      bash

      复制

      grep -i "Out of memory" /var/log/messages
      grep -i "Out of memory" /var/log/syslog
      
  2. 查看被杀死的进程

    • 如果某些服务被系统内存管理器(OOM Killer)强制终止,日志中会提示被杀进程的名称和 PID。

2.4 检查系统内存泄漏

  1. 查找内存泄漏的进程

    • 如果某个进程的内存使用量不断增加,可能存在内存泄漏。
    • 使用 topps 命令定期查看内存增长趋势。
  2. 检查内核内存泄漏

    • 查看 slab 缓存是否异常增长:

      bash

      复制

      slabtop
      
    • 如果某些对象(如 dentryinode)占用大量内存,可能是内核内存泄漏。

2.5 检查缓存和缓冲

  1. 查看缓存占用情况

    • 缓存和缓冲区可能占用大部分内存,但这些内存是可释放的。
    • 使用 free -h 查看 buff/cache
  2. 清理缓存

    • 如果缓存占用过高,可以手动释放(谨慎操作):

      bash

      复制

      sudo sync
      sudo echo 3 > /proc/sys/vm/drop_caches
      

2.6 检查 Swap 使用

  1. 查看 Swap 使用情况

    • 如果内存不足,系统会使用 Swap 作为虚拟内存。
    • Swap 使用过高时,会导致性能下降(磁盘 IO 增加)。
    • 运行以下命令查看:

      bash

      复制

      swapon --show
      
  2. 增加 Swap 空间

    • 如果 Swap 空间不足,可以扩展 Swap 分区:

      bash

      复制

      sudo fallocate -l 2G /swapfile
      sudo chmod 600 /swapfile
      sudo mkswap /swapfile
      sudo swapon /swapfile
      

3. 解决内存不足问题的方法

3.1 优化服务配置

  1. 调整服务的内存限制

    • 检查服务的配置文件,调整内存占用的限制。
    • 例如,优化 Java 应用的最大堆内存:

      bash

      复制

      java -Xmx2G -Xms1G -jar myapp.jar
      
  2. 限制进程的内存使用

    • 使用 ulimit 命令限制单个进程的内存占用:

      bash

      复制

      ulimit -v [memory_limit_in_kb]
      

3.2 增加系统内存

  • 如果系统物理内存不足,可以通过以下方式增加:
    • 升级服务器:增加物理内存(RAM)。
    • 增加 Swap:扩展虚拟内存缓解压力。

3.3 优化系统配置

  1. 调整 OOM Killer 优先级

    • 配置某些关键服务不被 OOM Killer 优先杀死:

      bash

      复制

      echo -17 > /proc/<PID>/oom_score_adj
      
  2. 优化内存管理参数

    • 调整虚拟内存的触发阈值:

      bash

      复制

      sysctl vm.swappiness=10
      

3.4 清理系统资源

  1. 清理无用的进程

    • 使用 killpkill 终止占用内存过高的非必要进程:

      bash

      复制

      kill -9 <PID>
      
  2. 卸载无用服务

    • 停止和卸载占用内存的无用服务:

      bash

      复制

      systemctl stop [service_name]
      systemctl disable [service_name]
      

3.5 使用监控工具

  1. 实时监控内存使用

    • 部署监控工具(如 Zabbix、Prometheus、Grafana)跟踪内存使用情况。
  2. 设置报警机制

    • 配置内存使用超过阈值时触发报警,提前发现问题。

4. 总结

排查 Linux 系统内存不足的流程如下:

  1. 检查内存和 Swap 使用情况:使用 freetop 查找问题根源。
  2. 定位占用内存的进程:使用 pssmem 找出高内存占用进程。
  3. 分析日志信息:检查 OOM Killer 是否终止了关键服务。
  4. 优化系统和服务:调整服务配置、增加内存或清理无用进程。
  5. 部署监控工具:持续监控和优化系统资源使用。

通过合理的排查和优化,可以有效解决内存不足导致的服务崩溃问题,并提升系统稳定性和性能。

http://www.dtcms.com/a/350415.html

相关文章:

  • 跨站脚本攻击(XSS)分类介绍及解决办法
  • 单北斗变形监测系统应用维护指南
  • 59 C++ 现代C++编程艺术8-智能指针
  • 探索量子计算的新前沿
  • 深度学习之第三课PyTorch( MNIST 手写数字识别神经网络模型)
  • Telematics Control Unit(TCU)的系统化梳理
  • 从零开始学习单片机14
  • Fory序列化与反序列化
  • 以正确方式构建AI Agents:Agentic AI的设计原则
  • 技术速递|使用 AI 应用模板扩展创建一个 .NET AI 应用与自定义数据进行对话
  • 【Hadoop】HDFS 分布式存储系统
  • Nuxt.js@4 中管理 HTML <head> 标签
  • 【二叉树 - LeetCode】236. 二叉树的最近公共祖先
  • TAISAW钛硕|TST嘉硕Differential output Crystal Oscillator - TW0692AAAE40
  • [electron]开发环境驱动识别失败
  • 深度学习篇--- ResNet-18
  • ArXiv 每日论文追踪器:自动检索、双语总结、邮件推送、一键建站
  • QML 中 的 Row 和 RowLayout
  • (一)C#基础(异步)
  • 数字图像处理(二)
  • 面向机器人推动与抓取任务自适应算法研究
  • langchain的简单应用案例---(2)使用Memory实现一个带记忆的对话机器人
  • 工作记录 2015-10-29
  • 销售额和营业收入的区别在哪?哪个值应该更大一些?
  • 新项目,如何做成本估算?
  • 本地缓存与 Redis 缓存的区别与实际应用
  • 【OpenAI】ChatGPT-4o-latest 真正的多模态、长文本模型的详细介绍+API的使用教程!
  • 2025软件测试面试题(持续更新)
  • 07-JUnit测试
  • ubuntu 卡到登录页面进不去--实测