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

Linux设备内存不足如何处理

[root@localhost ~]# free -mtotal        used        free      shared  buff/cache   available
Mem:           31208       14317        1280        1551       15610       14657
Swap:          15927        2781       13146
[root@localhost ~]#

free -m 输出来看,当前系统并非物理内存完全耗尽(物理内存 free 为 1280MB,available 为 14657MB),但存在「内存使用偏高、空闲内存较少」的情况。核心原因是 Linux 会主动利用空闲内存作为 buff/cache(缓存文件/目录元数据、磁盘读写数据)以提升性能,因此需先区分「真实内存不足」和「缓存占用过高」,再针对性处理。

一、先理解当前内存状态(关键指标解读)

指标数值(MB)含义解读
total31208物理内存总大小(约 30.5GB)
used14317已被进程实际占用的内存(不含缓存)
free1280完全空闲的内存(未被任何进程/缓存使用)
buff/cache15610缓存(page cache)+ 缓冲区(buffer),可被内核主动回收(不影响进程)
available14657真正可分配给新进程的内存(= free + 可回收的 buff/cache),当前充足
Swap used2781已使用的交换分区(约 2.7GB),说明部分内存数据已交换到磁盘(需关注)

二、分场景处理方案

场景1:临时释放缓存(buff/cache 占用过高,需快速腾内存)

Linux 的 buff/cache 是「可回收资源」,当系统需要内存时内核会自动回收,但也可手动触发释放(无风险,不影响运行中进程)。

执行以下命令释放缓存(需 root 权限):

# 1. 释放页缓存(page cache,最主要的缓存类型)
echo 1 > /proc/sys/vm/drop_caches# 2. 释放页缓存 + 目录项缓存(dentries)+ inode 缓存
echo 2 > /proc/sys/vm/drop_caches# 3. 释放所有可回收缓存(推荐,释放最彻底)
echo 3 > /proc/sys/vm/drop_caches

执行后再次用 free -m 查看,会发现 free 内存增加,buff/cache 减少(例如从 15GB 降至几 GB)。

场景2:排查高内存占用进程(找到“内存大户”)

used 内存持续过高(如超过 80%),需定位具体是哪些进程消耗内存,判断是否为异常占用(如内存泄漏、不合理的进程配置)。

步骤1:查看进程内存占用(按内存使用率排序)
# 方法1:用 top 实时查看(按「M」键切换为内存使用率排序)
top# 方法2:用 ps 输出详细内存占用(按 %MEM 降序,显示前20个进程)
ps -aux --sort=-%mem | head -n 20
关键指标解读(ps 输出中):
  • %MEM:进程占用的物理内存百分比(核心参考);
  • VSZ:进程虚拟内存大小(含共享库、交换区,参考意义低);
  • RSS:进程实际占用的物理内存大小(不含缓存,真实内存消耗)。
处理高内存进程:
  1. 正常进程(如数据库、应用服务)
    若进程内存增长合理(如 MySQL 缓存数据),可检查其配置是否过高(例如 JVM 的 -Xmx 设太大、MySQL 的 innodb_buffer_pool_size 超过物理内存 50%),适当下调配置(需重启进程生效)。

  2. 异常进程(如无名进程、内存泄漏进程)
    若进程无正常用途(如僵尸进程、恶意进程),或内存持续增长不释放(内存泄漏),可先尝试优雅停止(如 systemctl stop 服务名),若无法停止则强制杀死(kill -9 进程PID),并排查进程来源(避免再次启动)。

场景3:优化交换分区(Swap)使用

当前 Swap 已使用 2.7GB,若物理内存仍充足却频繁使用 Swap,会导致系统性能下降(磁盘速度远慢于内存),需调整内核参数减少 Swap 依赖。

1. 查看当前 Swap 使用率和内核参数
# 查看 Swap 详细使用(哪些进程用了 Swap)
for i in $(cd /proc; ls -d [0-9]*); do echo -n "$i "; grep VmSwap /proc/$i/status 2>/dev/null; done | sort -k 2 -n -r | head -n 10# 查看内核 Swap 调整参数(swappiness)
cat /proc/sys/vm/swappiness
  • swappiness 含义:内核使用 Swap 的倾向,取值 0-100(值越高越容易用 Swap);
    推荐设置:物理内存充足时设为 10-20(减少 Swap 使用),内存紧张时设为 50-60。
2. 临时调整 swappiness(重启后失效)
echo 10 > /proc/sys/vm/swappiness
3. 永久调整 swappiness(重启生效)

编辑 /etc/sysctl.conf 文件,添加或修改以下行:

