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

Linux 云服务器内存不足如何优化

第一步:全面诊断与监控 - 搞清楚“为什么不足”

在优化之前,必须先找到问题的根源。内存不足可能是真的不足,也可能是被缓存/缓冲占用了。

1. 使用 free -h 命令查看整体内存状况
$ free -htotal        used        free      shared  buff/cache   available
Mem:           7.6G        3.2G        200M         10M        4.2G        4.0G
Swap:          2.0G        1.5G        500M

关键指标解读:

  • used: 已使用的内存(包括应用程序和缓存)。

  • buff/cache: 被内核缓冲区(buffer)和页面缓存(cache)占用的内存。这部分内存在应用程序需要时可以被释放掉,所以通常不算“已用”

  • available: 估算的、可供应用程序使用的内存大小。这是最重要的指标! 如果 available 很小(例如小于总内存的10%),说明真实可用内存确实紧张。

  • Swap: 交换分区的使用情况。如果 Swap used 很高,说明物理内存已经不够用,系统开始使用磁盘作为虚拟内存,这会导致性能严重下降(磁盘I/O慢)。

2. 使用 top 或 htop 命令定位占用内存的进程
  • 运行 top

    1. 按下 Shift + M 来按内存使用率排序。

    2. 查看 %MEM 和 RES 列,找到占用内存最高的进程。

  • 推荐使用功能更强的 htop(如果没有,可通过 yum install htop 或 apt install htop 安装):

    • 界面更友好,直接支持鼠标点击列名排序。

3. 使用 vmstat 查看虚拟内存状态

bash

$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st2  0 1548324 234212  12344 4232112 0    0     5    12    3    2  8  3 88  1  0

关键指标解读:

  • swpd: 已使用的 swap 空间大小。

  • si (swap in): 每秒从磁盘读入到 swap 的数据量(kB/s)。如果大于0,说明正在从Swap换入内存。

  • so (swap out): 每秒从内存写入到 swap 的数据量(kB/s)。如果大于0,说明正在将内存换出到Swap。如果 si 或 so 持续大于0,则警告内存不足。

4. 其他诊断命令
  • ps aux --sort=-%mem | head -10: 列出前10个内存消耗进程。

  • cat /proc/meminfo: 查看更详细的内存信息。


第二步:根据诊断结果进行针对性优化

情况A:物理内存充足 (available 很大),但 Swap 被使用

这种情况通常是系统过于“积极”地将一些不常用的内存页换到了Swap。目标是将Swap中的内容换回来。

  1. 清理 Swap (临时方案)

    bash

    # 先禁用 Swap
    sudo swapoff -a
    # 再重新启用 Swap
    sudo swapon -a

    注意:这个操作会尝试将Swap中的数据全部写回内存。务必确保你的物理内存 free 空间足够容纳 swpd 的大小,否则可能导致系统崩溃或OOM Killer被触发。最好在物理内存空闲较多时操作。

  2. 调整 Swappiness 参数 (长期方案)
    Swappiness 值(0-100)决定了系统使用Swap的倾向程度。值越高,越积极使用Swap。

    • 查看当前值:cat /proc/sys/vm/swappiness (通常默认是60)

    • 临时调整为更低的值(如10):

      bash

      sudo sysctl vm.swappiness=10
    • 永久调整,编辑 /etc/sysctl.conf 文件,添加:

      text

      vm.swappiness = 10

      然后执行 sudo sysctl -p 使其生效。
      建议:对于追求性能的应用服务器(如MySQL,Redis),可以设置为 1-10。对于桌面系统,可以保留较高值。

情况B:真实可用内存 (available) 不足

这是最核心的问题,需要减少应用程序的内存占用。

  1. 优化应用程序配置

    • 这是最有效的方法! 找到占用内存最大的进程(如Java, Nginx, PHP, MySQL等),调整其配置。

    • Java应用: 调整JVM堆参数(-Xms-Xmx),不要设置得过大,留出空间给系统和堆外内存。

    • MySQL: 调整 innodb_buffer_pool_size,它通常是最大的内存消耗者,通常设置为物理内存的50%-70%,而不是90%。

    • Nginx: 调整 worker_processes 和 worker_connections。每个worker会消耗一定内存,数量不是越多越好。

    • PHP-FPM: 优化 pm(进程管理器)配置(如 pm.max_children)。过多的子进程是内存杀手。

  2. 停止或卸载不必要的服务和软件

    • 使用 systemctl list-unit-files --type=service | grep enabled 查看所有开机自启服务。

    • 使用 ps aux 或 htop 查看是否有非必要的进程在运行。

    • 用包管理器(yumapt)卸载用不到的软件。

  3. 清理页面缓存 (临时救急命令)

    bash

    # 这个命令可以释放 pagecache, dentries and inodes
    echo 3 | sudo tee /proc/sys/vm/drop_caches

    注意:这是一个临时救急方案,效果立竿见影但会降低系统性能(因为清理了能加速I/O的缓存),除非万不得已,否则不推荐在生产环境频繁使用。它只是腾出可用内存,并不能解决应用程序自身内存泄漏或配置不合理的问题。

  4. 杀死异常进程
    如果发现某个进程内存占用异常增长(可能是内存泄漏),尝试重启该服务。如果问题复现,需要联系开发者修复程序。

