【京东商城】ES高级工程师
薪资待遇:25k ~ 40k
工作内容:
1、开发、维护ES及相应管理后台
2、ElasticSearch集群的配置管理及优化
3、个性化功能及插件开发。
职位要求:
1、本科以上学历,4年以上工作经验。
2、精通Java,熟悉各种中间件技术及常用框架。
3、熟悉Elasticsearch,有相应开发维护经验者优先。
京东正大力推进Elasticsearch的使用场景,目前已有数千个实例,每日新增数据百T,日查询量千亿级别,技术氛围好,发展潜力大。欢迎您的加入~
欢迎投递简历至:wanghanghang@jd.com
薪资待遇:25k ~ 40k
工作内容:
1、开发、维护ES及相应管理后台
2、ElasticSearch集群的配置管理及优化
3、个性化功能及插件开发。
职位要求:
1、本科以上学历,4年以上工作经验。
2、精通Java,熟悉各种中间件技术及常用框架。
3、熟悉Elasticsearch,有相应开发维护经验者优先。
京东正大力推进Elasticsearch的使用场景,目前已有数千个实例,每日新增数据百T,日查询量千亿级别,技术氛围好,发展潜力大。欢迎您的加入~
欢迎投递简历至:wanghanghang@jd.com
收起阅读 »
社区日报 第93期 (2017-11-07)
http://t.cn/RloiI8o
2.用elastic stack来分析下你的redis slowlog
http://t.cn/Rlo6dQu
3.ES分片recovery 流程分析与速度优化
http://t.cn/RloJr8Q
编辑:叮咚光军
归档:https://elasticsearch.cn/article/357
订阅:https://tinyletter.com/elastic-daily
http://t.cn/RloiI8o
2.用elastic stack来分析下你的redis slowlog
http://t.cn/Rlo6dQu
3.ES分片recovery 流程分析与速度优化
http://t.cn/RloJr8Q
编辑:叮咚光军
归档:https://elasticsearch.cn/article/357
订阅:https://tinyletter.com/elastic-daily
收起阅读 »
ElasticSearch 集群监控
原文地址:http://www.54tianzhisheng.cn/2017/10/15/ElasticSearch-cluster-health-metrics/
最近在做 ElasticSearch 的信息(集群和节点)监控,特此稍微整理下学到的东西。这篇文章主要介绍集群的监控。
要监控哪些 ElasticSearch metrics
Elasticsearch 提供了大量的 Metric,可以帮助您检测到问题的迹象,在遇到节点不可用、out-of-memory、long garbage collection times 的时候采取相应措施。但是指标太多了,有时我们并不需要这么多,这就需要我们进行筛选。
集群健康
一个 Elasticsearch 集群至少包括一个节点和一个索引。或者它 可能有一百个数据节点、三个单独的主节点,以及一小打客户端节点——这些共同操作一千个索引(以及上万个分片)。
不管集群扩展到多大规模,你都会想要一个快速获取集群状态的途径。Cluster Health
API 充当的就是这个角色。你可以把它想象成是在一万英尺的高度鸟瞰集群。它可以告诉你安心吧一切都好,或者警告你集群某个地方有问题。
让我们执行一下 cluster-health
API 然后看看响应体是什么样子的:
GET _cluster/health
和 Elasticsearch 里其他 API 一样,cluster-health
会返回一个 JSON 响应。这对自动化和告警系统来说,非常便于解析。响应中包含了和你集群有关的一些关键信息:
{
"cluster_name": "elasticsearch_zach",
"status": "green",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 10,
"active_shards": 10,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0
}
响应信息中最重要的一块就是 status
字段。状态可能是下列三个值之一 :
status | 含义 |
---|---|
green | 所有的主分片和副本分片都已分配。你的集群是 100% 可用的。 |
yellow | 所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。不过,你的高可用性在某种程度上被弱化。如果 更多的 分片消失,你就会丢数据了。把 yellow 想象成一个需要及时调查的警告。 |
red | 至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。 |
number_of_nodes
和number_of_data_nodes
这个命名完全是自描述的。active_primary_shards
指出你集群中的主分片数量。这是涵盖了所有索引的汇总值。active_shards
是涵盖了所有索引的所有分片的汇总值,即包括副本分片。relocating_shards
显示当前正在从一个节点迁往其他节点的分片的数量。通常来说应该是 0,不过在 Elasticsearch 发现集群不太均衡时,该值会上涨。比如说:添加了一个新节点,或者下线了一个节点。initializing_shards
是刚刚创建的分片的个数。比如,当你刚创建第一个索引,分片都会短暂的处于initializing
状态。这通常会是一个临时事件,分片不应该长期停留在initializing
状态。你还可能在节点刚重启的时候看到initializing
分片:当分片从磁盘上加载后,它们会从initializing
状态开始。unassigned_shards
是已经在集群状态中存在的分片,但是实际在集群里又找不着。通常未分配分片的来源是未分配的副本。比如,一个有 5 分片和 1 副本的索引,在单节点集群上,就会有 5 个未分配副本分片。如果你的集群是red
状态,也会长期保有未分配分片(因为缺少主分片)。
集群统计
集群统计信息包含 集群的分片数,文档数,存储空间,缓存信息,内存作用率,插件内容,文件系统内容,JVM 作用状况,系统 CPU,OS 信息,段信息。
查看全部统计信息命令:
curl -XGET 'http://localhost:9200/_cluster/stats?human&pretty'
返回 JSON 结果:
{
"timestamp": 1459427693515,
"cluster_name": "elasticsearch",
"status": "green",
"indices": {
"count": 2,
"shards": {
"total": 10,
"primaries": 10,
"replication": 0,
"index": {
"shards": {
"min": 5,
"max": 5,
"avg": 5
},
"primaries": {
"min": 5,
"max": 5,
"avg": 5
},
"replication": {
"min": 0,
"max": 0,
"avg": 0
}
}
},
"docs": {
"count": 10,
"deleted": 0
},
"store": {
"size": "16.2kb",
"size_in_bytes": 16684,
"throttle_time": "0s",
"throttle_time_in_millis": 0
},
"fielddata": {
"memory_size": "0b",
"memory_size_in_bytes": 0,
"evictions": 0
},
"query_cache": {
"memory_size": "0b",
"memory_size_in_bytes": 0,
"total_count": 0,
"hit_count": 0,
"miss_count": 0,
"cache_size": 0,
"cache_count": 0,
"evictions": 0
},
"completion": {
"size": "0b",
"size_in_bytes": 0
},
"segments": {
"count": 4,
"memory": "8.6kb",
"memory_in_bytes": 8898,
"terms_memory": "6.3kb",
"terms_memory_in_bytes": 6522,
"stored_fields_memory": "1.2kb",
"stored_fields_memory_in_bytes": 1248,
"term_vectors_memory": "0b",
"term_vectors_memory_in_bytes": 0,
"norms_memory": "384b",
"norms_memory_in_bytes": 384,
"doc_values_memory": "744b",
"doc_values_memory_in_bytes": 744,
"index_writer_memory": "0b",
"index_writer_memory_in_bytes": 0,
"version_map_memory": "0b",
"version_map_memory_in_bytes": 0,
"fixed_bit_set": "0b",
"fixed_bit_set_memory_in_bytes": 0,
"file_sizes": {}
},
"percolator": {
"num_queries": 0
}
},
"nodes": {
"count": {
"total": 1,
"data": 1,
"coordinating_only": 0,
"master": 1,
"ingest": 1
},
"versions": [
"5.6.3"
],
"os": {
"available_processors": 8,
"allocated_processors": 8,
"names": [
{
"name": "Mac OS X",
"count": 1
}
],
"mem" : {
"total" : "16gb",
"total_in_bytes" : 17179869184,
"free" : "78.1mb",
"free_in_bytes" : 81960960,
"used" : "15.9gb",
"used_in_bytes" : 17097908224,
"free_percent" : 0,
"used_percent" : 100
}
},
"process": {
"cpu": {
"percent": 9
},
"open_file_descriptors": {
"min": 268,
"max": 268,
"avg": 268
}
},
"jvm": {
"max_uptime": "13.7s",
"max_uptime_in_millis": 13737,
"versions": [
{
"version": "1.8.0_74",
"vm_name": "Java HotSpot(TM) 64-Bit Server VM",
"vm_version": "25.74-b02",
"vm_vendor": "Oracle Corporation",
"count": 1
}
],
"mem": {
"heap_used": "57.5mb",
"heap_used_in_bytes": 60312664,
"heap_max": "989.8mb",
"heap_max_in_bytes": 1037959168
},
"threads": 90
},
"fs": {
"total": "200.6gb",
"total_in_bytes": 215429193728,
"free": "32.6gb",
"free_in_bytes": 35064553472,
"available": "32.4gb",
"available_in_bytes": 34802409472
},
"plugins": [
{
"name": "analysis-icu",
"version": "5.6.3",
"description": "The ICU Analysis plugin integrates Lucene ICU module into elasticsearch, adding ICU relates analysis components.",
"classname": "org.elasticsearch.plugin.analysis.icu.AnalysisICUPlugin",
"has_native_controller": false
},
{
"name": "ingest-geoip",
"version": "5.6.3",
"description": "Ingest processor that uses looksup geo data based on ip adresses using the Maxmind geo database",
"classname": "org.elasticsearch.ingest.geoip.IngestGeoIpPlugin",
"has_native_controller": false
},
{
"name": "ingest-user-agent",
"version": "5.6.3",
"description": "Ingest processor that extracts information from a user agent",
"classname": "org.elasticsearch.ingest.useragent.IngestUserAgentPlugin",
"has_native_controller": false
}
]
}
}
内存使用和 GC 指标
在运行 Elasticsearch 时,内存是您要密切监控的关键资源之一。 Elasticsearch 和 Lucene 以两种方式利用节点上的所有可用 RAM:JVM heap 和文件系统缓存。 Elasticsearch 运行在Java虚拟机(JVM)中,这意味着JVM垃圾回收的持续时间和频率将成为其他重要的监控领域。
上面返回的 JSON监控的指标有我个人觉得有这些:
- nodes.successful
- nodes.failed
- nodes.total
- nodes.mem.used_percent
- nodes.process.cpu.percent
- nodes.jvm.mem.heap_used
可以看到 JSON 文件是很复杂的,如果从这复杂的 JSON 中获取到对应的指标(key)的值呢,这里请看文章 :JsonPath —— JSON 解析神器
最后
这里主要讲下 ES 集群的一些监控信息,有些监控指标是个人觉得需要监控的,但是具体情况还是得看需求了。下篇文章主要讲节点的监控信息。转载请注明地址:http://www.54tianzhisheng.cn/2017/10/15/ElasticSearch-cluster-health-metrics/
参考资料
1、How to monitor Elasticsearch performance
相关阅读
原文地址:http://www.54tianzhisheng.cn/2017/10/15/ElasticSearch-cluster-health-metrics/
最近在做 ElasticSearch 的信息(集群和节点)监控,特此稍微整理下学到的东西。这篇文章主要介绍集群的监控。
要监控哪些 ElasticSearch metrics
Elasticsearch 提供了大量的 Metric,可以帮助您检测到问题的迹象,在遇到节点不可用、out-of-memory、long garbage collection times 的时候采取相应措施。但是指标太多了,有时我们并不需要这么多,这就需要我们进行筛选。
集群健康
一个 Elasticsearch 集群至少包括一个节点和一个索引。或者它 可能有一百个数据节点、三个单独的主节点,以及一小打客户端节点——这些共同操作一千个索引(以及上万个分片)。
不管集群扩展到多大规模,你都会想要一个快速获取集群状态的途径。Cluster Health
API 充当的就是这个角色。你可以把它想象成是在一万英尺的高度鸟瞰集群。它可以告诉你安心吧一切都好,或者警告你集群某个地方有问题。
让我们执行一下 cluster-health
API 然后看看响应体是什么样子的:
GET _cluster/health
和 Elasticsearch 里其他 API 一样,cluster-health
会返回一个 JSON 响应。这对自动化和告警系统来说,非常便于解析。响应中包含了和你集群有关的一些关键信息:
{
"cluster_name": "elasticsearch_zach",
"status": "green",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 10,
"active_shards": 10,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0
}
响应信息中最重要的一块就是 status
字段。状态可能是下列三个值之一 :
status | 含义 |
---|---|
green | 所有的主分片和副本分片都已分配。你的集群是 100% 可用的。 |
yellow | 所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。不过,你的高可用性在某种程度上被弱化。如果 更多的 分片消失,你就会丢数据了。把 yellow 想象成一个需要及时调查的警告。 |
red | 至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。 |
number_of_nodes
和number_of_data_nodes
这个命名完全是自描述的。active_primary_shards
指出你集群中的主分片数量。这是涵盖了所有索引的汇总值。active_shards
是涵盖了所有索引的所有分片的汇总值,即包括副本分片。relocating_shards
显示当前正在从一个节点迁往其他节点的分片的数量。通常来说应该是 0,不过在 Elasticsearch 发现集群不太均衡时,该值会上涨。比如说:添加了一个新节点,或者下线了一个节点。initializing_shards
是刚刚创建的分片的个数。比如,当你刚创建第一个索引,分片都会短暂的处于initializing
状态。这通常会是一个临时事件,分片不应该长期停留在initializing
状态。你还可能在节点刚重启的时候看到initializing
分片:当分片从磁盘上加载后,它们会从initializing
状态开始。unassigned_shards
是已经在集群状态中存在的分片,但是实际在集群里又找不着。通常未分配分片的来源是未分配的副本。比如,一个有 5 分片和 1 副本的索引,在单节点集群上,就会有 5 个未分配副本分片。如果你的集群是red
状态,也会长期保有未分配分片(因为缺少主分片)。
集群统计
集群统计信息包含 集群的分片数,文档数,存储空间,缓存信息,内存作用率,插件内容,文件系统内容,JVM 作用状况,系统 CPU,OS 信息,段信息。
查看全部统计信息命令:
curl -XGET 'http://localhost:9200/_cluster/stats?human&pretty'
返回 JSON 结果:
{
"timestamp": 1459427693515,
"cluster_name": "elasticsearch",
"status": "green",
"indices": {
"count": 2,
"shards": {
"total": 10,
"primaries": 10,
"replication": 0,
"index": {
"shards": {
"min": 5,
"max": 5,
"avg": 5
},
"primaries": {
"min": 5,
"max": 5,
"avg": 5
},
"replication": {
"min": 0,
"max": 0,
"avg": 0
}
}
},
"docs": {
"count": 10,
"deleted": 0
},
"store": {
"size": "16.2kb",
"size_in_bytes": 16684,
"throttle_time": "0s",
"throttle_time_in_millis": 0
},
"fielddata": {
"memory_size": "0b",
"memory_size_in_bytes": 0,
"evictions": 0
},
"query_cache": {
"memory_size": "0b",
"memory_size_in_bytes": 0,
"total_count": 0,
"hit_count": 0,
"miss_count": 0,
"cache_size": 0,
"cache_count": 0,
"evictions": 0
},
"completion": {
"size": "0b",
"size_in_bytes": 0
},
"segments": {
"count": 4,
"memory": "8.6kb",
"memory_in_bytes": 8898,
"terms_memory": "6.3kb",
"terms_memory_in_bytes": 6522,
"stored_fields_memory": "1.2kb",
"stored_fields_memory_in_bytes": 1248,
"term_vectors_memory": "0b",
"term_vectors_memory_in_bytes": 0,
"norms_memory": "384b",
"norms_memory_in_bytes": 384,
"doc_values_memory": "744b",
"doc_values_memory_in_bytes": 744,
"index_writer_memory": "0b",
"index_writer_memory_in_bytes": 0,
"version_map_memory": "0b",
"version_map_memory_in_bytes": 0,
"fixed_bit_set": "0b",
"fixed_bit_set_memory_in_bytes": 0,
"file_sizes": {}
},
"percolator": {
"num_queries": 0
}
},
"nodes": {
"count": {
"total": 1,
"data": 1,
"coordinating_only": 0,
"master": 1,
"ingest": 1
},
"versions": [
"5.6.3"
],
"os": {
"available_processors": 8,
"allocated_processors": 8,
"names": [
{
"name": "Mac OS X",
"count": 1
}
],
"mem" : {
"total" : "16gb",
"total_in_bytes" : 17179869184,
"free" : "78.1mb",
"free_in_bytes" : 81960960,
"used" : "15.9gb",
"used_in_bytes" : 17097908224,
"free_percent" : 0,
"used_percent" : 100
}
},
"process": {
"cpu": {
"percent": 9
},
"open_file_descriptors": {
"min": 268,
"max": 268,
"avg": 268
}
},
"jvm": {
"max_uptime": "13.7s",
"max_uptime_in_millis": 13737,
"versions": [
{
"version": "1.8.0_74",
"vm_name": "Java HotSpot(TM) 64-Bit Server VM",
"vm_version": "25.74-b02",
"vm_vendor": "Oracle Corporation",
"count": 1
}
],
"mem": {
"heap_used": "57.5mb",
"heap_used_in_bytes": 60312664,
"heap_max": "989.8mb",
"heap_max_in_bytes": 1037959168
},
"threads": 90
},
"fs": {
"total": "200.6gb",
"total_in_bytes": 215429193728,
"free": "32.6gb",
"free_in_bytes": 35064553472,
"available": "32.4gb",
"available_in_bytes": 34802409472
},
"plugins": [
{
"name": "analysis-icu",
"version": "5.6.3",
"description": "The ICU Analysis plugin integrates Lucene ICU module into elasticsearch, adding ICU relates analysis components.",
"classname": "org.elasticsearch.plugin.analysis.icu.AnalysisICUPlugin",
"has_native_controller": false
},
{
"name": "ingest-geoip",
"version": "5.6.3",
"description": "Ingest processor that uses looksup geo data based on ip adresses using the Maxmind geo database",
"classname": "org.elasticsearch.ingest.geoip.IngestGeoIpPlugin",
"has_native_controller": false
},
{
"name": "ingest-user-agent",
"version": "5.6.3",
"description": "Ingest processor that extracts information from a user agent",
"classname": "org.elasticsearch.ingest.useragent.IngestUserAgentPlugin",
"has_native_controller": false
}
]
}
}
内存使用和 GC 指标
在运行 Elasticsearch 时,内存是您要密切监控的关键资源之一。 Elasticsearch 和 Lucene 以两种方式利用节点上的所有可用 RAM:JVM heap 和文件系统缓存。 Elasticsearch 运行在Java虚拟机(JVM)中,这意味着JVM垃圾回收的持续时间和频率将成为其他重要的监控领域。
上面返回的 JSON监控的指标有我个人觉得有这些:
- nodes.successful
- nodes.failed
- nodes.total
- nodes.mem.used_percent
- nodes.process.cpu.percent
- nodes.jvm.mem.heap_used
可以看到 JSON 文件是很复杂的,如果从这复杂的 JSON 中获取到对应的指标(key)的值呢,这里请看文章 :JsonPath —— JSON 解析神器
最后
这里主要讲下 ES 集群的一些监控信息,有些监控指标是个人觉得需要监控的,但是具体情况还是得看需求了。下篇文章主要讲节点的监控信息。转载请注明地址:http://www.54tianzhisheng.cn/2017/10/15/ElasticSearch-cluster-health-metrics/
参考资料
1、How to monitor Elasticsearch performance
相关阅读
1、Elasticsearch 默认分词器和中分分词器之间的比较及使用方法
2、全文搜索引擎 Elasticsearch 集群搭建入门教程
收起阅读 »ElasticSearch 单个节点监控
原文地址:http://www.54tianzhisheng.cn/2017/10/18/ElasticSearch-nodes-metrics/
集群健康监控是对集群信息进行高度的概括,节点统计值 API 提供了集群中每个节点的统计值。节点统计值很多,在监控的时候仍需要我们清楚哪些指标是最值得关注的。
集群健康监控可以参考这篇文章:ElasticSearch 集群监控
节点信息 Node Info :
curl -XGET 'http://localhost:9200/_nodes'
执行上述命令可以获取所有 node 的信息
_nodes: {
total: 2,
successful: 2,
failed: 0
},
cluster_name: "elasticsearch",
nodes: {
MSQ_CZ7mTNyOSlYIfrvHag: {
name: "node0",
transport_address: "192.168.180.110:9300",
host: "192.168.180.110",
ip: "192.168.180.110",
version: "5.5.0",
build_hash: "260387d",
total_indexing_buffer: 103887667,
roles:{...},
settings: {...},
os: {
refresh_interval_in_millis: 1000,
name: "Linux",
arch: "amd64",
version: "3.10.0-229.el7.x86_64",
available_processors: 4,
allocated_processors: 4
},
process: {
refresh_interval_in_millis: 1000,
id: 3022,
mlockall: false
},
jvm: {
pid: 3022,
version: "1.8.0_121",
vm_name: "Java HotSpot(TM) 64-Bit Server VM",
vm_version: "25.121-b13",
vm_vendor: "Oracle Corporation",
start_time_in_millis: 1507515225302,
mem: {
heap_init_in_bytes: 1073741824,
heap_max_in_bytes: 1038876672,
non_heap_init_in_bytes: 2555904,
non_heap_max_in_bytes: 0,
direct_max_in_bytes: 1038876672
},
gc_collectors: [],
memory_pools: [],
using_compressed_ordinary_object_pointers: "true",
input_arguments:{}
}
thread_pool:{
force_merge: {},
fetch_shard_started: {},
listener: {},
index: {},
refresh: {},
generic: {},
warmer: {},
search: {},
flush: {},
fetch_shard_store: {},
management: {},
get: {},
bulk: {},
snapshot: {}
}
transport: {...},
http: {...},
plugins: [],
modules: [],
ingest: {...}
}
上面是我已经简写了很多数据之后的返回值,但是指标还是很多,有些是一些常规的指标,对于监控来说,没必要拿取。从上面我们可以主要关注以下这些指标:
os, process, jvm, thread_pool, transport, http, ingest and indices
节点统计 nodes-statistics
节点统计值 API 可通过如下命令获取:
GET /_nodes/stats
得到:
_nodes: {
total: 2,
successful: 2,
failed: 0
},
cluster_name: "elasticsearch",
nodes: {
MSQ_CZ7mTNyOSlYI0yvHag: {
timestamp: 1508312932354,
name: "node0",
transport_address: "192.168.180.110:9300",
host: "192.168.180.110",
ip: "192.168.180.110:9300",
roles: [],
indices: {
docs: {
count: 6163666,
deleted: 0
},
store: {
size_in_bytes: 2301398179,
throttle_time_in_millis: 122850
},
indexing: {},
get: {},
search: {},
merges: {},
refresh: {},
flush: {},
warmer: {},
query_cache: {},
fielddata: {},
completion: {},
segments: {},
translog: {},
request_cache: {},
recovery: {}
},
os: {
timestamp: 1508312932369,
cpu: {
percent: 0,
load_average: {
1m: 0.09,
5m: 0.12,
15m: 0.08
}
},
mem: {
total_in_bytes: 8358301696,
free_in_bytes: 1381613568,
used_in_bytes: 6976688128,
free_percent: 17,
used_percent: 83
},
swap: {
total_in_bytes: 8455712768,
free_in_bytes: 8455299072,
used_in_bytes: 413696
},
cgroup: {
cpuacct: {},
cpu: {
control_group: "/user.slice",
cfs_period_micros: 100000,
cfs_quota_micros: -1,
stat: {}
}
}
},
process: {
timestamp: 1508312932369,
open_file_descriptors: 228,
max_file_descriptors: 65536,
cpu: {
percent: 0,
total_in_millis: 2495040
},
mem: {
total_virtual_in_bytes: 5002465280
}
},
jvm: {
timestamp: 1508312932369,
uptime_in_millis: 797735804,
mem: {
heap_used_in_bytes: 318233768,
heap_used_percent: 30,
heap_committed_in_bytes: 1038876672,
heap_max_in_bytes: 1038876672,
non_heap_used_in_bytes: 102379784,
non_heap_committed_in_bytes: 108773376,
pools: {
young: {
used_in_bytes: 62375176,
max_in_bytes: 279183360,
peak_used_in_bytes: 279183360,
peak_max_in_bytes: 279183360
},
survivor: {
used_in_bytes: 175384,
max_in_bytes: 34865152,
peak_used_in_bytes: 34865152,
peak_max_in_bytes: 34865152
},
old: {
used_in_bytes: 255683208,
max_in_bytes: 724828160,
peak_used_in_bytes: 255683208,
peak_max_in_bytes: 724828160
}
}
},
threads: {},
gc: {},
buffer_pools: {},
classes: {}
},
thread_pool: {
bulk: {},
fetch_shard_started: {},
fetch_shard_store: {},
flush: {},
force_merge: {},
generic: {},
get: {},
index: {
threads: 1,
queue: 0,
active: 0,
rejected: 0,
largest: 1,
completed: 1
}
listener: {},
management: {},
refresh: {},
search: {},
snapshot: {},
warmer: {}
},
fs: {},
transport: {
server_open: 13,
rx_count: 11696,
rx_size_in_bytes: 1525774,
tx_count: 10282,
tx_size_in_bytes: 1440101928
},
http: {
current_open: 4,
total_opened: 23
},
breakers: {},
script: {},
discovery: {},
ingest: {}
}
节点名是一个 UUID,上面列举了很多指标,下面讲解下:
索引部分 indices
这部分列出了这个节点上所有索引的聚合过的统计值 :
-
docs
展示节点内存有多少文档,包括还没有从段里清除的已删除文档数量。 -
store
部分显示节点耗用了多少物理存储。这个指标包括主分片和副本分片在内。如果限流时间很大,那可能表明你的磁盘限流设置得过低。 indexing
显示已经索引了多少文档。这个值是一个累加计数器。在文档被删除的时候,数值不会下降。还要注意的是,在发生内部 索引操作的时候,这个值也会增加,比如说文档更新。
还列出了索引操作耗费的时间,正在索引的文档数量,以及删除操作的类似统计值。
-
get
显示通过 ID 获取文档的接口相关的统计值。包括对单个文档的GET
和HEAD
请求。 search
描述在活跃中的搜索(open_contexts
)数量、查询的总数量、以及自节点启动以来在查询上消耗的总时间。用query_time_in_millis / query_total
计算的比值,可以用来粗略的评价你的查询有多高效。比值越大,每个查询花费的时间越多,你应该要考虑调优了。
fetch 统计值展示了查询处理的后一半流程(query-then-fetch 里的 fetch )。如果 fetch 耗时比 query 还多,说明磁盘较慢,或者获取了太多文档,或者可能搜索请求设置了太大的分页(比如, size: 10000
)。
-
merges
包括了 Lucene 段合并相关的信息。它会告诉你目前在运行几个合并,合并涉及的文档数量,正在合并的段的总大小,以及在合并操作上消耗的总时间。 filter_cache
展示了已缓存的过滤器位集合所用的内存数量,以及过滤器被驱逐出内存的次数。过多的驱逐数 可能 说明你需要加大过滤器缓存的大小,或者你的过滤器不太适合缓存(比如它们因为高基数而在大量产生,就像是缓存一个now
时间表达式)。
不过,驱逐数是一个很难评定的指标。过滤器是在每个段的基础上缓存的,而从一个小的段里驱逐过滤器,代价比从一个大的段里要廉价的多。有可能你有很大的驱逐数,但是它们都发生在小段上,也就意味着这些对查询性能只有很小的影响。
把驱逐数指标作为一个粗略的参考。如果你看到数字很大,检查一下你的过滤器,确保他们都是正常缓存的。不断驱逐着的过滤器,哪怕都发生在很小的段上,效果也比正确缓存住了的过滤器差很多。
-
field_data
显示 fielddata 使用的内存, 用以聚合、排序等等。这里也有一个驱逐计数。和filter_cache
不同的是,这里的驱逐计数是很有用的:这个数应该或者至少是接近于 0。因为 fielddata 不是缓存,任何驱逐都消耗巨大,应该避免掉。如果你在这里看到驱逐数,你需要重新评估你的内存情况,fielddata 限制,请求语句,或者这三者。 segments
会展示这个节点目前正在服务中的 Lucene 段的数量。 这是一个重要的数字。大多数索引会有大概 50–150 个段,哪怕它们存有 TB 级别的数十亿条文档。段数量过大表明合并出现了问题(比如,合并速度跟不上段的创建)。注意这个统计值是节点上所有索引的汇聚总数。记住这点。
memory
统计值展示了 Lucene 段自己用掉的内存大小。 这里包括底层数据结构,比如倒排表,字典,和布隆过滤器等。太大的段数量会增加这些数据结构带来的开销,这个内存使用量就是一个方便用来衡量开销的度量值。
操作系统和进程部分
OS
和 Process
部分基本是自描述的,不会在细节中展开讲解。它们列出来基础的资源统计值,比如 CPU 和负载。OS
部分描述了整个操作系统,而 Process
部分只显示 Elasticsearch 的 JVM 进程使用的资源情况。
这些都是非常有用的指标,不过通常在你的监控技术栈里已经都测量好了。统计值包括下面这些:
- CPU
- 负载
- 内存使用率 (mem.used_percent)
- Swap 使用率
- 打开的文件描述符 (open_file_descriptors)
JVM 部分
jvm
部分包括了运行 Elasticsearch 的 JVM 进程一些很关键的信息。 最重要的,它包括了垃圾回收的细节,这对你的 Elasticsearch 集群的稳定性有着重大影响。
jvm: {
timestamp: 1508312932369,
uptime_in_millis: 797735804,
mem: {
heap_used_in_bytes: 318233768,
heap_used_percent: 30,
heap_committed_in_bytes: 1038876672,
heap_max_in_bytes: 1038876672,
non_heap_used_in_bytes: 102379784,
non_heap_committed_in_bytes: 108773376,
}
}
jvm
部分首先列出一些和 heap 内存使用有关的常见统计值。你可以看到有多少 heap 被使用了,多少被指派了(当前被分配给进程的),以及 heap 被允许分配的最大值。理想情况下,heap_committed_in_bytes
应该等于 heap_max_in_bytes
。如果指派的大小更小,JVM 最终会被迫调整 heap 大小——这是一个非常昂贵的操作。如果你的数字不相等,阅读 堆内存:大小和交换 学习如何正确的配置它。
heap_used_percent
指标是值得关注的一个数字。Elasticsearch 被配置为当 heap 达到 75% 的时候开始 GC。如果你的节点一直 >= 75%,你的节点正处于 内存压力 状态。这是个危险信号,不远的未来可能就有慢 GC 要出现了。
如果 heap 使用率一直 >=85%,你就麻烦了。Heap 在 90–95% 之间,则面临可怕的性能风险,此时最好的情况是长达 10–30s 的 GC,最差的情况就是内存溢出(OOM)异常。
线程池部分
Elasticsearch 在内部维护了线程池。 这些线程池相互协作完成任务,有必要的话相互间还会传递任务。通常来说,你不需要配置或者调优线程池,不过查看它们的统计值有时候还是有用的,可以洞察你的集群表现如何。
每个线程池会列出已配置的线程数量( threads
),当前在处理任务的线程数量( active
),以及在队列中等待处理的任务单元数量( queue
)。
如果队列中任务单元数达到了极限,新的任务单元会开始被拒绝,你会在 rejected
统计值上看到它反映出来。这通常是你的集群在某些资源上碰到瓶颈的信号。因为队列满意味着你的节点或集群在用最高速度运行,但依然跟不上工作的蜂拥而入。
这里的一系列的线程池,大多数你可以忽略,但是有一小部分还是值得关注的:
indexing
普通的索引请求的线程池bulk
批量请求,和单条的索引请求不同的线程池get
Get-by-ID 操作search
所有的搜索和查询请求merging
专用于管理 Lucene 合并的线程池
网络部分
transport
显示和 传输地址 相关的一些基础统计值。包括节点间的通信(通常是 9300 端口)以及任意传输客户端或者节点客户端的连接。如果看到这里有很多连接数不要担心;Elasticsearch 在节点之间维护了大量的连接。http
显示 HTTP 端口(通常是 9200)的统计值。如果你看到total_opened
数很大而且还在一直上涨,这是一个明确信号,说明你的 HTTP 客户端里有没启用 keep-alive 长连接的。持续的 keep-alive 长连接对性能很重要,因为连接、断开套接字是很昂贵的(而且浪费文件描述符)。请确认你的客户端都配置正确。
参考资料
3、ES监控指标
最后:
转载请注明地址:http://www.54tianzhisheng.cn/2017/10/18/ElasticSearch-nodes-metrics/
原文地址:http://www.54tianzhisheng.cn/2017/10/18/ElasticSearch-nodes-metrics/
集群健康监控是对集群信息进行高度的概括,节点统计值 API 提供了集群中每个节点的统计值。节点统计值很多,在监控的时候仍需要我们清楚哪些指标是最值得关注的。
集群健康监控可以参考这篇文章:ElasticSearch 集群监控
节点信息 Node Info :
curl -XGET 'http://localhost:9200/_nodes'
执行上述命令可以获取所有 node 的信息
_nodes: {
total: 2,
successful: 2,
failed: 0
},
cluster_name: "elasticsearch",
nodes: {
MSQ_CZ7mTNyOSlYIfrvHag: {
name: "node0",
transport_address: "192.168.180.110:9300",
host: "192.168.180.110",
ip: "192.168.180.110",
version: "5.5.0",
build_hash: "260387d",
total_indexing_buffer: 103887667,
roles:{...},
settings: {...},
os: {
refresh_interval_in_millis: 1000,
name: "Linux",
arch: "amd64",
version: "3.10.0-229.el7.x86_64",
available_processors: 4,
allocated_processors: 4
},
process: {
refresh_interval_in_millis: 1000,
id: 3022,
mlockall: false
},
jvm: {
pid: 3022,
version: "1.8.0_121",
vm_name: "Java HotSpot(TM) 64-Bit Server VM",
vm_version: "25.121-b13",
vm_vendor: "Oracle Corporation",
start_time_in_millis: 1507515225302,
mem: {
heap_init_in_bytes: 1073741824,
heap_max_in_bytes: 1038876672,
non_heap_init_in_bytes: 2555904,
non_heap_max_in_bytes: 0,
direct_max_in_bytes: 1038876672
},
gc_collectors: [],
memory_pools: [],
using_compressed_ordinary_object_pointers: "true",
input_arguments:{}
}
thread_pool:{
force_merge: {},
fetch_shard_started: {},
listener: {},
index: {},
refresh: {},
generic: {},
warmer: {},
search: {},
flush: {},
fetch_shard_store: {},
management: {},
get: {},
bulk: {},
snapshot: {}
}
transport: {...},
http: {...},
plugins: [],
modules: [],
ingest: {...}
}
上面是我已经简写了很多数据之后的返回值,但是指标还是很多,有些是一些常规的指标,对于监控来说,没必要拿取。从上面我们可以主要关注以下这些指标:
os, process, jvm, thread_pool, transport, http, ingest and indices
节点统计 nodes-statistics
节点统计值 API 可通过如下命令获取:
GET /_nodes/stats
得到:
_nodes: {
total: 2,
successful: 2,
failed: 0
},
cluster_name: "elasticsearch",
nodes: {
MSQ_CZ7mTNyOSlYI0yvHag: {
timestamp: 1508312932354,
name: "node0",
transport_address: "192.168.180.110:9300",
host: "192.168.180.110",
ip: "192.168.180.110:9300",
roles: [],
indices: {
docs: {
count: 6163666,
deleted: 0
},
store: {
size_in_bytes: 2301398179,
throttle_time_in_millis: 122850
},
indexing: {},
get: {},
search: {},
merges: {},
refresh: {},
flush: {},
warmer: {},
query_cache: {},
fielddata: {},
completion: {},
segments: {},
translog: {},
request_cache: {},
recovery: {}
},
os: {
timestamp: 1508312932369,
cpu: {
percent: 0,
load_average: {
1m: 0.09,
5m: 0.12,
15m: 0.08
}
},
mem: {
total_in_bytes: 8358301696,
free_in_bytes: 1381613568,
used_in_bytes: 6976688128,
free_percent: 17,
used_percent: 83
},
swap: {
total_in_bytes: 8455712768,
free_in_bytes: 8455299072,
used_in_bytes: 413696
},
cgroup: {
cpuacct: {},
cpu: {
control_group: "/user.slice",
cfs_period_micros: 100000,
cfs_quota_micros: -1,
stat: {}
}
}
},
process: {
timestamp: 1508312932369,
open_file_descriptors: 228,
max_file_descriptors: 65536,
cpu: {
percent: 0,
total_in_millis: 2495040
},
mem: {
total_virtual_in_bytes: 5002465280
}
},
jvm: {
timestamp: 1508312932369,
uptime_in_millis: 797735804,
mem: {
heap_used_in_bytes: 318233768,
heap_used_percent: 30,
heap_committed_in_bytes: 1038876672,
heap_max_in_bytes: 1038876672,
non_heap_used_in_bytes: 102379784,
non_heap_committed_in_bytes: 108773376,
pools: {
young: {
used_in_bytes: 62375176,
max_in_bytes: 279183360,
peak_used_in_bytes: 279183360,
peak_max_in_bytes: 279183360
},
survivor: {
used_in_bytes: 175384,
max_in_bytes: 34865152,
peak_used_in_bytes: 34865152,
peak_max_in_bytes: 34865152
},
old: {
used_in_bytes: 255683208,
max_in_bytes: 724828160,
peak_used_in_bytes: 255683208,
peak_max_in_bytes: 724828160
}
}
},
threads: {},
gc: {},
buffer_pools: {},
classes: {}
},
thread_pool: {
bulk: {},
fetch_shard_started: {},
fetch_shard_store: {},
flush: {},
force_merge: {},
generic: {},
get: {},
index: {
threads: 1,
queue: 0,
active: 0,
rejected: 0,
largest: 1,
completed: 1
}
listener: {},
management: {},
refresh: {},
search: {},
snapshot: {},
warmer: {}
},
fs: {},
transport: {
server_open: 13,
rx_count: 11696,
rx_size_in_bytes: 1525774,
tx_count: 10282,
tx_size_in_bytes: 1440101928
},
http: {
current_open: 4,
total_opened: 23
},
breakers: {},
script: {},
discovery: {},
ingest: {}
}
节点名是一个 UUID,上面列举了很多指标,下面讲解下:
索引部分 indices
这部分列出了这个节点上所有索引的聚合过的统计值 :
-
docs
展示节点内存有多少文档,包括还没有从段里清除的已删除文档数量。 -
store
部分显示节点耗用了多少物理存储。这个指标包括主分片和副本分片在内。如果限流时间很大,那可能表明你的磁盘限流设置得过低。 indexing
显示已经索引了多少文档。这个值是一个累加计数器。在文档被删除的时候,数值不会下降。还要注意的是,在发生内部 索引操作的时候,这个值也会增加,比如说文档更新。
还列出了索引操作耗费的时间,正在索引的文档数量,以及删除操作的类似统计值。
-
get
显示通过 ID 获取文档的接口相关的统计值。包括对单个文档的GET
和HEAD
请求。 search
描述在活跃中的搜索(open_contexts
)数量、查询的总数量、以及自节点启动以来在查询上消耗的总时间。用query_time_in_millis / query_total
计算的比值,可以用来粗略的评价你的查询有多高效。比值越大,每个查询花费的时间越多,你应该要考虑调优了。
fetch 统计值展示了查询处理的后一半流程(query-then-fetch 里的 fetch )。如果 fetch 耗时比 query 还多,说明磁盘较慢,或者获取了太多文档,或者可能搜索请求设置了太大的分页(比如, size: 10000
)。
-
merges
包括了 Lucene 段合并相关的信息。它会告诉你目前在运行几个合并,合并涉及的文档数量,正在合并的段的总大小,以及在合并操作上消耗的总时间。 filter_cache
展示了已缓存的过滤器位集合所用的内存数量,以及过滤器被驱逐出内存的次数。过多的驱逐数 可能 说明你需要加大过滤器缓存的大小,或者你的过滤器不太适合缓存(比如它们因为高基数而在大量产生,就像是缓存一个now
时间表达式)。
不过,驱逐数是一个很难评定的指标。过滤器是在每个段的基础上缓存的,而从一个小的段里驱逐过滤器,代价比从一个大的段里要廉价的多。有可能你有很大的驱逐数,但是它们都发生在小段上,也就意味着这些对查询性能只有很小的影响。
把驱逐数指标作为一个粗略的参考。如果你看到数字很大,检查一下你的过滤器,确保他们都是正常缓存的。不断驱逐着的过滤器,哪怕都发生在很小的段上,效果也比正确缓存住了的过滤器差很多。
-
field_data
显示 fielddata 使用的内存, 用以聚合、排序等等。这里也有一个驱逐计数。和filter_cache
不同的是,这里的驱逐计数是很有用的:这个数应该或者至少是接近于 0。因为 fielddata 不是缓存,任何驱逐都消耗巨大,应该避免掉。如果你在这里看到驱逐数,你需要重新评估你的内存情况,fielddata 限制,请求语句,或者这三者。 segments
会展示这个节点目前正在服务中的 Lucene 段的数量。 这是一个重要的数字。大多数索引会有大概 50–150 个段,哪怕它们存有 TB 级别的数十亿条文档。段数量过大表明合并出现了问题(比如,合并速度跟不上段的创建)。注意这个统计值是节点上所有索引的汇聚总数。记住这点。
memory
统计值展示了 Lucene 段自己用掉的内存大小。 这里包括底层数据结构,比如倒排表,字典,和布隆过滤器等。太大的段数量会增加这些数据结构带来的开销,这个内存使用量就是一个方便用来衡量开销的度量值。
操作系统和进程部分
OS
和 Process
部分基本是自描述的,不会在细节中展开讲解。它们列出来基础的资源统计值,比如 CPU 和负载。OS
部分描述了整个操作系统,而 Process
部分只显示 Elasticsearch 的 JVM 进程使用的资源情况。
这些都是非常有用的指标,不过通常在你的监控技术栈里已经都测量好了。统计值包括下面这些:
- CPU
- 负载
- 内存使用率 (mem.used_percent)
- Swap 使用率
- 打开的文件描述符 (open_file_descriptors)
JVM 部分
jvm
部分包括了运行 Elasticsearch 的 JVM 进程一些很关键的信息。 最重要的,它包括了垃圾回收的细节,这对你的 Elasticsearch 集群的稳定性有着重大影响。
jvm: {
timestamp: 1508312932369,
uptime_in_millis: 797735804,
mem: {
heap_used_in_bytes: 318233768,
heap_used_percent: 30,
heap_committed_in_bytes: 1038876672,
heap_max_in_bytes: 1038876672,
non_heap_used_in_bytes: 102379784,
non_heap_committed_in_bytes: 108773376,
}
}
jvm
部分首先列出一些和 heap 内存使用有关的常见统计值。你可以看到有多少 heap 被使用了,多少被指派了(当前被分配给进程的),以及 heap 被允许分配的最大值。理想情况下,heap_committed_in_bytes
应该等于 heap_max_in_bytes
。如果指派的大小更小,JVM 最终会被迫调整 heap 大小——这是一个非常昂贵的操作。如果你的数字不相等,阅读 堆内存:大小和交换 学习如何正确的配置它。
heap_used_percent
指标是值得关注的一个数字。Elasticsearch 被配置为当 heap 达到 75% 的时候开始 GC。如果你的节点一直 >= 75%,你的节点正处于 内存压力 状态。这是个危险信号,不远的未来可能就有慢 GC 要出现了。
如果 heap 使用率一直 >=85%,你就麻烦了。Heap 在 90–95% 之间,则面临可怕的性能风险,此时最好的情况是长达 10–30s 的 GC,最差的情况就是内存溢出(OOM)异常。
线程池部分
Elasticsearch 在内部维护了线程池。 这些线程池相互协作完成任务,有必要的话相互间还会传递任务。通常来说,你不需要配置或者调优线程池,不过查看它们的统计值有时候还是有用的,可以洞察你的集群表现如何。
每个线程池会列出已配置的线程数量( threads
),当前在处理任务的线程数量( active
),以及在队列中等待处理的任务单元数量( queue
)。
如果队列中任务单元数达到了极限,新的任务单元会开始被拒绝,你会在 rejected
统计值上看到它反映出来。这通常是你的集群在某些资源上碰到瓶颈的信号。因为队列满意味着你的节点或集群在用最高速度运行,但依然跟不上工作的蜂拥而入。
这里的一系列的线程池,大多数你可以忽略,但是有一小部分还是值得关注的:
indexing
普通的索引请求的线程池bulk
批量请求,和单条的索引请求不同的线程池get
Get-by-ID 操作search
所有的搜索和查询请求merging
专用于管理 Lucene 合并的线程池
网络部分
transport
显示和 传输地址 相关的一些基础统计值。包括节点间的通信(通常是 9300 端口)以及任意传输客户端或者节点客户端的连接。如果看到这里有很多连接数不要担心;Elasticsearch 在节点之间维护了大量的连接。http
显示 HTTP 端口(通常是 9200)的统计值。如果你看到total_opened
数很大而且还在一直上涨,这是一个明确信号,说明你的 HTTP 客户端里有没启用 keep-alive 长连接的。持续的 keep-alive 长连接对性能很重要,因为连接、断开套接字是很昂贵的(而且浪费文件描述符)。请确认你的客户端都配置正确。
参考资料
3、ES监控指标
最后:
转载请注明地址:http://www.54tianzhisheng.cn/2017/10/18/ElasticSearch-nodes-metrics/
收起阅读 »社区日报 第92期 (2017-11-06)
http://t.cn/Rl6ZoRX
2.在vscode中调试es查询语句。
http://t.cn/Rlio50B
3.全面介绍韩语分词器。
http://t.cn/Rli9inA
编辑:cybredak
归档:https://elasticsearch.cn/article/354
订阅:https://tinyletter.com/elastic-daily
http://t.cn/Rl6ZoRX
2.在vscode中调试es查询语句。
http://t.cn/Rlio50B
3.全面介绍韩语分词器。
http://t.cn/Rli9inA
编辑:cybredak
归档:https://elasticsearch.cn/article/354
订阅:https://tinyletter.com/elastic-daily 收起阅读 »
社区日报 第91期 (2017-11-05)
http://t.cn/RWeyM6d
2.(自备梯子)非常全面的介绍ElasticSearch的特点,使用案例和推荐书籍。
http://t.cn/RlfRbkm
3.使用Kubernetes管理日志记录。
http://t.cn/RlfRcwf
编辑:至尊宝
归档:https://elasticsearch.cn/article/353
订阅:https://tinyletter.com/elastic-daily
http://t.cn/RWeyM6d
2.(自备梯子)非常全面的介绍ElasticSearch的特点,使用案例和推荐书籍。
http://t.cn/RlfRbkm
3.使用Kubernetes管理日志记录。
http://t.cn/RlfRcwf
编辑:至尊宝
归档:https://elasticsearch.cn/article/353
订阅:https://tinyletter.com/elastic-daily 收起阅读 »
社区日报 第90期 (2017-11-04)
http://t.cn/RWqayNZ
2、.Net开发者使用ES教程
http://t.cn/RlGuApp
3、一款与位置有关的相似插件
http://t.cn/RlqbzDF
编辑:bsll
归档:https://www.elasticsearch.cn/article/352
订阅:https://tinyletter.com/elastic-daily
http://t.cn/RWqayNZ
2、.Net开发者使用ES教程
http://t.cn/RlGuApp
3、一款与位置有关的相似插件
http://t.cn/RlqbzDF
编辑:bsll
归档:https://www.elasticsearch.cn/article/352
订阅:https://tinyletter.com/elastic-daily
收起阅读 »
社区日报 第89期 (2017-11-03)
http://t.cn/Rlwub5s
2、可行 | 解决Unassigned Shards大探讨
http://t.cn/RlwuVFn
3、快照&重新存储数据方案
http://t.cn/RlwuXmm
活动预告:Elastic 武汉交流会
https://elasticsearch.cn/article/344
编辑:laoyang360
归档:https://elasticsearch.cn/article/351
订阅:https://tinyletter.com/elastic-daily
http://t.cn/Rlwub5s
2、可行 | 解决Unassigned Shards大探讨
http://t.cn/RlwuVFn
3、快照&重新存储数据方案
http://t.cn/RlwuXmm
活动预告:Elastic 武汉交流会
https://elasticsearch.cn/article/344
编辑:laoyang360
归档:https://elasticsearch.cn/article/351
订阅:https://tinyletter.com/elastic-daily
收起阅读 »
Elasticsearch 安全 (希望日报能给我发下。)
http://rickywag.com/archives/618
http://rickywag.com/archives/618
社区日报 第88期 (2017-11-02)
https://elasticsearch.cn/article/348
2.elasticsearch api 101
http://t.cn/RlZ1PND
3.一个免费的支持kibana多租户、加密、认证、授权、审计的Elasticsearch和Kibana安全插件
http://t.cn/RZpF03g
活动预告:Elastic 武汉交流会
https://elasticsearch.cn/article/344
感谢社区well的投稿
编辑:金桥
归档:https://elasticsearch.cn/article/349
订阅:https://tinyletter.com/elastic-daily
https://elasticsearch.cn/article/348
2.elasticsearch api 101
http://t.cn/RlZ1PND
3.一个免费的支持kibana多租户、加密、认证、授权、审计的Elasticsearch和Kibana安全插件
http://t.cn/RZpF03g
活动预告:Elastic 武汉交流会
https://elasticsearch.cn/article/344
感谢社区well的投稿
编辑:金桥
归档:https://elasticsearch.cn/article/349
订阅:https://tinyletter.com/elastic-daily 收起阅读 »
ES集群服务器CPU负载瞬间飚高分析
尝试了一些命令后,发现和使用 JVM 命令一样,搞不定,比如用 ltrace 就导致 JVM 进程僵死。由于并非稳定重现,耗时好几天,才使用 strace -T -r -c -f -F -p 得到 futex、epoll_wait 占用资源。这不行,这些信息不足以说明或支撑如何解决负载问题,但 futex 这个是系统调用是互斥的信号,难道有锁方面问题,似乎应该从这个方面下手。
Linux 中有什么好的工具能在这种敲命令都没响应的情况下来获取一些信息呢?于是再找一些工具,gdb 尝试了下,直接卡死,搞不定。gstack、gcore 都不行,难道非得要 dump kernel core?
但即使得到了,我对 Linux 内核的分析还没多少经验,而且耗时,中间少不了服务器频繁重启,不到万不得已不走这一步。
找了一些工具:systemtap、stap、dtrace、perf 等,于是在非繁忙时候搞了一把,systemtap 的 On-CPU、Off-CPU 及火焰图不错,至少我能拿到内核系统调用到底是哪些,然后针对火焰图里耗时的系统调用信息再找具体的解决方案。systemtap 虽好,但那个 sample-bt 脚本总不如意,在负载高的时候被自己的资源限制,改了些参数也不如意。于是转向 perf,这玩意好,轻量级,就取个 60s 信息,多来几把,嘿嘿,还正搞出一些数据。
# perf record -F 99 -ag -o p1.data -- sleep 60
# perf script -i p1.data | ./stackcollapse-perf.pl > out.perf-folded
# cat out.perf-folded | ./flamegraph.pl > perf-kernel-1.svg
将分析的数据转换为火焰图,用火眼金睛照一照,还真能看出一些问题。
通过调用依赖关系分析,根据 _spin_lock_irq 初步推测问题由 kernel 的内存管理部分触发。
似乎 CentOS 6 相对于 CentOS 5 在 kernel 内存管理模块的一些改进点(如 transparent huge page, 基于 NUMA 的内存分配等),有没有可能是 CentOS 6 新增的 THP 特性导致 cpu sys 过高?搜索下相关函数名的关键字,确定猜测正确。通过以下内核参数优化关闭系统 THP 特性(临时生效):
# echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
# echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag
从火焰图我们也可以看到,申请内存的线程在等待自旋锁,操作系统现在正回收 pagecache 到 freelist。于是 zone 里来申请内存的线程都得在这里等待着,于是 load 值就高了上来。外在的表现就是,系统反应好慢啊,ssh 都登不进去(因为 ssh 也会申请内存);即使登录进去了,敲命令也没有反应(因为这些命令也都是需要申请内存的)。
几个概念(来源于网络):
page cache
导致这个情况的原因是:线程在申请内存的时候,发现该 zone 的 freelist 上已经没有足够的内存可用,所以不得不去从该 zone 的 LRU 链表里回收 inactive 的 page,这种情况就是 direct reclaim(直接回收)。direct reclaim 会比较消耗时间的原因是,它在回收的时候不会区分 dirty page 和 clean page,
如果回收的是 dirty page,就会触发磁盘 IO 的操作,它会首先把 dirty page 里面的内容给刷写到磁盘,再去把该 page 给放到 freelist 里。
page reclaim
在直观上,我们有一个认知,当读了一个文件,它会被缓存到内存里面,如果接下来的一几天我们一直都不会再次访问它,而且这几天都不会关闭或者重启机器,那么在这几天之后该文件就不应该再在内存里头了。这就是内核对 page cache 的管理策略:LRU(最近最少使用)。即把最近最少使用的 page cache 给回收为 free pages。
内核的页回收机制有两种:后台回收和直接回收。
后台回收是有一个内核线程 kswapd 来做的,当内存里 free 的 pages 低于一个水位(page_low)时,就会唤醒该内核线程,然后它从 LRU 链表里回收 page cache 到内存的 free_list 里头,它会一直回收直至 free 的 pages 达到另外一个水位 page_high. 如下图所示:
直接回收则是,在发生 page fault 时,没有足够可用的内存,于是线程就自己直接去回收内存,它一次性的会回收 32 个 pages。逻辑过程如下图所示
所以要避免做 direct reclaim。
memory zone
对于多核 NUMA 系统而言,内存是分节点的,不同的 CPU 对不同的内存节点的访问速度是不一样的,所以 CPU 会优先去访问靠近自己的内存节点(即速度相对快的内存区域)。
CPU 内部是依靠 MMU 来进行内存管理的,根据内存属性的不同,MMU 将一个内存节点内部又划分了不同的 zone。
对 64-bit 系统而言,一个内存节点包含三个 zone:Normal,DMA,DMA32.
对 32-bit 系统而言,一个内存节点则是包括 zone:Normal,Highmem,DMA。
Highmem 存在的目的是为了解决线性地址空间不够用的问题,在 64-bit 上由于有足够的线性地址空间所以就没了该 zone。不同 zone 存在的目的是基于数据的局部性原则,我们在写代码的时候也知道,把相关的数据给放在一起可以提高性能,memory zone 也是这个道理。于是 MMU 在分配内存时,也会尽量给同一个进程分配同一个 zone 的内存。凡事有利就有弊,这样有好处自然也可能会带来一些坏处。
为了避免 direct reclaim,我们得保证在进程申请内存时有足够可用的 free pages,从前面我们可以看出,提高 watermark low 可以尽早的唤醒 kswapd,然后 kswapd 来做 background reclaim。为此,内核专门提供了一个 sysctl 接口给用户来使用:vm.extra_free_kbytes。
# cat /etc/sysctl.conf | grep kbytes
vm.extra_free_kbytes = 4096000
vm.min_free_kbytes = 2097152
于是我们增大这个值(比如增大到 5G),确实也解决了问题。增大该值来提高 low 水位,这样在申请内存的时候,如果 free 的内存低于了该水位,就会唤醒 kswapd 去做页回收,同时又由于还有足够的 free 内存可用所以进程能够正常申请而不触发直接回收。
线程的回收跟 memory zone 相关。也就是说 normal zone 里面的 free pages 不够用了,于是触发了 direct reclaim。但是,假如此时 DMA zone 里还有足够的 free pages 呢?线程会不会从 DMA zone 里来申请内存呢?
free 的 pages 都在其它的 zone 里头,所以线程去回收自己 zone 的 page cache 而不去使用其它 zone 的 free pages。对于这个内核也提供了一个接口给用户使用:vm.zone_reclaim_mode. 这个值在该机器上本来是1(即宁肯回收自己 zone 的 page cache,也不去申请其它 zone 的 free pages),我把它更改为0(即只要其它 zone 有 free pages 就去其它 zone 里申请),就解决了该问题(一设置后系统就恢复了正常)
从这个问题也可以看出,Linux 内核提供了各种各样的机制,然后我们根据具体的使用场景来选择使用的策略。目的是为了在不影响稳定性的前提下,尽可能的提升系统性能。
Linux 机制的多种多样,也给上层的开发者带来了一些苦恼:由于对底层了解的不深入,就很难选择出一个很好的策略来使用这些内核机制。
然而对这些机制的使用,也不会有一个万能公式,还是要看具体的使用场景。由于搜索服务器存在很多批量文件操作,所以对 page cache 的使用很频繁,
所以我们才选择了尽早的能够触发 background reclaim 这个策略;而如果你的文件操作不频繁,显然就没有必要去尽早的唤醒后台回收线程。
另外一个,作为一个文件服务器,它对 page cache 的需求是很大的,越多的内存作为 page cache,系统的整体性能就会越好,所以我们就没有必要为了数据的局部性而预留 DMA 内存,
两相比较肯定是 page cache 对性能的提升大于数据的局部性对性能的提升;而如果你的文件操作不多的话,那还是打开 zone_reclaim 的。
# cat /etc/sysctl.conf | grep zone
vm.zone_reclaim_mode = 0
经过调整以上这几个参数后,再持续监控一段时间,问题得以解决。
在 redhat 官网和 cloudera 官网也搜到了相关的内容,附录下来,供参考。
在 redhat 的官网上,有对THP特性的细化说明:
https://access.redhat.com/site ... .html
在 cloudera 的 CDH4 部署说明中,也建议将系统的 THP 的 compaction 特性关闭:
http://www.cloudera.com/conten ... .html
尝试了一些命令后,发现和使用 JVM 命令一样,搞不定,比如用 ltrace 就导致 JVM 进程僵死。由于并非稳定重现,耗时好几天,才使用 strace -T -r -c -f -F -p 得到 futex、epoll_wait 占用资源。这不行,这些信息不足以说明或支撑如何解决负载问题,但 futex 这个是系统调用是互斥的信号,难道有锁方面问题,似乎应该从这个方面下手。
Linux 中有什么好的工具能在这种敲命令都没响应的情况下来获取一些信息呢?于是再找一些工具,gdb 尝试了下,直接卡死,搞不定。gstack、gcore 都不行,难道非得要 dump kernel core?
但即使得到了,我对 Linux 内核的分析还没多少经验,而且耗时,中间少不了服务器频繁重启,不到万不得已不走这一步。
找了一些工具:systemtap、stap、dtrace、perf 等,于是在非繁忙时候搞了一把,systemtap 的 On-CPU、Off-CPU 及火焰图不错,至少我能拿到内核系统调用到底是哪些,然后针对火焰图里耗时的系统调用信息再找具体的解决方案。systemtap 虽好,但那个 sample-bt 脚本总不如意,在负载高的时候被自己的资源限制,改了些参数也不如意。于是转向 perf,这玩意好,轻量级,就取个 60s 信息,多来几把,嘿嘿,还正搞出一些数据。
# perf record -F 99 -ag -o p1.data -- sleep 60
# perf script -i p1.data | ./stackcollapse-perf.pl > out.perf-folded
# cat out.perf-folded | ./flamegraph.pl > perf-kernel-1.svg
将分析的数据转换为火焰图,用火眼金睛照一照,还真能看出一些问题。
通过调用依赖关系分析,根据 _spin_lock_irq 初步推测问题由 kernel 的内存管理部分触发。
似乎 CentOS 6 相对于 CentOS 5 在 kernel 内存管理模块的一些改进点(如 transparent huge page, 基于 NUMA 的内存分配等),有没有可能是 CentOS 6 新增的 THP 特性导致 cpu sys 过高?搜索下相关函数名的关键字,确定猜测正确。通过以下内核参数优化关闭系统 THP 特性(临时生效):
# echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
# echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag
从火焰图我们也可以看到,申请内存的线程在等待自旋锁,操作系统现在正回收 pagecache 到 freelist。于是 zone 里来申请内存的线程都得在这里等待着,于是 load 值就高了上来。外在的表现就是,系统反应好慢啊,ssh 都登不进去(因为 ssh 也会申请内存);即使登录进去了,敲命令也没有反应(因为这些命令也都是需要申请内存的)。
几个概念(来源于网络):
page cache
导致这个情况的原因是:线程在申请内存的时候,发现该 zone 的 freelist 上已经没有足够的内存可用,所以不得不去从该 zone 的 LRU 链表里回收 inactive 的 page,这种情况就是 direct reclaim(直接回收)。direct reclaim 会比较消耗时间的原因是,它在回收的时候不会区分 dirty page 和 clean page,
如果回收的是 dirty page,就会触发磁盘 IO 的操作,它会首先把 dirty page 里面的内容给刷写到磁盘,再去把该 page 给放到 freelist 里。
page reclaim
在直观上,我们有一个认知,当读了一个文件,它会被缓存到内存里面,如果接下来的一几天我们一直都不会再次访问它,而且这几天都不会关闭或者重启机器,那么在这几天之后该文件就不应该再在内存里头了。这就是内核对 page cache 的管理策略:LRU(最近最少使用)。即把最近最少使用的 page cache 给回收为 free pages。
内核的页回收机制有两种:后台回收和直接回收。
后台回收是有一个内核线程 kswapd 来做的,当内存里 free 的 pages 低于一个水位(page_low)时,就会唤醒该内核线程,然后它从 LRU 链表里回收 page cache 到内存的 free_list 里头,它会一直回收直至 free 的 pages 达到另外一个水位 page_high. 如下图所示:
直接回收则是,在发生 page fault 时,没有足够可用的内存,于是线程就自己直接去回收内存,它一次性的会回收 32 个 pages。逻辑过程如下图所示
所以要避免做 direct reclaim。
memory zone
对于多核 NUMA 系统而言,内存是分节点的,不同的 CPU 对不同的内存节点的访问速度是不一样的,所以 CPU 会优先去访问靠近自己的内存节点(即速度相对快的内存区域)。
CPU 内部是依靠 MMU 来进行内存管理的,根据内存属性的不同,MMU 将一个内存节点内部又划分了不同的 zone。
对 64-bit 系统而言,一个内存节点包含三个 zone:Normal,DMA,DMA32.
对 32-bit 系统而言,一个内存节点则是包括 zone:Normal,Highmem,DMA。
Highmem 存在的目的是为了解决线性地址空间不够用的问题,在 64-bit 上由于有足够的线性地址空间所以就没了该 zone。不同 zone 存在的目的是基于数据的局部性原则,我们在写代码的时候也知道,把相关的数据给放在一起可以提高性能,memory zone 也是这个道理。于是 MMU 在分配内存时,也会尽量给同一个进程分配同一个 zone 的内存。凡事有利就有弊,这样有好处自然也可能会带来一些坏处。
为了避免 direct reclaim,我们得保证在进程申请内存时有足够可用的 free pages,从前面我们可以看出,提高 watermark low 可以尽早的唤醒 kswapd,然后 kswapd 来做 background reclaim。为此,内核专门提供了一个 sysctl 接口给用户来使用:vm.extra_free_kbytes。
# cat /etc/sysctl.conf | grep kbytes
vm.extra_free_kbytes = 4096000
vm.min_free_kbytes = 2097152
于是我们增大这个值(比如增大到 5G),确实也解决了问题。增大该值来提高 low 水位,这样在申请内存的时候,如果 free 的内存低于了该水位,就会唤醒 kswapd 去做页回收,同时又由于还有足够的 free 内存可用所以进程能够正常申请而不触发直接回收。
线程的回收跟 memory zone 相关。也就是说 normal zone 里面的 free pages 不够用了,于是触发了 direct reclaim。但是,假如此时 DMA zone 里还有足够的 free pages 呢?线程会不会从 DMA zone 里来申请内存呢?
free 的 pages 都在其它的 zone 里头,所以线程去回收自己 zone 的 page cache 而不去使用其它 zone 的 free pages。对于这个内核也提供了一个接口给用户使用:vm.zone_reclaim_mode. 这个值在该机器上本来是1(即宁肯回收自己 zone 的 page cache,也不去申请其它 zone 的 free pages),我把它更改为0(即只要其它 zone 有 free pages 就去其它 zone 里申请),就解决了该问题(一设置后系统就恢复了正常)
从这个问题也可以看出,Linux 内核提供了各种各样的机制,然后我们根据具体的使用场景来选择使用的策略。目的是为了在不影响稳定性的前提下,尽可能的提升系统性能。
Linux 机制的多种多样,也给上层的开发者带来了一些苦恼:由于对底层了解的不深入,就很难选择出一个很好的策略来使用这些内核机制。
然而对这些机制的使用,也不会有一个万能公式,还是要看具体的使用场景。由于搜索服务器存在很多批量文件操作,所以对 page cache 的使用很频繁,
所以我们才选择了尽早的能够触发 background reclaim 这个策略;而如果你的文件操作不频繁,显然就没有必要去尽早的唤醒后台回收线程。
另外一个,作为一个文件服务器,它对 page cache 的需求是很大的,越多的内存作为 page cache,系统的整体性能就会越好,所以我们就没有必要为了数据的局部性而预留 DMA 内存,
两相比较肯定是 page cache 对性能的提升大于数据的局部性对性能的提升;而如果你的文件操作不多的话,那还是打开 zone_reclaim 的。
# cat /etc/sysctl.conf | grep zone
vm.zone_reclaim_mode = 0
经过调整以上这几个参数后,再持续监控一段时间,问题得以解决。
在 redhat 官网和 cloudera 官网也搜到了相关的内容,附录下来,供参考。
在 redhat 的官网上,有对THP特性的细化说明:
https://access.redhat.com/site ... .html
在 cloudera 的 CDH4 部署说明中,也建议将系统的 THP 的 compaction 特性关闭:
http://www.cloudera.com/conten ... .html 收起阅读 »
社区日报 第87期 (2017-11-01)
http://t.cn/RlvDxqS
2. 你真的了解 ES 的分页么?
http://t.cn/Rlvzfni
3. 分页查询 From&Size VS scroll
http://t.cn/RGBeOOK
活动预告:Elastic 武汉交流会
https://elasticsearch.cn/article/344
编辑:江水
归档:https://elasticsearch.cn/article/347
订阅:https://tinyletter.com/elastic-daily
http://t.cn/RlvDxqS
2. 你真的了解 ES 的分页么?
http://t.cn/Rlvzfni
3. 分页查询 From&Size VS scroll
http://t.cn/RGBeOOK
活动预告:Elastic 武汉交流会
https://elasticsearch.cn/article/344
编辑:江水
归档:https://elasticsearch.cn/article/347
订阅:https://tinyletter.com/elastic-daily 收起阅读 »
社区日报 第86期 (2017-10-31)
http://t.cn/RWrfOI7
2.基于 Elasticsearch实现搜索建议的一些方法。
http://t.cn/RWrfudV
3.如何在windows上安装Logstash与Kibana。
http://t.cn/RWrfQij
活动预告:Elastic 武汉交流会
https://elasticsearch.cn/article/344
编辑:叮咚光军
归档:https://elasticsearch.cn/article/345
订阅:https://tinyletter.com/elastic-daily
http://t.cn/RWrfOI7
2.基于 Elasticsearch实现搜索建议的一些方法。
http://t.cn/RWrfudV
3.如何在windows上安装Logstash与Kibana。
http://t.cn/RWrfQij
活动预告:Elastic 武汉交流会
https://elasticsearch.cn/article/344
编辑:叮咚光军
归档:https://elasticsearch.cn/article/345
订阅:https://tinyletter.com/elastic-daily
收起阅读 »
Elastic Meetup 武汉交流会
Elastic Meetup 线下交流活动首次来到江城武汉,武汉是湖北省省会、中部六省唯一的副省级市和特大城市、中国中部地区的中心城市,全国重要的工业基地、科教基地和综合交通枢纽。
主办:
本次活动由 Elastic 与 猫友会 联合举办。
媒体:
本次活动由 IT大咖说 独家提供现场直播。
时间:
2017.11.4 下午2:00-5:00(1点半开始签到)
地点:
氪空间(武汉市武昌区湖北省科技创业大厦A栋3楼客空间)
主题:
Elastic - Medcl - Elastic Stack 6.0 新功能介绍
尚德机构 - 白凡 - 高吞吐状况下斗鱼搜索引擎优化之路
基于爬虫和 Elasticsearch 快速构建站内搜索引擎
闪电分享(5-10分钟,可现场报名)
参会报名:
http://elasticsearch.mikecrm.com/O6o0yq3
现场直播
现场交流微信群
(❗️⚠️请注意:限武汉本地同学,外地毋加,微信人数限制,仅供现场参会人员沟通使用,谢谢合作???)
广州、深圳也在筹备中:https://elasticsearch.cn/article/261
关于 Elastic Meetup
Elastic Meetup 由 Elastic 中文社区定期举办的线下交流活动,主要围绕 Elastic 的开源产品(Elasticsearch、Logstash、Kibana 和 Beats)及周边技术,探讨在搜索、数据实时分析、日志分析、安全等领域的实践与应用。
关于 Elastic
Elastic 通过构建软件,让用户能够实时地、大规模地将数据用于搜索、日志和分析场景。Elastic 创立于 2012 年,相继开发了开源的 Elastic Stack(Elasticsearch、Kibana、Beats 和 Logstash)、X-Pack(商业功能)和 Elastic Cloud(托管服务)。截至目前,累计下载量超过 1.5 亿。Benchmark Capital、Index Ventures 和 NEA 为 Elastic 提供了超过 1 亿美元资金作为支持,Elastic 共有 600 多名员工,分布在 30 个国家/地区。有关更多信息,请访问 http://elastic.co/cn 。
关于猫友会
猫友会介绍:猫友会通过“人才回流,知识回流,创业回流”,来改变武汉互联网的行业环境。目前是影响力最大的湖北籍互联网社群,聚集了世界各地的5000余名湖北籍的互联网工程师。猫友会社区http://bbs.maoyouhui.cc. 光谷猫友会公众号:mtydev。
关于IT大咖说
IT大咖说,IT垂直领域的大咖知识分享平台,践行“开源是一种态度”,通过线上线下开放模式分享行业TOP大咖干货,技术大会在线直播点播,在线活动直播平台。http://www.itdks.com 。
再次感谢猫友会和IT大咖说的大力支持!
Elastic Meetup 线下交流活动首次来到江城武汉,武汉是湖北省省会、中部六省唯一的副省级市和特大城市、中国中部地区的中心城市,全国重要的工业基地、科教基地和综合交通枢纽。
主办:
本次活动由 Elastic 与 猫友会 联合举办。
媒体:
本次活动由 IT大咖说 独家提供现场直播。
时间:
2017.11.4 下午2:00-5:00(1点半开始签到)
地点:
氪空间(武汉市武昌区湖北省科技创业大厦A栋3楼客空间)
主题:
Elastic - Medcl - Elastic Stack 6.0 新功能介绍
尚德机构 - 白凡 - 高吞吐状况下斗鱼搜索引擎优化之路
基于爬虫和 Elasticsearch 快速构建站内搜索引擎
闪电分享(5-10分钟,可现场报名)
参会报名:
http://elasticsearch.mikecrm.com/O6o0yq3
现场直播
现场交流微信群
(❗️⚠️请注意:限武汉本地同学,外地毋加,微信人数限制,仅供现场参会人员沟通使用,谢谢合作???)
广州、深圳也在筹备中:https://elasticsearch.cn/article/261
关于 Elastic Meetup
Elastic Meetup 由 Elastic 中文社区定期举办的线下交流活动,主要围绕 Elastic 的开源产品(Elasticsearch、Logstash、Kibana 和 Beats)及周边技术,探讨在搜索、数据实时分析、日志分析、安全等领域的实践与应用。
关于 Elastic
Elastic 通过构建软件,让用户能够实时地、大规模地将数据用于搜索、日志和分析场景。Elastic 创立于 2012 年,相继开发了开源的 Elastic Stack(Elasticsearch、Kibana、Beats 和 Logstash)、X-Pack(商业功能)和 Elastic Cloud(托管服务)。截至目前,累计下载量超过 1.5 亿。Benchmark Capital、Index Ventures 和 NEA 为 Elastic 提供了超过 1 亿美元资金作为支持,Elastic 共有 600 多名员工,分布在 30 个国家/地区。有关更多信息,请访问 http://elastic.co/cn 。
关于猫友会
猫友会介绍:猫友会通过“人才回流,知识回流,创业回流”,来改变武汉互联网的行业环境。目前是影响力最大的湖北籍互联网社群,聚集了世界各地的5000余名湖北籍的互联网工程师。猫友会社区http://bbs.maoyouhui.cc. 光谷猫友会公众号:mtydev。
关于IT大咖说
IT大咖说,IT垂直领域的大咖知识分享平台,践行“开源是一种态度”,通过线上线下开放模式分享行业TOP大咖干货,技术大会在线直播点播,在线活动直播平台。http://www.itdks.com 。
再次感谢猫友会和IT大咖说的大力支持! 收起阅读 »