Luft 성능 리포트 2023.1

Luft 성능 리포트 2023.1

2023년 첫 번째 Luft 성능 리포트

Jaewan Park — 박재완 @hueypark
Luft는 OLAP 데이터베이스로, 사용자 행동 분석에 최적화돼 있습니다. AB180에서는 Luft를 활용해 대규모 사용자 데이터를 처리하고, 경쟁력 있는 비용으로 서비스를 제공합니다. 이 글은 Luft 성능 향상이 필요한 이유과 그에 대한 도전, 그리고 앞으로의 로드맵에 대해 이야기합니다.

1. 성능 향상의 필요성

고성능 애플리케이션을 통해 우리는 고객에게 탁월한 기능을 경쟁력 있는 비용으로 제공할 수 있습니다. 특히 AB180의 경우, 대규모 사용자 데이터를 신속하고 효율적으로 처리해야 하므로, 성능향상은 더욱 중요한 가치를 가집니다.
개발과정에서 우리는 성능이 의사결정을 지원하고 잠재적인 문제를 제거하는데 크게 기여함을 발견했습니다. 최근 데이터 제공 기간 증가, 프라이버시 보호를 위한 데이터 익명화 처리, Funnel 리포트 제공 등의 작업을 하였는데, 충분한 성능을 유지할 수 있었기 때문에 더 빠르고 효율적으로 기능을 추가 할 수 있었습니다.

2. Luft 성능 개선 도전기

최근에 진행된 성능 개선 작업들을 소개드립니다. 이러한 개선 사항 중 대다수는 실제 제품에 성공적으로 통합되어, 그 효과를 실시간으로 확인할 수 있었습니다. 일부는 작업량이나 아키텍처에 의한 현실적인 제약 사항으로 인해 즉시 통합하지 못했지만, 이러 작업도 가까운 미래에 적용될 수 있을 것으로 기대합니다.
1.
사용자 데이터 물리 노드 분산 개선
같은 사용자 데이터는 가능한 하나의 물리 노드에 모이게 데이터 분산을 개선했습니다.
이를 통해 노드 간 원격 통신을 줄여 네트워크 비용을 줄일 수 있었습니다.
파이프라인간 데이터 전송은 자주 일어나기 때문에 10%~15% 쿼리속도가 향상되었습니다.
2.
Instance store 대신 EBS 사용(in AWS)
데이터 제공기간를 늘리기 위해 더 많은 디스크 사용이 필요했고, 기존에 사용하던 instance store 는 EC2 instance type 에 따라 제한된 용량을 제공하고 있었기 때문에 EBS 를 사용하게 되었습니다.
줄어든 디스크 성능을 보완하기 위해, 데이터를 애플리케이션 수준에서 여러 EBS에 분산시켰습니다.
또 데이터 압축률을 높이고 불필요 중복 제거해 전체 데이터 크기가 84% 줄었습니다.
3.
Data ingestion 파이프라인 개선
메모리 최적화를 통해 인스턴스 타입을(r6gd -> c6gd) 변경해 비용을 20% 줄였습니다.
Ingestion 파이프라인에서 병렬처리를 더 적극적으로 하여 전체 실행속도를 개선했습니다.
이런 작업들의 결과로 파이프라인 초기작업을 managed data warehouse 에서 Luft 로 이관해 적은 비용으로 같은 작업을 수행할 수 있게 되었습니다.
참고: Luft 는 managed data warehouse 를 source of truth 로 활용합니다.
4.
Ziegel to Ziegel 데이터 re-ingestion
Raw data 가 변경된 경우를 제외하면 managed data warehouse 에 대한 쿼리없이 다시 ingestion 할 수 있게 되었습니다.
이로 인해 re-ingestion 시 data warehouse 사용에 대한 비용부담이 없어졌습니다.
데이터 관련 규정을 지키거나, 기존 데이터를 추가, 제거, 보정하기위해 주기적으로 re-ingestion 이 수행됩니다.
5.
unsafe 사용 확대
지난 글에서 이야기 한 것처럼 한동안 안정성을 위해 unsafe 키워드를 보수적으로 사용했습니다.
하지만 이제 안정성을 확보했고 프로파일을 통해 필요한 부분을 특정 가능해져, 충분히 격리된 환경에서 적용해 공격적인 최적화를 시도하고 있습니다.
6.
컬럼 별 데이터 다운로드
모든 컬럼 데이터를 받는 대신, 꼭 필요한 컬럼 데이터만 다운로드(S3→EC2) 받게 개선중입니다.
아쉽게도 큰 디자인 변경이 선행되어야 해 아직 작업이 완료되지 않았습니다.
이 작업이 완료된다면 실제 사용하는 디스크 크기가 줄어들어 클러스터 스케일링을 더 효율적으로 할 수 있고, 필요한 데이터에 대한 캐시 히트율도 더 저렴한 비용으로 올릴 수 있을 것으로 기대됩니다.

3. 앞으로의 로드맵

1.
성능 데이터 수집 고도화
성능 개선이 필요한 지점을 파악하기 위한 데이터 수집을 고도화합니다.
단기적으로는 컬럼 접근 정보, 쿼리에 사용된 이벤트 수, ingestion 소요시간 등을 수집하면 의미있을 것으로 예상합니다.
나아가 이런 데이터가 충분히 모인다면 Luft에도 비용기반 옵티마이저를 도입할 수 있을 것으로 기대합니다.
2.
지속적인 프로파일과 실험으로 가시성 향상
p90 ~ p95 쿼리를 프로파일하여 성능 개선 티켓으로 만들어 개선해 나가려 합니다.
3.
여러 종류의 워크로드에 대응하기 위해 쿼리 별 클러스터를 분리하려 합니다.
터무니없이 무거운 배치 작업도 필요에 따라 안정적으로 처리할 수 있고, 다른 일반적인 쿼리에 영향을 주지 않을 것으로 기대합니다.
4.
메모리 관리 정책 수립
Go 의 메모리 풀인sync.Pool 은 꽤 효율적으로 동작합니다. 안타까운 점은 우리 코드 베이스에서 사용하기 쉽지 않다는 점입니다.
적절한 규칙이 있다면 더 쉽게 효율적으로 사용할 수 있을 것이라 기대하며, 마지막에는 아래와 같은 코드를 마음 편하게 작성하는 게 목표입니다.
func Foo() { data := pool.Get() DoSomething(data) pool.Put(data) }
Go
복사

마치며

지금까지 성능 개선의 필요성과 로드맵에 대해 살펴보았습니다. 끊임없는 노력을 통해, 고객들에게 지속적으로 향상된 사용 경험을 제공해 나가는 것이 우리의 목표입니다. 다음 리포트에서는 각 쿼리에 대한 상세한 데이터와 프로파일링 결과를 공유하고 이를 통해 우리의 성능 개선 노력이 어떻게 구체화되고 있는지 보여드리고자 합니다.
감사합니다. 머지않은 미래에 다시 돌아오겠습니다.
ᴡʀɪᴛᴇʀ
Jaewan Park @hueypark Backend Engineer @AB180
유니콘부터 대기업까지 쓰는 제품. 같이 만들어볼래요? 에이비일팔공에서 함께 성장할 다양한 직군의 동료들을 찾고 있어요! → 더 알아보기