You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu Server 20.04.5 LTS高负载与Cached Memory疑问求助

关于Linux系统Cached Memory及MySQL服务器负载问题的解答

一、Cached Memory是什么?

在Linux系统中,Cached Memory(缓存内存)是系统用来存储最近读取过的磁盘数据和文件元信息的内存区域。比如MySQL查询过的表数据、索引,或是系统读取的配置文件,都会被暂存在这里——下次再访问这些数据时,直接从内存读取,无需再读写磁盘,速度能提升几十上百倍。

它是Linux的“空闲内存利用机制”:系统不会让物理内存闲置,会把暂时未被进程占用的内存分配给缓存;当有进程需要内存时,系统会自动释放缓存空间供进程使用,无需手动干预。

二、大量内存被缓存是好是坏?

多数情况下是好事

  • 对MySQL这类依赖磁盘IO的服务来说,缓存越多,意味着更多热点数据(高频查询的表、索引)能留在内存中,大幅减少磁盘读写次数,直接提升查询速度,降低CPU和磁盘负载。
  • 你的服务器有190GB内存,系统用大量内存做缓存,本质是在高效利用硬件资源,避免内存浪费。

若伴随服务器负载极高,需警惕异常

如果缓存占用高的同时,CPU/磁盘负载飙高,要排查两种异常情况:

  1. 缓存命中率低:MySQL频繁访问的数据没被缓存住,或是缓存里堆积了大量冷数据,导致系统反复读写磁盘,缓存未起到实际加速作用。
  2. 内存不足引发的被动缓存:若系统实际内存不足,会出现交换内存(swap)频繁使用的情况,此时缓存会被挤压,进程因内存不足频繁等待,进一步推高负载。

三、负载极高时的排查与解决办法

1. 先确认缓存的实际作用

  • 查看MySQL缓存命中率:
    • 针对MySQL 5.7及以下的查询缓存,执行SHOW GLOBAL STATUS LIKE 'Qcache%';,Qcache_hits / (Qcache_hits + Qcache_inserts)的比值越高越好;
    • 查看InnoDB缓冲池命中率,用公式(1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests)) * 100计算,命中率低于95%说明缓存未被高效利用。
  • 查看系统缓存状态:执行free -h,关注buff/cache和available列——如果available内存充足,说明缓存是正常利用;如果available接近0且swap使用率高,说明内存真的不足。

2. 针对性优化措施

MySQL层面优化

  • 调整InnoDB缓冲池大小:将innodb_buffer_pool_size设为物理内存的70%-80%(你的服务器可设为130-150GB),让MySQL把更多热点数据存在自身缓冲池,减少系统缓存的压力。
  • 优化慢查询:开启慢查询日志(slow_query_log = ON),找出耗时久的SQL,通过添加索引、改写SQL(避免全表扫描、减少JOIN次数)降低查询开销。
  • 清理无效缓存:针对MySQL 5.7及以下的查询缓存,可执行FLUSH QUERY CACHE;清理无效缓存,但不要频繁操作。

系统层面优化

  • 临时释放无用缓存:若缓存堆积大量冷数据,可执行echo 3 > /proc/sys/vm/drop_caches(需root权限),但这只是临时办法,系统会很快重新缓存数据,治标不治本。
  • 关闭闲置服务:检查服务器上的闲置后台服务、定时任务,关闭后释放内存和CPU资源。
  • 监控swap使用:若swap使用率超过30%,说明内存不足,可选择升级内存,或调整MySQL配置减少内存占用(比如降低连接数、调整临时表大小)。

3. 长期监控

  • 用top、htop实时查看CPU、内存、磁盘IO变化,定位负载高的来源是MySQL还是其他进程。
  • 用iostat查看磁盘读写状态,如果%util接近100%,说明磁盘IO是瓶颈,可考虑更换SSD或配置RAID。

内容的提问来源于stack exchange,提问作者JuJu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:36:25