zoukankan      html  css  js  c++  java
  • 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

     
  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1036. Boys vs Girls (25)
    1035 Password (20)
    1027 Colors in Mars (20)
    1009. Product of Polynomials (25)
    1006. Sign In and Sign Out
    1005 Spell It Right (20)
    1046 Shortest Distance (20)
    ViewPager页面滑动,滑动到最后一页,再往后滑动则执行一个事件
    IIS7.0上传文件限制的解决方法
  • 原文地址:https://www.cnblogs.com/jack87224088/p/8038903.html
Copyright © 2011-2022 走看看