当前位置:首页 > 问答 > 正文

Redis跑得快了,想着给机器加内存扩容试试看效果咋样

这事儿得从我们用的那个Redis服务器说起,这Redis吧,在我们这儿就是个宝贝疙瘩,好多关键的地方都指着它呢,比如存用户的登录状态啊,缓存一些热点数据让网站打开快点啊,都离不开它,一开始数据量小,给它配的内存也够用,跑得嗖嗖的,大家相安无事。

可后来业务量上来了,数据越存越多,慢慢地就感觉它有点“喘”了,最明显的信号就是监控图上,那个代表内存使用率的曲线,眼瞅着就从原来的半山腰,一路攀升到了接近山顶的位置,经常在百分之八九十那儿晃悠,看着都让人揪心,业务那边就开始偶尔反馈,说有些操作偶尔会变慢,特别是到了晚上高峰时段,能明显感觉到那么一卡一顿的。

Redis跑得快了,想着给机器加内存扩容试试看效果咋样

我们几个人就凑一块儿商量对策,有人提议说,要不要搞个Redis集群,把数据分到不同的实例上去,这样压力就分散了,这主意听着是挺专业的,但一琢磨,动静太大了,得改代码里的连接方式,还得重新规划数据分布,测试起来也是个浩大工程,远水解不了近渴。

这时候,有个哥们儿就说了句大实话:“我看呐,现在这情况就像是小马拉大车,车太重了,马累得够呛,咱们先别整那些复杂的,最直接的办法不就是换匹大马吗?给它加内存!反正现在服务器还有空余的内存插槽,加一下试试看效果咋样,立竿见影。” 他一说完,我们都觉得有道理,加内存这事儿,物理操作简单,就是买来内存条,关机插上去再开机,软件配置基本不用动,对现有系统几乎没影响,风险相对小,就算效果不理想,这内存以后也能用在别处,不浪费。

Redis跑得快了,想着给机器加内存扩容试试看效果咋样

说干就干,我们走了采购流程,买了跟原来型号匹配的内存条,挑了个半夜用户最少的时间段,吭哧吭哧地把服务器停了,把新内存给装了上去,开机一看,系统识别没问题,总内存容量确实翻了一倍还多,然后启动Redis服务,心里还挺期待的,就像给一台老电脑升级之后,迫不及待想看看开机速度是不是快了一样。

刚开始那一两天,我们紧盯着监控,最直观的变化就是内存使用率那个指标,“唰”地一下就降下来了,从原来逼近危险线的90%多,直接掉到了40%左右,一下子宽敞多了,看着就舒服,就好像一个原来塞满了杂物的房间,突然清理掉了一大半,空间立马就出来了。

Redis跑得快了,想着给机器加内存扩容试试看效果咋样

那跑得快了的感受明不明显呢?实话实说,并不是那种“脱胎换骨”、“飞一般的感觉”,因为之前Redis本身也没有完全卡死,只是在高负载时有延迟,加了内存之后,最明显的改善是“平稳”了,我们再看监控图表,之前高峰时段那些偶尔冒出来的响应时间“尖刺”(就是突然变慢的那个点),现在少了很多很多,曲线变得平缓了,业务那边后来也反馈,说那种偶尔的卡顿感确实基本消失了,操作起来顺溜了不少。

我琢磨着这个道理也挺简单的,原来内存紧张的时候,Redis可能就得频繁地在自己有限的房子里倒腾东西,把一些暂时不用的数据清理掉(就是它内部的淘汰机制),为新的数据腾地方,这个倒腾的过程本身也是要消耗资源的,尤其是在需要紧急清理空间的时候,就可能引起短暂的停顿,现在内存大了,房子宽敞了,它能很从容地存放更多数据,这种频繁的、紧急的“大扫除”就少多了,所以整体表现就更稳定、更流畅。

我们也清楚,加内存不是万能药,它解决了“空间不足”导致的瓶颈,但如果瓶颈出在CPU处理能力上,或者网络带宽上,那加再多内存也没用,这就好比是高速公路,加内存像是加宽了车道,车流量大时不堵了;但要是收费站(CPU)就只有一个窗口,或者路口的匝道(网络)太窄,车还是快不起来,对我们当前的情况来说,主要矛盾就是“内存不足”,所以这一招算是用对了地方。

总结一下这次经历吧:给Redis加内存扩容,对于我们这种因为数据增长导致内存紧张的场景,效果是实实在在的,它可能不会带来极限速度的巨幅提升,但能非常有效地消除因内存压力产生的性能波动和延迟毛刺,让服务变得更稳定、更平滑,算是一个投入不大、操作简单、见效挺快的优化手段,以后要是内存使用率再慢慢涨上来,到了又一个临界点,我们估计还得考虑更彻底的方案,比如之前提到过的集群化,但眼下,加了内存,起码又能安稳一阵子了。