elasticsearch性能调优

集群规划

  • 独立的master节点,不存储数据, 数量不少于2
  • 数据节点(Data Node)
  • 查询节点(Query Node),起到负载均衡的作用

Linux系统参数配置

文件句柄

Linux中,每个进程默认打开的最大文件句柄数是1000,对于服务器进程来说,显然太小,通过修改/etc/security/limits.conf来增大打开最大句柄数

  1. * - nofile 65535

虚拟内存设置

max_map_count定义了进程能拥有的最多内存区域

  1. sysctl -w vm.max_map_count=262144

修改/etc/elasticsearch/elasticsearch.yml

  1. bootstrap.mlockall: true

修改/etc/security/limits.conf, 在limits.conf中添加如下内容

  1. * soft memlock unlimited
  2. * hard memlock unlimited

memlock 最大锁定内存地址空间, 要使limits.conf文件配置生效,必须要确保pam_limits.so文件被加入到启动文件中。

确保/etc/pam.d/login文件中有如下内容

  1. session required /lib/security/pam_limits.so

验证是否生效

  1. curl localhost:9200/_nodes/stats/process?pretty

磁盘缓存相关参数

vm.dirty_background_ratio 这个参数指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如5%)就会触发pdflush/flush/kdmflush等后台回写进程运行,将一定缓存的脏页异步地刷入外存;

vm.dirty_ratio

  1. 该参数则指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如10%),系统不得不开始处理缓存脏页(因为此时脏页数量已经比较多,为了避免数据丢失需要将一定脏页刷入外存);在此过程中很多应用进程可能会因为系统转而处理文件IO而阻塞。

  2. 把该参数适当调小,原理通(1)类似。如果cached的脏数据所占比例(这里是占MemTotal的比例)超过这个设置,系统会停止所有的应用层的IO写操作,等待刷完数据后恢复IO。所以万一触发了系统的这个操作,对于用户来说影响非常大的。

  1. sysctl -w vm.dirty_ratio=10
  2. sysctl -w vm.dirty_background_ratio=5

为了将设置永久保存,将上述配置项写入/etc/sysctl.conf文件中

  1. vm.dirty_ratio = 10
  2. vm.dirty_background_ratio = 5

swap调优

swap空间是一块磁盘空间,操作系统使用这块空间保存从内存中换出的操作系统不常用page数据,这样可以分配出更多的内存做page cache。这样通常会提升系统的吞吐量和IO性能,但同样会产生很多问题。页面频繁换入换出会产生IO读写、操作系统中断,这些都很影响系统的性能。这个值越大操作系统就会更加积极的使用swap空间。

调节swappniess方法如下

  1. sudo sh -c 'echo "0">/proc/sys/vm/swappiness'

io sched

如果集群中使用的是SSD磁盘,那么可以将默认的io sched由cfq设置为noop

  1. sudo sh -c 'echo "noop">/sys/block/sda/queue/scheduler'

JVM参数设置

在/etc/sysconfig/elasticsearch中设置最大堆内存,该值不应超过32G

  1. ES_HEAP_SIZE=32g
  2. ES_JAVA_OPTS="-Xms32g"
  3. MAX_LOCKED_MEMORY=unlimited
  4. MAX_OPEN_FILES=65535

indice参数调优

以创建demo_logs模板为例,说明可以调优的参数及其数值设定原因。

  1. PUT _template/demo_logs
  2. {
  3. "order": 6,
  4. "template": "demo-*",
  5. "settings": {
  6. "index.merge.policy.segments_per_tier": "25",
  7. "index.mapping._source.compress": "true",
  8. "index.mapping._all.enabled": "false",
  9. "index.warmer.enabled": "false",
  10. "index.merge.policy.min_merge_size": "10mb",
  11. "index.refresh_interval": "60s",
  12. "index.number_of_shards": "7",
  13. "index.translog.durability": "async",
  14. "index.store.type": "mmapfs",
  15. "index.merge.policy.floor_segment": "100mb",
  16. "index.merge.scheduler.max_thread_count": "1",
  17. "index.translog.translog.flush_threshold_size": "1g",
  18. "index.merge.policy.merge_factor": "15",
  19. "index.translog.translog.flush_threshold_period": "100m",
  20. "index.translog.sync_interval": "5s",
  21. "index.number_of_replicas": "1",
  22. "index.indices.store.throttle.max_bytes_per_sec": "50mb",
  23. "index.routing.allocation.total_shards_per_node": "2",
  24. "index.translog.flush_threshold_ops": "1000000"
  25. },
  26. "mappings": {
  27. "_default_": {
  28. "dynamic_templates": [
  29. {
  30. "string_template": {
  31. "mapping": {
  32. "index": "not_analyzed",
  33. "ignore_above": "10915",
  34. "type": "string"
  35. },
  36. "match_mapping_type": "string"
  37. }
  38. },
  39. {
  40. "level_fields": {
  41. "mapping": {
  42. "index": "no",
  43. "type": "string"
  44. },
  45. "match": "Level*Exception*"
  46. }
  47. }
  48. ]
  49. }
  50. }
  51. "aliases": {}
  52. }

