
最近在看服务器的监控数据,老遇到客户问我,这个内存使用率到底多少算正常?我发现很多人在这上面栽跟头,老觉得内存用高了就是不然后各种折腾,反而把事情搞砸了。 内存这玩意...
最近在看服务器的监控数据,老遇到客户问我,这个内存使用率到底多少算正常?我发现很多人在这上面栽跟头,老觉得内存用高了就是不然后各种折腾,反而把事情搞砸了。
内存这玩意儿,用得少也不行,用得太多了更不行。得找到一个平衡点,才算对路。今天我就把我平时怎么看这个事儿,给大家唠唠。
先说说为啥用得太少不行。
你有没有发现,有时候服务器挺突然就卡得不行,查来查去发现内存才用了30%?这你就得注意了。内存它不是你闲钱放银行里,不动白不动。它得干活,得存东西,得临时处理数据。特别是那些需要频繁读写、加载大量配置文件的应用,比如数据库、缓存服务这些,它们就需要把热点数据尽量放在内存里,这样访问速度才能快。

如果内存利用率老是趴在低位,说明说明你的应用没把内存用起来,或者说,它根本就没需要往内存里放多少东西。最直接的后果就是,每次要数据的时候,它都得去硬盘上磨蹭。硬盘能跟内存比速度吗?那是天壤之别。访问速度就慢了,用户体验就差了,这叫“慢”的锅,有的时候内存用少了也得背。
我还遇到过一个情况,有客户说自己的数据库性能不行,我一看,内存利用率才20%。我让他把数据库的缓存参数调高点,结果性能直接翻倍。这就说明,内存这东西,得给它活儿干,它才能发挥出价值。
那用得太多了?当然也不行。
这个大家都好理解。如果内存一上来就跑到90%以上,甚至接近100%,那基本就是危险信号了。操作系统它自己也需要内存空间来运行,它要调度进程、管理文件系统缓存、处理网络IO等等。如果你占用了绝大部分内存,系统留给自己的空间就很少了。这时候,一旦再来点新的请求,或者启动个新程序,它发现没地方放了,怎么办?只能把内存里一些不常用的数据写到硬盘的交换区(swap)里去。这个过程就叫“内存置换”。
内存置换是个很耗性能的操作。硬盘的速度比内存慢得多,一来一回,服务器就开始卡顿,甚至响应不过来,就是所谓的“晃动”(thrashing)。用户一访问,等半天没反应,这体验一下就崩了。
而且内存占满了,也容易导致系统不稳定。有时候,一个进程突然要申请一大块内存,结果发现没有了,直接就给你报个错,或者这个进程直接崩掉。如果这个进程刚好是你的核心业务进程,那整个服务基本就瘫痪了。
那啥才叫“正常”?
这个没有一个绝对的数字。关键看你的应用类型和业务需求。不过我一般遵循这么个大致的原则:
怎么判断?
我一般会结合几个指标来看:
1. 内存使用率本身: 这个不用说,最直观的。
2. Swap使用率: 这个很重要,一旦Swap开始动起来,就要警惕了。
3. IOPS(每秒输入输出操作数)和磁盘读写速度: 如果内存使用率高,同时伴随着IOPS暴涨,磁盘读写居高不下,那基本可以断定是内存不够,导致了频繁的磁盘交换。
4. 应用响应时间: 业务上直接体现出来的就是访问速度。如果内存利用率高,响应时间也在变长,那说明内存可能成了瓶颈。
5. 操作系统的负载(Load Average): 这个也能侧面反映系统忙碌程度,特别是当CPU负载不高但内存占用很高时,Load Average却很高,那往往也是内存压力大的表现。
再说说我最近踩的一个坑。
有个客户,服务器内存是16G,他一看监控,内存使用率常年85%以上,就觉得不对劲,把数据库的缓存调小了很多,结果性能直线下降。后来一查,他这个业务场景,需要缓存大量用户日志信息,16G内存刚好够用,而且他的Swap区基本没怎么动过,IO也正常。我跟他解释了半天,他才明白,他之前以为的“高”,人家系统运行得很“舒服”。
判断内存是否正常,不能只看一个数字,得结合业务场景、Swap区、磁盘IO、响应时间等等一起看。高了低了都不算绝对的好坏,得看是不是“合适”,是不是影响了业务的正常运行。