DCache-CacheServer分析(七)

本节介绍CacheServer中的另一个线程-EraseThread,该用于定期清理数据,以防止(申请的)内存使用率过高、导致不可写的情况。

EraseThread

功能:定时作业,淘汰冷数据。

用途:当某个表在内存中的数据量不断增大、使用的内存超过申请内存的一定比率时,会启动清理线程,将最近最少使用的数据从内存中清理掉防止共享内存满导致不可写的情况。启用这个功能可以保证DCache的可用性。

对应文件:

EraseThread.h

EraseThread.cpp

配置信息

#是否允许淘汰数据

EnableErase=Y

#每次淘汰数据的时间间隔(秒)

EraseInterval=5

#开始淘汰数据的比率(已用chunk/所有chunk数据块*100)

EraseRadio=95

#淘汰线程数量

EraseThreadCount=2

#每次淘汰数据记录限制

MaxEraseCountOneTime=500

重点参数说明:

  • EnableErase,这是启用“淘汰冷数据”的开关,在TarsWeb控制台上可以直接操作,除非有特殊需求,否则不建议关闭;
  • EraseRadio,开始淘汰数据的比率,可以理解为这个表使用的内存量超过这个比率时,就进行清理。这里比率的计算是通过内存块(chunk)来计算的。当删除到比率 EraseRadio 后,不再删除冷数据;下一个周期(EraseInterval)继续判断执行。
  • EraseThreadCount(淘汰线程数量)和MaxEraseCountOneTime(每次淘汰数据记录限制)这2个参数需要根据内存占用的增长速度和主机cpu的压力灵活调整。

线程逻辑

这个线程是个定时任务,处理流程也比较简单:

1.启动EraseThreadCount个清理冷数据线程,执行 EraseThread::EraseData(这是清理冷数据的核心处理函数);

2.判断EnableErase开关是否开启:如果没开启则睡眠;如果开启了则进入3;

3.冷数据的索引按照线程数取模进行处理,每个线程只处理自己的数据,互不影响;

4.判断擦除比率是否超过阈值EraseRadio,如果未超过则进入休眠;如果超过比率,则进入4;

5.执行擦除数据(g_HashMap.erase);

6.如果本次擦除了数据,则立即下一次擦除;如果已没有数据可擦除,则休眠EraseInterval秒。


写在最后

本节介绍CacheServer中的定期清理数据这个线程(EraseThread),以防止申请的内存使用率过高、导致DCache不可用的情况。

对于2B的系统,在系统建设初期,我们都会预估系统未来3-5年的数据承载量,据此来向甲方申请资源。理论上只要内存申请的足够大、内存告警(如内存使用率超过80%、内存在30分钟内的增长速率超过5%就触发告警)后及时人为介入扩容,那么清理冷数据这个功能就不会用到。这只是画龙点睛之笔。

但是对于2C的系统,对资源要求很严格,而且用户量的增长不受控制,这个功能的作用尤为重要,可以保证系统服务的连续性。但当出现了数据淘汰时,还是建议对这个表扩容,以减轻Dcache和后端数据库的压力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员柒叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值