replica数目

为了让创建的es index在每台datanode上均匀分布,同一个datanode上同一个index的shard数目不应超过3个。

计算公式: (number_of_shard * (1+number_of_replicas)) < 3*number_of_datanodes

每台机器上分配的shard数目

  1. "index.routing.allocation.total_shards_per_node": "2",

refresh时间间隔

默认的刷新时间间隔是1s,对于写入量很大的场景,这样的配置会导致写入吞吐量很低,适当提高刷新间隔,可以提升写入量,代价就是让新写入的数据在60s之后可以被搜索,新数据可见的及时性有所下降。

  1. "index.refresh_interval": "60s"

translog

降低数据flush到磁盘的频率。如果对数据丢失有一定的容忍,可以打开async模式。

  1. "index.translog.flush_threshold_ops": "1000000",
  2. "index.translog.durability": "async",

merge相关参数

  1. "index.merge.policy.floor_segment": "100mb",
  2. "index.merge.scheduler.max_thread_count": "1",
  3. "index.merge.policy.min_merge_size": "10mb"

mapping设置

对于不参与搜索的字段(fields), 将其index方法设置为no, 如果对分词没有需求,对参与搜索的字段,其index方法设置为not_analyzed

多使用dynamic_template

集群参数调优

  1. {
  2. "persistent": {
  3. "cluster": {
  4. "routing": {
  5. "allocation": {
  6. "enable": "new_primaries",
  7. "cluster_concurrent_rebalance": "8",
  8. "allow_rebalance": "indices_primaries_active",
  9. "node_concurrent_recoveries": "8"
  10. }
  11. }
  12. },
  13. "indices": {
  14. "breaker": {
  15. "fielddata": {
  16. "limit": "30%"
  17. },
  18. "request": {
  19. "limit": "30%"
  20. }
  21. },
  22. "recovery": {
  23. "concurrent_streams": "10",
  24. "max_bytes_per_sec": "200mb"
  25. }
  26. }
  27. },
  28. "transient": {
  29. "indices": {
  30. "store": {
  31. "throttle": {
  32. "type": "merge",
  33. "max_bytes_per_sec": "50mb"
  34. }
  35. },
  36. "recovery": {
  37. "concurrent_streams": "8"
  38. }
  39. },
  40. "threadpool": {
  41. "bulk": {
  42. "type": "fixed"
  43. "queue_size": "1000",
  44. "size": "30"
  45. },
  46. "index": {
  47. "type": "fixed",
  48. "queue_size": "1200",
  49. "size": "30"
  50. }
  51. },
  52. "cluster": {
  53. "routing": {
  54. "allocation": {
  55. "enable": "all",
  56. "cluster_concurrent_rebalance": "8",
  57. "node_concurrent_recoveries": "15"
  58. }
  59. }
  60. }
  61. }
  62. }

避免shard的频繁rebalance,将allocation的类型设置为new_primaries, 将默认并行rebalance由2设置为更大的一些的值

避免每次更新mapping, 针对2.x以下的版本

  1. "indices.cluster.send_refresh_mapping": false

调整threadpool, size不要超过core数目,否则线程之间的context switching会消耗掉大量的cpu时间,导致load过高。 如果没有把握,那就不要去调整。

定期清理cache

为避免fields data占用大量的jvm内存,可以通过定期清理的方式来释放缓存的数据。释放的内容包括field data, filter cache, query cache

  1. curl -XPOST "localhost:9200/_cache/clear"

其它

  • marvel: 安装marvel插件,多观察系统资源占用情况,包括内存,cpu
  • 日志: 对es的运行日志要经常查看,检查index配置是否合理,以及入库数据是否存在异常

调优之后的运行效果

写入量稳定在30K/s

