以下是我的索引中保存的文档的数据模型:{"messageId":1,"commentId":1,"likes":1,"stars":1,"time":time in ms,"category":1,"deleted":false,"userid":1}
每封邮件都有多条评论(在我的案例中约为2000条) 带有基于messageId的路由的索引文档。 我目前有2亿条31 GB的记录。
我的基本阅读操作包括为按照喜欢或明星或时间排序的给定commentIds
提取messageId
。
搜索查询:
curl -XGET localhost:9200/_search?routing=${messageId}&q=messageId:${messageId}&sort=likes:desc&fields=commentId&_source=false
当我使用1500个线程运行性能测试时,平均花费的时间是6秒,90%是20秒左右!这是客户端的价值观。响应对象的获取值从10ms到15s不等,具体取决于负载。
如何提高阅读效果?
答案 0 :(得分:0)
您可能正在达到群集的内存限制。您应该启用Java GC日志记录(例如,使用ES_USE_GC_LOGGING
)并查看您是否在GC中花费了大量时间。
听起来您的性能测试正在创建大量的并发请求。您可能正在填写thread pools。看看:
$ curl -XGET "http://localhost:9200/_nodes/stats/thread_pool?pretty"
最后,听起来你有相对大量的分片。 A shard is not free(或see this benchmark)。如果您有index.number_of_replicas: 3
,则可以设置index.number_of_shards: 1
并仍然获得完整的群集利用率。