1. elasticsearch-运维-文件缓存
服务器上部署了ES5集群,通过zabbix监控发现cpu load呈锯齿状,且ES所在磁盘iops read和cpu load有一样的锯齿,可证明ES周期性的发生大量读磁盘操作。通过分析,ES周期性大量读磁盘是因为QA每10分钟发起搜索业务请求
此外,该机器上有marathon超卖内存的情况存在,当关闭超卖的服务时,iops read及cpu load监控正常
按理说QA监控发起的搜索请求不会亩旦昌变化,ES应该有索引文件缓存。所以首先分析ES索引文件缓存的情况
通过/proc/$pid/smaps可查看进程内存分布及映射情况,如下图所示,size表示通过mmap映射的文件的大小,Rss表示该文件mmap实际内存的大小,Pss表示当某个文件被多个进程同时使用时,平均每个进程占用的内存大小
写个脚本,分析一下文迟巧件缓存使用情况:
索引5s96iIBfS6KivdgDrb8u-Q映射文件大小为44.3g,实际占用物理内存838M,对比其他服务器同索引文件缓存使用情况发现,大于该机器占用的物理内存(2.1g 对比 838M)
通过监控ES进程的smaps文件发现当cpu飙升即搜索请求时,文件缓存占用高达2-3G,请求完成一段时间后文件缓存将至700-800M,此时可判定是因为文件缓存被系统踢掉导致频繁发生磁盘io
通过分析源码可知ES使用MMapDirectory打开索引文件,其内部FileProvider调用C库的mmap函数打开文件,所以是由系统托管文件缓存
为何操作系统会踢掉ES文件缓存?猜测是因为marathon超卖导致内存使用过多,操作系统需要回收文件缓存,而QA监控又是10分钟请求一次,导致ES无法持有文件缓存
通过调整操作系统内核参数vm.vfs_cache_pressure(100 => 80)来让操作系统尽量少回收文件缓存,调整后相关监控如下
ES节点内存维持较之前提升至少500M
通过监控分析smaps文件能获取各索引文件物理内存占用情况,发生堆外内存异常时可排查是哪些索引文件导致的,即可大致推断是什么业务什么类型的查迅扒询
heap内存可以使用jhat、jmap分析使用情况
匿名页缓存可在jvm启动参数加上-XX:NativeMemoryTracking=[off|summary|detail]后,通过jcmd $pid VM.native_memory detail分析
2. ES文件浏览器永久会员可以存储多少文件
最大256GB的储存空间。ES文件浏览器是一个能管理移动设备、局域网共享、远程FTP、蓝牙设备和云存储的系统工具类移动软件。不管是图片、音乐,还是视频、文档都能够统一管理,清楚明了的分类,超高的内存储存空间,让你手机文件不再乱七八糟。
3. Elasticsearch 能够存储的数据量一般有多大
单独看ES能玩多大数据意义不大,具体实践中往往因为各种业务要求而无法继续增加数据量。目大的方面考虑有如下几点:
1、查询速度。ES可以支持的查询类型多种多样,单一的term匹配,复杂的historm agg,甚至父子文档模式下bool查询之后继续做文本高亮,数据量越大查询时间越长。如果只是简单的把数据写进去然后按照ID获取数据,那就尽管往里面写数据吧。
2、写入速度。数据量越大,写入速度受影响的可能性越大。业务要求1小时的数据1小时内必须写完,如果做不到就得考虑分索引或者分集群了。
3、更新速度。同上,更新比单纯的写入操作更多,先get再merge再overwrite到es。
4、其他因素。
目前我遇到的ES集群,有1.5T-2T索引量的情况下,需要支持平均查询在500ms以内的高并发高亮查询。在我们的场景下这个量级不算小了。
4. es的三种缓存
也称filter cache,作用是对消碧一个查询中包含的过滤器执行结果进行缓存,满足了term, range过滤器的clause会被缓存(5.1.1版本term被 取消了 ),bool不会被缓配桥闹存,但是bool过滤器包含的子term会被缓存。
curl "http://$HOST/_nodes/stats/indices/query_cache,request_cache,fielddata?pretty&human"
当一个查询发送到es cluster的某个节点上时,这个节点会把该查询扩散分发到其余节点,并在相应分片上执行,将分片上执行的结果成为“本地结果集”。这些本地结果集最终会汇集到最初请求到达的那个协调节点,这些“分片级”的“本地结果集”会合并成“全局结果集“。query-and-fetch里面的query过程。request cache就是缓存这些”分片级本地结果集“的。但是request cache在每次refresh_interval后就会被清空,所以其生命培罩周期是一个refresh_interval。(个人感觉不需要开启)
field data与doc_values作用一样,都是让我们在inverted index倒排索引的基础上做aggregation统计、sort排序。