技术标签: jvm java elasticsearch ELK
原文网址:Elasticsearch--解决JVM 堆内存使用率很高的问题_IT利刃出鞘的博客-程序员宅基地
说明
本文介绍如何解决ES的JVM 堆内存使用率很高的问题。
官网网址
https://www.elastic.co/guide/en/elasticsearch/reference/current/size-your-shards.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/fix-common-cluster-issues.html
高 JVM 内存使用率会降低集群性能并触发断路器错误(导致内存熔断)。
为了防止这种情况发生,如果节点的 JVM 内存使用率持续超过 85%,官方建议采取措施降低内存压力。
借助:node stats API 进行排查
GET _nodes/stats?filter_path=nodes.*.jvm.mem.pools.old
结果
{
"nodes": {
"J2-fr3wzSqqJk9cwoi2urw": {
"jvm": {
"mem": {
"pools": {
"old": {
"used_in_bytes": 179796016,
"max_in_bytes": 1798569984,
"peak_used_in_bytes": 179796016,
"peak_max_in_bytes": 1798569984
}
}
}
}
}
}
}
堆内存使用率为:used_in_bytes / max_in_bytes = 179796016/ 1798569984 = 9.99 6%,接近 10%。
能和 kibana 可视化监控结果保持一致:
随着内存使用量的增加,垃圾收集变得更加频繁并且需要更长的时间。
你可以在 elasticsearch.log 中跟踪垃圾收集事件的频率和时长。
例如,以下事件表明 Elasticsearch 在过去 40 秒中花费了超过 50%(21 秒)执行垃圾收集。
[timestamp_short_interval_from_last][INFO ][o.e.m.j.JvmGcMonitorService] [node_id] [gc][number] overhead, spent [21s] collecting in the last [40s]
关于分片的几点认知:
第一:搜索请求是以分片为单位发起的。
至少 7.16 版本之前是,如下图示更能说明问题:
这暗示了什么?
必然是:分片越多,检索越慢。
因为:跨大量分片的搜索可能会耗尽节点的搜索线程池,这可能导致吞吐量低和搜索速度慢。
第二:每个索引和分片都有内存和 CPU 开销。
每个索引和每个分片都需要一些内存和 CPU 资源。
在大多数情况下,一小组大分片比许多小分片使用更少的资源。
为什么呢?解释一下:
第三:Elasticsearch 会在相同角色的节点间平衡分片。
节点角色划分是 7.x 高版本新的节点定义方式,其目的是:节点用途更明确。
当添加新节点或某节点出故障时,Elasticsearch 会自动在相同角色层的剩余节点之间重新平衡索引的分片。
关于减少分片数,更确切的是如何合理规划分片,官方建议如下:
PUT my_index_001/_settings
{
"index": {
"routing.allocation.total_shards_per_node": 5
}
}
复杂搜索会占用大量的内存空间。建议启用:慢日志进行排查。
导致内存使用率飙升的复杂查询,通常具备如下的特点:
为避免复杂查询,常规措施如下:
PUT _settings
{
"index.max_result_window": 5000
}
PUT _cluster/settings
{
"persistent": {
"search.max_buckets": 20000,
}
}
PUT _cluster/settings
{
"persistent": {
"search.allow_expensive_queries": false
}
}
定义过多的字段或嵌套过深的字段会导致使用大量内存,出现“Mapping 爆炸" 现象。
为防止“Mapping 爆炸“,使用映射限制设置来限制字段映射的数量。
PUT my_index_001/_settings
{
"index.mapping.total_fields.limit": 100
}
更多类似参数,见官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-settings-limit.html
批量请求虽然比单个请求更有效,但大批量写入(以 bulk 操作为代表)或多搜索请求(以 _msearch 为代表)仍然会产生较高的 JVM 内存压力。
如果可能,提交较小(小是个相对值,需要根据集群性能测算出适合自己集群的经验值)的请求并在它们之间留出更多时间时隔。
繁重的写入操作和搜索负载过重均会导致高 JVM 内存压力。
为了更好地处理繁重的工作负载,在其他方法都不灵的情况下,可以考虑通过为节点内存扩容以达到升级节点目的。
这是无法之法,这是万能之法。
文章浏览阅读1.4k次,点赞5次,收藏39次。本文章为Java Swing的笔记分享,这一篇就够了_黑马程序员awt代码
文章浏览阅读2.5k次,点赞26次,收藏24次。一.简介1.概念:集成(简称:IDE;英文名:Integrated Development Environment )是用于提供程序开发环境的,一般包括编辑器、和等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。具备这一特性的软件或者软件套(组)都可以叫集成开发环境。不理解的小朋友也没事的,就一句话总结:IDE就是可以给我们提供很多必要工具,把一堆工具集成起来,变成了一个软件,我们可以在上面开发各种程序。可以类比成一个医药箱~~~2.举例:如的系列等。_ide
文章浏览阅读55次。原文地址:http://www.cnblogs.com/Twisted-Fate/p/4915184.html最近公司app由于疏忽审核被拒绝了,但是计划是最近两天上线时间紧急,希望能快速审核上线,了解到淘宝里面有加速商店,但是价格真是黑心,首次上线12000元,APP若已经上线的更新5999,据网上了解他们也是编写加急理由,已经无法忍受这种坑爹的赚钱方式,总结了一些加急经历的给与建议,..._加急审app
文章浏览阅读2.1k次。linux 中的source命令source命令是bash中的内建命令,它等同于点命令(.),用于读取和在当前shell环境中执行指定文件中的命令,执行完毕之后退出码为该文件中的最后一个命令的退出码,指定的文件可以没有执行权限(没有权限是指该文件没有rwx中x的权限,也就是可执行到权限,这里到意思是说,即使该文件没有可执行权限,通过source也可以执行他)。在当前shell中执行(s_linux中的source指令
文章浏览阅读908次。获取 dom 对象$("#divId").children("div").get(0);$("#divId").children("div")[0];获取 jquery 对象$("#divId").children("div").eq(0);$($("#divId").children("div").get(0));【Java面试题与答案】整理推荐基础..._jq 子级别div
文章浏览阅读271次,点赞4次,收藏4次。管理员管理:负责添加、删除、修改管理员账号,并设置相应的权限,确保管理员团队的专业性和高效性。新闻信息管理:发布、编辑和删除交通新闻、政策更新、路况信息等,保持信息的实时性和有效性。驾驶证业务管理:在线提交驾驶证申请、查询、更新、补办等业务,并实时查看办理进度。新闻信息查看:浏览系统发布的交通新闻、政策更新、路况信息等,了解最新的交通动态。机动车业务管理:在线提交车辆注册、年检、转移、报废等业务申请,并获取办理结果。用户管理:管理用户账号,包括用户注册、登录、权限设置等,确保系统的安全性。
文章浏览阅读5.8k次。public class ReadOnlyAttribute : PropertyAttribute{}[CustomPropertyDrawer(typeof(ReadOnlyAttribute))]public class ReadOnlyDrawer : PropertyDrawer{ public override float GetPropertyHeight(S..._unity readonly
文章浏览阅读1.7k次。Demo 对象如图我们同时创建三个相同属性Vo对象当我们使用BeanUtils进行拷贝时,会发现这样的问题public static void main(String[] args) { Student student = new Student(); student.setStudentName("大明"); List<Student> studentList = new ArrayList<>(..._java集合泛型不一样数据互传
文章浏览阅读2.2k次,点赞5次,收藏7次。一、服务端维护每条消息对用户的送达状态 二、利用标号标记最新已读消息_android 存储推送消息
文章浏览阅读901次,点赞18次,收藏6次。driver = webdriver.PhantomJS(desired_capabilities=headers) # 封装浏览器信息。# driver.save_screenshot(‘1.png’) # 截图保存。# data = driver.page_source # 获取网页文本。driver.get(url) # 加载网页。
文章浏览阅读208次。要说区块链行业,最赚钱的项目,估计不少都会说是炒币。虽然比特币一直都是毁誉参半,但支撑其发展的底层技术区块链却日益得到各界认可和重视。2018 开年,区块链受到的追捧再次急遽升级。不仅是小型初创企业,腾讯、阿里、百度、京东等巨头公司也都纷纷加码对区块链的投入。区块链每天都在想方设法形成新的行业和企业应用,不用多久这项技术将无处不在。未来,包括初创企业、学术机构、开源机构、联盟和金融机构等都会参与到..._区块链系统安全性很高,是否考虑数据迁移问题
文章浏览阅读1.7w次,点赞17次,收藏101次。解决问题:AssertionError: Torch not compiled with CUDA enabled_assertionerror: torch not compiled with cuda enabled