elasticsearch运维实战之2 - 系统性能调优的更多相关文章

  1. Linux运维最佳实践之网站调优

    高性能静态网站: 1.静态页面中针对图片进行浏览器(客户端)缓存,如公共JavaScript(jQuery,jQuery-1.12.1.min.js)进行缓存 2.对网站输入内容压缩(gzip) 3. ...

  2. Elasticsearch 运维实战之1 -- 集群规划

    规划一个可用于生产环境的elasticsearch集群. 集群节点划分 整个集群的节点分为以下三种主要类型 Master nodes -- 负责维护集群状态,不保存index数据, 硬件要求: 一般性 ...

  3. Elasticsearch运维经验总结

    Elasticsearch运维经验总结 2018年12月10日 16:38:41 运小白 阅读数 3811   版本说明:5.6.4(要严格注意ES及其插件.第三方工具的版本匹配关系) 系统负载:(日 ...

  4. 《Splunk智能运维实战》——1.7 为本书加载样本数据

    本节书摘来自华章计算机<Splunk智能运维实战>一书中的第1章,第1.7节,作者 [美]乔史·戴昆(Josh Diakun),保罗R.约翰逊(Paul R. Johnson),德莱克·默 ...

  5. CentOS7系统管理与运维实战

    CentOS7系统管理与运维实战 下载地址 https://pan.baidu.com/s/1KFHVI-XjGaLMrh39WuhyCw 扫码下面二维码关注公众号回复100007 获取分享码 本书目 ...

  6. Istio 运维实战系列(2):让人头大的『无头服务』-上

    本系列文章将介绍用户从 Spring Cloud,Dubbo 等传统微服务框架迁移到 Istio 服务网格时的一些经验,以及在使用 Istio 过程中可能遇到的一些常见问题的解决方法. 什么是『无头服 ...

  7. Istio 运维实战系列(3):让人头大的『无头服务』-下

    本系列文章将介绍用户从 Spring Cloud,Dubbo 等传统微服务框架迁移到 Istio 服务网格时的一些经验,以及在使用 Istio 过程中可能遇到的一些常见问题的解决方法. 失败的 Eur ...

  8. 运维实战案例之“Too many open files”错误与解决方法

    运维实战案例之"Too many open files"错误与解决方法   技术小甜 2017-11-16 15:02:00 浏览869 服务器 shell tomcat 脚本 o ...

  9. net 关于系统性能调优了解和看法

    系统性能调优这是每个大中型项目的必要手段,当系统运行积累到一定量的时候 这个时候就需要一个质变的过程那这个时候就少不了优化和调整 (前几天看了一篇文章 感觉写的挺好,也挺实在的  链接:http:// ...

随机推荐

  1. php魔术方法和魔术常量

    1.__construct() 实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用. 2.__destruct() 当删除一 ...

  2. C#静态常量和动态常量的区别

    C#拥有两种不同的常量:静态常量(compile-time constants)和动态常量(runtime  constants).它们有不同的特性,错误的使用不仅会损失效率,还可能造成错误.相比之下 ...

  3. ecplise 常用快捷键

    /* * alt+/ * * A:main * main+alt+/ * B:输出语句 * syso+alt+/ * C:提示作用 * * */ /* * 常用快捷键 * 1.格式化:ctrl+shi ...

  4. Angular2 指令

      1. 指令说明 Angular2 指令是构成Angular2应用程序的重要组成部分,指令主要用来对模板的标签或者元素附加一些新的特性或者功能,改变一个 DOM 元素的外观或行为,Angular2指 ...

  5. js颠倒数组元素顺序reverse()

    颠倒数组元素顺序reverse() reverse() 方法用于颠倒数组中元素的顺序. 语法: arrayObject.reverse() 注意:该方法会改变原来的数组,而不会创建新的数组. 定义数组 ...

  6. JAVA学习笔记之与C#对比

    最近在学习java,刚学完入门课程...下面说一下入门课程中相对印象深刻的知识点 JAVA-C#差异 1. for循环 C# string [] strarr=new string[5]; forea ...

  7. 统一配置管理-百度disconf

    之前一直采用properties文件管理配置信息,若是集群则每个机器上都要拷贝一份,每次修改也需要依次修改.一直在寻找统一修改,实时生效,方便修改,分环境分系统的配置管理,自己也在整理设计,若找不到合 ...

  8. Oracle的优化器介绍

    Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 ...

  9. 创建好Android Application Project 后运行就报错。

    如图: 这个问题有可能是有可能是没导入Android support库,简单了解一下: google提供了Android Support Library package 系列的包来保证来高版本sdk开 ...

  10. 【MyEcplise】build workspace卡死

    1.window-Perferences-MyEclipse-Validation 将Manual全部勾掉,Build只留Classpath DependencyValidator,其它全部勾掉. 2 ...