asticsearch分配过少的堆内存,那么就会留给Lucene更多内存,而Lucene重度依赖于文件系统缓存来快速处理请求。不管怎样也不能设置过小的堆内存,因为当应用由于频繁GC而面临短时中断时,可能会遭遇内存溢出错误或吞吐量下降。
Elasticsearch默认安装时设置的JVM堆大小为1GB,这在大多数情况下都偏小。可以通过环境变量来设置期望的对大小并重启Elasticsearch:
设置JVM堆大小的另一种方式(相当于设置一样的最小值和最大值,以防止重新调整堆大小),是在每次启动Elasticsearch时通过命令行参数指定:
这两种示例方式都是设置了10GB的堆大小,为了验证是否设置成功,执行:
返回的输出会显示已正确地更新了最大堆内存。
垃圾回收
Elasticsearch依靠GC过程来释放堆内存。由于GC本身也要消耗资源(为了释放资源!),所以应当留意GC频率和持续时间,以确认是否需要调整堆内存大小。设置过大的堆内存,换来的是更长的GC时间;这种过多的停顿非常危险,因为可能导致集群误认为该节点网络异常而失联。
因此,Elasticsearch重度依赖文件系统缓存来加速搜索。一般需要保证至少有一半的可用内存用于文件系统缓存,这样Elasticsearch才能保持索引数据的热点区域都在物理内存中。
使用更快的硬件
如果搜索受限于I/O,应当考虑为文件系统缓存分片更多内存(参考前文),或者购买更快的驱动。特别地,SSD公认地比机械磁盘性能好很多。尽可能使用本地存储,避免使用像 NFS 或 SMB 之类的远程或网络文件系统,也要注意像Amazon EBS这样的虚拟化存储。
Elasticsearch使用虚拟化存储工作是没有问题的,它因为快速和安装简单而受欢迎,但同样不幸的是,在基础上与专用的本地存储相比它天生就比较慢。如果在EBS上创建了一个索引库,请确认使用预分配的IOPS,否则很快就会被限流。
如果搜索受限于CPU,那么应当考虑购买更快的CPU。
更多内容敬请关注 vivo 互联网技术 微信公众号
注:转载文章请先与微信号:labs2020 联系。