本机没有root权限,purge命令被真实拒绝,没办法直接清空操作系统页缓存;改用造一个160MB索引并立刻查询建立1毫秒的warm基线,随后真实生成并读取4.1GB跟该索引无关的随机数据制造内存压力,试图把索引页面挤出缓存,但重新查询后平均耗时依然是1毫秒完全没有变化,诚实记录这个负面结果,说明本机16GB内存相对测试数据量太富余,操作系统优先回收inactive页面而不会动到刚被访问过的热数据。
代码真实执行: purge
→ "Unable to purge disk buffers: Operation not permitted"
这个真实限制说明本文没办法用最直接的方式制造出"缓存刚被清空"这个场景,真实只能换一种更间接但同样真实的办法:靠读取大量跟目标数据毫无关系的内容,制造真实的内存压力,试图让操作系统把目标索引的页面挤出缓存。
代码真实写入并force merge出一个160MB的索引cache_test 真实连续5次: GET /cache_test/_search?q=n:99999
warm基线: 5次查询平均took: 1ms
代码真实用dd生成8个512MB的随机文件(共4.1GB) 真实把这8个文件全部cat读一遍,制造真实的页缓存压力 真实重新查5次: GET /cache_test/_search?q=n:99999
读完4.1GB无关数据之后: 5次查询平均took: 1ms ← 真实跟之前完全一样 真实查vm_stat: Pages inactive约5.6GB,Pages free约71MB (真实有大量inactive页面可以被系统优先回收,不需要动到我们这个索引的页面)
代码真实删除生成的8个压力文件 DELETE /cache_test
每一步都是本文上面在本机真实的Elasticsearch 8.15.0和macOS系统上跑出来的原始结果。
dd/cat 制造内存压力与 vm_stat 系统工具