• elasticsearch性能因素总结


    一:硬件方面

     
    在预算充足的情况下。特别是一些高并发业务的搜索。硬件层面占用整个elasticsearch性能空间很大比例。
    1)内存:
    单实例的情况下,尽量分配32G,排序和统计都是以及内存计算的。
    2)硬盘:
    在条件允许下,尽量使用一些高性能io的硬盘,SSD
    3)CPU:
    在高并发的情况下,cpu的计算能力要求就很高了。cpu配置尽量高。
    4)网络:
    当然这个越大越好。。毕竟服务交互通过http 。网络传输是个很重要的因数
     

    二:OS 系统优化。

     
    1)选择CentOS 64位操作系统
    CentOS6.5/6.6/6.7         7以上系统有很大改变,建议稳定后采用。
    2)设置最大文件打开数
    ulimit -a  查看    
    ulimit -SHn 65535     s 代表软件资源,n代表硬件资源  系统重启之后恢复默认
    /etc/security/limits.conf    添加 * - nofile 65535
    3)优化相关内核参数
    查看当前TCP连接数:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}‘
     

    三:软件层面

     
    1)优化GC,减少GC时间。
      因为gc时会使jvm停止工作,如果某个节点gc时间过长,master ping3次(zen discovery默认ping失败重试3次)不通后就会把该节点剔除出集群,从而导致索引进行重新分配。解决办法:(1)优化gc,减少gc时间。(2)调大zen discovery的重试次数(es参数:ping_retries)和超时时间(es参数:ping_timeout)。后来发现根本原因是有个节点的系统所在硬盘满了。导致系统性能下降
    2)索引层面
    按着分词效率和业务契合度的 分词器。。优化segment。
    3)分片
    按着自己的业务需求控制shard数量,shard过多,交互多。。shard过少,单个分片数据容易累积,当单个分片的数据超过30G的时
    候就有性能下降的情况,当超过50G的时候,就有明显性能下降的效果。。采用热分离:当数据大小即将超过30G的时候。可以把以前的 数据 转存到其他容器里面去。比如hdfs。
    4)副本:副本太多性能下降
    5)查询缓存(打分走query,不打分就filter)
     
     因为默认情况下es对字段数据缓存(Field Data Cache)大小是无限制的,查询时会把字段值放到内存,特别是facet查询,对内存要求非常高,它会把结果都放在内存,然后进行排序等操作,一直使用内存,直到内存用完,当内存不够用时就有可能出现out of memory错误。
    解决方法:
    (1)设置es的缓存类型为Soft Reference,它的主要特点是据有较强的引用功能。只有当内存不够的时候,才进行回收这类内存,因此在内存足够的时候,它们通常不被回收。另外,这些引 用对象还能保证在Java抛出OutOfMemory 异常之前,被设置为null。它可以用于实现一些常用图片的缓存,实现Cache的功能,保证最大限度的使用内存而不引起OutOfMemory。在es的配置文件加上index.cache.field.type: soft即可。
    (2)设置es最大缓存数据条数和缓存失效时间,通过设置index.cache.field.max_size: 50000来把缓存field的最大值设置为50000,设置index.cache.field.expire: 10m把过期时间设置成10分钟。
    6)锁住ES内存
    Es在内存不够JVM开启swapping的时候,表现得会很差,所以为了避免这个问题,将该属性设为true,表示锁定es所使用的内存:
    bootstrap.mlockall: true
     
    7)query优化。为高并发查询提供过滤器缓存和字段缓存
    1. 一般情况下。尽量使用filter。。
    2. 过滤器不影响评分,而query得分查询会让搜索变的更加复杂,需要更多的cpu资源。
    3. 过滤查询相对于比较简单的操作,由于过滤应用整个索引的内容上,过滤器很容易被缓存
    4. 尽量使用filtered查询,可以把整个query都套在filtered中,这种效率会更快。(过滤发生在查询之前!!)
    5. 复杂的组合过滤查询尽量用bool查询,不带bool的查询 不能利用缓存
    6. 设置search_type 类型:
    demo:
    # 嵌套查询
    # SELECT document FROM products WHERE productID = "SD1002136" OR ( productID = "SD4535233" AND price = 30 )

    [html] view plain copy
     
      1. {  
      2.  "query": {  
      3.   "filtered": {  
      4.    "query": {  
      5.     "match_all": {  
      6.        
      7.     }  
      8.    }"filter": {  
      9.     "bool": {  
      10.      "should": [{  
      11.       "term": {  
      12.        "productID": "SD1002136"  
      13.       }  
      14.      },  
      15.      {  
      16.       "must": [{  
      17.        "term": {  
      18.         "productID": "SD4535233"  
      19.        }  
      20.       },  
      21.       {  
      22.        "term": {  
      23.         "price": 30  
      24.        }  
      25.       }]  
      26.      }]  
      27.     }  
      28.    }  
      29.   }  
      30.  }  
      31. }  


    转载:http://blog.csdn.net/hu948162999/article/details/51381717

     
  • 相关阅读:
    电脑操作记录
    【转】XCode快捷键
    【转】iOS开发入门:Xcode常用快捷键
    【转】Android ProgressDialog的使用2
    【转】Android ProgressDialog的使用
    【转】在VMware中安装OS X Yosemite
    【转】VMware Workstation 11 永久激活码key 非注册机
    【转】Xcode 7 真机调试详细步骤
    【转】Xcode7真机调试iOS应用程序
    【转】iOS开发Xcode7真机调试教程
  • 原文地址:https://www.cnblogs.com/jack87224088/p/8038903.html
Copyright © 2020-2023  润新知