Ubuntu Server 20.04.5 LTS高负载与Cached Memory疑问求助
关于Linux系统Cached Memory及MySQL服务器负载问题的解答
一、Cached Memory是什么?
在Linux系统中,Cached Memory(缓存内存)是系统用来存储最近读取过的磁盘数据和文件元信息的内存区域。比如MySQL查询过的表数据、索引,或是系统读取的配置文件,都会被暂存在这里——下次再访问这些数据时,直接从内存读取,无需再读写磁盘,速度能提升几十上百倍。
它是Linux的“空闲内存利用机制”:系统不会让物理内存闲置,会把暂时未被进程占用的内存分配给缓存;当有进程需要内存时,系统会自动释放缓存空间供进程使用,无需手动干预。
二、大量内存被缓存是好是坏?
多数情况下是好事
- 对MySQL这类依赖磁盘IO的服务来说,缓存越多,意味着更多热点数据(高频查询的表、索引)能留在内存中,大幅减少磁盘读写次数,直接提升查询速度,降低CPU和磁盘负载。
- 你的服务器有190GB内存,系统用大量内存做缓存,本质是在高效利用硬件资源,避免内存浪费。
若伴随服务器负载极高,需警惕异常
如果缓存占用高的同时,CPU/磁盘负载飙高,要排查两种异常情况:
- 缓存命中率低:MySQL频繁访问的数据没被缓存住,或是缓存里堆积了大量冷数据,导致系统反复读写磁盘,缓存未起到实际加速作用。
- 内存不足引发的被动缓存:若系统实际内存不足,会出现交换内存(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%说明缓存未被高效利用。
- 针对MySQL 5.7及以下的查询缓存,执行
- 查看系统缓存状态:执行
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
相关产品推荐
相关产品推荐

