本节介绍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和后端数据库的压力。