当前位置: 首页 > 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.dtcms.com/a/354398.html

相关文章:

  • LinuxC系统多线程程序设计
  • C语言:数据在内存中的存储
  • nginx referer-policy 和 referer
  • redis集群分片策略
  • 【温室气体数据集】NOAA CCGG 飞机观测温室气体
  • 2025年06月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • spring-cloud项目中gateway配置解析
  • DMA学习
  • 【0420】Postgres内核 smgr + md + vfd 实现为指定 table(CREATE TABLE)创建 disk file
  • 每日八股文8.27
  • Linux系统调优工具
  • [Sync_ai_vid] 数据处理流水线 | 配置管理系统
  • 【重学 MySQL】九十二、 MySQL8 密码强度评估与配置指南
  • mysql mvcc机制详解
  • 期权交易中的“道”:从《道德经》中汲取投资智慧
  • RHEL9部署MySQL数据库及数据库的基本使用(增删改查,数据备份恢复)
  • 基于SpringBoot的社区儿童疫苗接种预约系统设计与实现(代码+数据库+LW)
  • Vue将内容生成为二维码,并将所有二维码下载为图片,同时支持批量下载(下载为ZIP),含解决一次性生成过多时页面崩溃解决办法
  • 【雅思020】Opening a bank account
  • C语言二级考试环境配置教程【window篇】
  • 能源行业数据库远程运维安全合规实践:Web化平台的落地经验
  • 【系统分析师】高分论文:论快速应用开发方法及应用
  • Linux初始——基础指令篇
  • Libvio 访问异常排查指南​
  • List | 常见的List实现类(ArrayList、LinkedList、Vector)以及ArrayList源码解读
  • 【Redis】数据分片机制和集群机制
  • 8.28 模拟|双指针
  • 零基础-力扣100题从易到难详解(持续更新1-10题)
  • Windows 命令行:rmdir 命令
  • Qt 6 与 Qt 5 存在的兼容性差异