情况C:物理内存和Swap都严重不足

这是最糟糕的情况,系统可能会变得极其缓慢,并通过OOM Killer强制结束进程来保持运行。

  1. 增加Swap空间 (临时扩容)

    bash

    # 1. 创建一个2GB的Swap文件
    sudo fallocate -l 2G /swapfile
    # 如果 fallocate 不可用,可以用 dd: sudo dd if=/dev/zero of=/swapfile bs=1M count=2048# 2. 设置正确的权限
    sudo chmod 600 /swapfile# 3. 格式化为Swap文件
    sudo mkswap /swapfile# 4. 启用Swap文件
    sudo swapon /swapfile# 5. 让Swap文件永久生效,编辑 /etc/fstab,添加一行
    /swapfile none swap sw 0 0

    注意:Swap在磁盘上,速度很慢,这只是一个“续命”手段,不能替代物理内存。

  2. 终极方案:扩容升级
    如果以上所有优化手段都已尝试,但业务仍在增长,内存依然不足,那么最根本的解决方案就是给云服务器升级内存(扩容)。这是云平台的优势所在,通常可以在线完成。


总结与行动路线图

  1. 诊断先行:使用 free -hhtopvmstat 确定问题是“真不足”还是“假不足”。

  2. 优化配置首要任务是优化占用内存最大的应用程序的配置,这是性价比最高的做法。

  3. 调整系统:根据需求调整 swappiness,避免系统过度使用Swap。

  4. 清理精简:停止非必要服务,卸载无用软件。

  5. 临时手段:在紧急情况下,可以尝试手动清理缓存或临时增加Swap空间。

  6. 硬件升级:如果所有软优化都无法满足需求,果断进行硬件升级(增加内存)。

记住,监控是预防的关键。建议部署如 Prometheus + Grafana 或简单点的 Node Exporter 等监控工具,建立内存使用告警,以便在内存不足之前就能发现问题并介入处理。

http://www.xdnf.cn/news/1374049.html

相关文章:

  • 【RAG】使用llamaindex进行RAG开发
  • 6 种无需 iTunes 将照片从 iPhone 传输到电脑
  • TDengine IPv6 支持用户手册
  • “java简单吗?”Java的“简单”与PHP的挑战:编程语言哲学-优雅草卓伊凡
  • KDMS V4 重磅升级,智能迁移赋能国产化替代!
  • android证书相关
  • 像WPS Office 一样处理pdf页面尺寸
  • AI 解决生活小事 2——用 AI 做一回新闻播客
  • 使用人工智能写一个websocket聊天页面
  • PDF补丁丁:开源多年,完全免费的多功能 PDF 工具箱
  • Agno Agent​​
  • 如何借助文档控件 TX Text Control 轻松优化 PDF 文件大小?
  • 计算机视觉(三):opencv环境搭建和图片显示
  • 主键索引和普通索引的区别
  • 基于 Qt 实现的动态流程图画板框架设计与实现
  • 在Windows系统上升级Node.js和npm
  • FastAPI + SQLModel 从 0 搭到完整 CRUD
  • STL库——vector(类模拟实现)
  • skywalking 原理
  • 当AI有了温度,三星正在重新定义生活的边界
  • 技术分析 | Parasoft C/C++test如何突破单元测试的隔离难题
  • SyntaxError: Failed to execute ‘open‘ on ‘XMLHttpRequest‘: Invalid URL
  • 【C++】set 容器的使用
  • Android/Java中枚举的详解
  • 基于Spring Boot+Vue的生活用品购物平台/在线购物系统/生活用户在线销售系统/基于javaweb的在线商城系统
  • JMeter —— 压力测试
  • 基于 Docker Compose 的若依多服务一键部署java项目实践
  • C# OpenCVSharp 实现物体尺寸测量方案
  • 【Java】异常处理:从入门到精通
  • npm run start 的整个过程