sort script 느려짐

개발새발·2023년 1월 1일
0

elasticsearch

목록 보기
34/54

흠.. script를 사용해서 elasticsearch 쿼리문을 날려야하는 경우가 생겼는데, 역시나… 성능에 너무나도 문제가 생겨버렸다 ㅜㅜ

🏵️ 공통 세팅

index docs.countwarmup-time-periodtarget-throughput
4,035,32151000

👑 쿼리문

GET test_index/_search  
 
{
                "script_fields": {
                    "field1": {
                        "script": {
                            "lang": "painless",
                            "source": "params['_source']['field1'].findAll(i -> i.x == 'y')"
                        }
                    },
                    "field2": {
                        "script": {
                            "source": "(doc['field3'].value * params.page_view_weight + doc['field4'].value * params.field4_weight",
                            "params": {"field3_weight": 10, "field4_weight": 20}
                        }
                    }
                },
                "query": {
                    "bool": {
                        "must": [
                            {
                                "terms": {
                                    "_index": [
                                        "test_index"
                                    ]
                                }
                            }
                        ],
                        "filter": {
                            "bool": {
                                "must": [
                                    {
                                        "term": {
                                            "field10": False
                                        }
                                    },
                                    {
                                        "term": {
                                            "field11": True
                                        }
                                    }
                                ]
                            }
                        }
                    }
                },
                "_source": [
                    "test_field1",
                    "test_field2",
                    "test_field3"
                ],
                "sort": {
                    "_script": {
                        "type": "number",
                        "script": {
                            "source": "(doc['field3'].value * params.page_view_weight + doc['field4'].value * params.field4_weight",
                            "params": {"field3_weight": 10, "field4_weight": 20}
                        },
                        "order": "asc"
                    }
                },
                "size": 100,
                "from": 0
            }

🧑‍🌾 결과

clientssort처리량cpu 사용량에러률
11000O평균 처리량 : X ops/s /대기시간 포함한 처리시간 : X ms / 대기시간을 포함하지 않은 처리시간 : X ms100%100%
21O평균 처리량 : 2.0 ops/s / 대기시간 포함한 처리시간 : 59189.79 ms / 대기시간을 포함하지 않은 처리시간 : 509.36 ms6%0%
31000X평균 처리량 : 985.56 ops/s / 대기시간 포함한 처리시간 : 449.26 ms / 대기시간을 포함하지 않은 처리시간 : 430.04 ms17.5%0%

설명

  1. 처음에 clients를 1000으로 세팅해서 돌렸을 때 에러률이 자꾸 100% + all shards failed 라는 에러가 나와서 뭐가 잘못됐지? 하고 찾아봤는데 정말 몰라가지고.. 한참 헤맸다.
  2. 설마?! 하는 마음에 clients를 1 로 바꿨더니 에러률 0… es에서 해당 쿼리문으로 clients 1000 으로 세팅할 경우 처리를 못하는 것이였다. (확실하지 않습니다! 혹시 예상되는 부분있으시면 댓글 주시면 감사하겠습니다!)
    하지만 에러률 0%에서 불구하고 일단 clients가 1인데 cpu 사용량이 6%가 되는 점, 평균처리량이 2.0ops/s밖에 안된다는 점에서 절망스러웠다.
  3. 그럼 쿼리문의 어떤 점이 cpu사용량뿐 아니라 es에서 처리를 못해줄정도로 영향을 미칠까?싶었다. 그래서 결과표에는 안나와있지만, script_field 부분을 지우고 3번 세팅으로 돌려봤는데 1번과 같은 결과가 나왔다. 그러나 sort(_script)부분을 지우니 3번과 같은 결과가 나왔다. 처리량과 cpu 사용량, 에러률 모두 아주 양호한 상태!

💜결론

sort에서 script를 사용하는 것은 굉장한 성능저하를 일으킨다! 다른 방법을 생각해보는 것을 권장한다.

profile
발새발개

0개의 댓글