我有一个大小适中的es索引(10tb),在50台机器上有50个分区(每个分区1个),接近10b行。机器是顶级的(aws上最大的)。每个es示例的ram设置为30 gb。
每当我运行一个非常简单的查询时,例如:
POST /my_index/_search
{
"size": 1,
"query": {
"match_all": {}
}
}
它需要2到20多秒(我甚至得到502):
响应
{
"took" : 17584,
"timed_out" : false,
"_shards" : {
"total" : 50,
"successful" : 50,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 10000,
"relation" : "gte"
},
"max_score" : 1.0,
"hits" : [
{
有没有办法加快速度?我注意到limit子句在elasticsearch中效果不好(或者更好,我可能没有正确使用它)
1条答案
按热度按时间wh6knrhe1#
有趣的es性能问题,请澄清几件事,根据我的理解我会尽量解释的事情
当您提到每个es示例的ram设置为30gb时,我猜您的意思是es堆大小是30gb,而不是es节点的ram大小?根据经验法则,将节点的50%ram分配给es堆大小,并且它(es堆)不应超过32GB。
希望您在高峰时间和非高峰时间尝试过此查询,并且您的范围包括这两个时间段?
现在,有一些建议可以加快您的搜索查询
尝试减少索引的碎片数,目前是50个碎片,这意味着协调节点必须从50个节点收集搜索结果(每个节点1个碎片的情况),节点间的通信可能需要相当长的时间。
写一些小技巧来提高搜索性能,看看你是否可以应用到你的集群,索引