Eviction
Evict的实质主要是将内存中的page淘汰出内存,简单来说,当cache里面的“脏页”达到一定比例或cache使用量达到一定比例时,wt就会触发相应的evict page线程来将pages(包含干净的pages和脏pages)按一定的算法(LRU队列)淘汰出去,以便腾挪出内存空间,保障后面新的插入或修改等操作。
这个流程中存在两个淘汰队列分别为待淘汰的填充队列(evict_fill_queue)和当前淘汰队列(evict_current_queue),evict会不断地将符合淘汰条件的page交替待淘汰queue,然后会从淘汰队列中将page淘汰出内存。待淘汰queue和当前淘汰queue角色会进行切换。
Evict有两种触发方式,一种是WiredTiger内部线程触发,另一种为用户操作(search/insert等)触发,这里我们将两者分别称为内部evict与外部evict,本文主要介绍内部evict。
首先来了解一下cache所管理的空间。
WT cache管理的空间就是内存page的内存空间,page的内存分为几部分:
- 从磁盘上读取到的已经刷盘的数据,即前文描述的dsk内存缓存。
- Page在内存中新增的修改事务数据。
- Page基本的数据结构所有的内存空间。
WT维护了每个page的内存总量,总的内存使用量mem_size,以及增删改造成的脏页数据总量dirty_mem_size。每次对页进行载入、增删改、分裂和销毁时对上面的数据做原子增加或者减少计数,这样可以精确计算到当前系统中WT引擎内存占用量。
那么结合cache所管理的空间,这里简要介绍page eviction相关的几个参数:
参数名称 | 默认配置值 | 含义 |
---|---|---|
eviction_target | 80 | 当cache使用量达到该百分比时触发内部evict,能够淘汰clean page |
eviction_trigger | 90 | 当cache使用量达到该百分比时触发内部或外部evict,能够淘汰clean page |
eviction_dirty_target | 5 | 当cac |