vim /etc/sysctl.conf
# 添加:
vm.swappiness = 10# 生效配置
sysctl -p
场景4:长期优化(避免内存不足反复出现)
  1. 升级物理内存(根本方案)
    若系统长期 available 内存低于 20%,且高内存进程是业务必需(如大数据服务、多虚拟机),建议增加物理内存(如从 32GB 升级到 64GB),这是最彻底的解决方式。

  2. 优化应用配置(减少不必要的内存占用)

    • 对于 Java 应用:调整 JVM 参数(-Xms 初始堆、-Xmx 最大堆),避免堆内存设太大导致浪费(例如 32GB 内存的机器,-Xmx 建议不超过 16GB);
    • 对于数据库(MySQL/MongoDB):缓存参数(如 innodb_buffer_pool_size)建议设为物理内存的 40%-50%(避免独占过多内存);
    • 对于Web服务(Nginx/Apache):限制并发进程/线程数(如 Nginx 的 worker_processes 设为 CPU 核心数,避免过多进程占用内存)。
  3. 清理无用进程/服务
    检查系统中是否有长期闲置的服务(如 postfixtelnet、无用的监控插件),停止并禁用其开机启动:

    # 查看开机启动服务
    systemctl list-unit-files --type=service | grep enabled# 停止并禁用无用服务(例如禁用 postfix)
    systemctl stop postfix
    systemctl disable postfix
    
  4. 监控内存变化(提前预警)
    nmonglancesprometheus + grafana 搭建内存监控,当 available 内存低于 10% 时触发告警,避免内存耗尽导致进程崩溃。

三、注意事项

  1. 不要盲目关闭缓存buff/cache 是 Linux 提升磁盘性能的关键,手动释放后若系统再次读写磁盘,缓存会重新增长(属于正常现象),无需频繁释放;
  2. 谨慎使用 kill -9:强制杀死进程可能导致数据丢失(如未保存的数据库事务),优先尝试优雅停止(如 kill 进程PID 或服务管理命令);
  3. Swap 并非越多越好:交换分区过大(如超过物理内存 2 倍)会导致系统过度依赖磁盘,反而降低性能,建议根据实际内存需求设置(一般为物理内存的 1-1.5 倍)。

通过以上步骤,可先临时释放缓存缓解内存压力,再定位高内存进程并优化配置,最终结合长期监控和硬件升级,彻底解决 Linux 内存不足问题。


文章转载自:

http://KOD2tTSm.nqLkb.cn
http://vPpo0gQw.nqLkb.cn
http://N17a4lfD.nqLkb.cn
http://lhdTBHYn.nqLkb.cn
http://onmGuhAJ.nqLkb.cn
http://J67baH6G.nqLkb.cn
http://lNOGGcPD.nqLkb.cn
http://Ps1awLGg.nqLkb.cn
http://5wBiJ5Hr.nqLkb.cn
http://b1W7mQwa.nqLkb.cn
http://0TeAuSbU.nqLkb.cn
http://N69PAgno.nqLkb.cn
http://5uQPCT6I.nqLkb.cn
http://uPW2ysJT.nqLkb.cn
http://Q07ftsH3.nqLkb.cn
http://bVrQLADN.nqLkb.cn
http://OTMr5nWB.nqLkb.cn
http://t4rfTi1P.nqLkb.cn
http://iat08ZKy.nqLkb.cn
http://xDcYFwFq.nqLkb.cn
http://2pZcbShU.nqLkb.cn
http://ad9FcLGw.nqLkb.cn
http://w3zcp29f.nqLkb.cn
http://zMuPkwvq.nqLkb.cn
http://yH1hUoBi.nqLkb.cn
http://yIMSOzyA.nqLkb.cn
http://T4XJks6K.nqLkb.cn
http://HNjuSgf9.nqLkb.cn
http://0j9nhWTF.nqLkb.cn
http://8Q5hC2rx.nqLkb.cn
http://www.dtcms.com/a/372807.html

相关文章:

  • 【JavaSE】复习总结
  • uview使用u-popup组件当开启遮罩层禁止下层页面滚动。uniapp弹框禁止页面上下滚动。
  • 爱普生喷墨打印机所有指示灯同时闪烁,不工作,怎么解决?
  • 这是一款没有任何限制的免费远程手机控制手机的软件
  • 【LCA 树上倍增】P9245 [蓝桥杯 2023 省 B] 景区导游|普及+
  • 【计算机网络】计算机网络英文名词速查
  • C++之queue类的代码及其逻辑详解
  • 36.Java序列化与反序列化是什么
  • 进阶向:HTTP性能优化实战
  • 对计算机网络模型的理解
  • 【Linux】MySQL数据目录迁移步骤(含流程图踩坑经验)
  • LangChain: Evaluation(评估)
  • 在电路浪涌测试中,TVS(瞬态电压抑制二极管)的防护效果确实会受到陪测设备中去耦网络(Decoupling Network,DN)的显著影响
  • 深入了解linux系统—— 日志
  • 3D开发工具HOOPS助力造船业数字化转型,打造更高效、更智能的船舶设计与协作!
  • 大语言模型时代文本水印技术的综述解读
  • 《WINDOWS 环境下32位汇编语言程序设计》第13章 过程控制(2)
  • 1. 统计推断-基于神经网络与Langevin扩散的自适应潜变量建模与优化
  • STM32U575RIT6 简单代码(参考模板)
  • 在新发布的AI论文中 pytorch 和tensorflow 的使用比例
  • Chapter3—单例模式
  • k8s可视化的解决方案及技术选型
  • K8s Ingress Annotations参数使用指南
  • Kubernetes(K8S)入门以及命令指南
  • 自建prometheus监控腾讯云k8s集群
  • Go 1.25在性能方面做了哪些提升?
  • Next.js数据获取入门:`getStaticProps` 与 `getServerSideProps`
  • 为什么要在出口路由器router配置NAT与默认路由
  • 如何 正确使用 nrm 工具 管理镜像源
  • http response的工作流程详细解析