Klaytn State Trie Cache Series #4: Cache Size Tuning 하기
전체 포스팅 목록은 여기에서 확인하세요.
Klaytn은 블록체인 플랫폼의 성능을 개선하기 위해 다양한 노력들을 했습니다. 아래의 포스팅을 통해 state trie cache 성능 개선 과정을 살펴보고자 합니다.
- Cache 문제 원인 파악하기
- 최적의 cache 찾기
- State trie cache miss 계산하기
- Cache Size Tuning 하기
지난 포스트에서 cache miss에 영향을 끼치는 요인은 변경되는 state trie size(TotalAccounts, ActiveAccounts, TPS, trie node size)와 cache size이라는 가설을 세우고 실험을 통해 그 가설이 맞는 것을 확인해 보았습니다. 하지만 변경되는 state trie size를 파악하여 최적의 cache size를 구하는 일은 매우 어려운 일이기 때문에, 주어진 physical memory에서 최적의 cache size를 구하는 것이 cache miss를 줄이는 실현 가능한 방안이었습니다. 이번 포스트에서는 어떻게 최적의 cache size를 정하였는지 알아보겠습니다.
다음 표는 기존 Bigcache와 cache size를 동일하게 설정한 Fastcache의 결과(tuning 전), 비슷한 여유 메모리를 가지도록 cache size를 증가시킨 fastcache의 결과(tuning 후)입니다. Tuning 후의 값은 테스트를 통하여 Bigcache의 여유 memory와 동일 수준인 cache size 크기를 찾았고, 이를 적용하였습니다.
위의 테스트 후 Fastcache 크기를 토대로 physical memory를 scaling하여 cache size를 자동으로 할당해 주었습니다. 그 scaling하는 알고리즘은 아래와 같습니다.
if physicalMemMB < 20 * 1024 {
cacheSizeMB := 1 * 1024
} else if physicalMemMB < 100 * 1024 {
cacheSizeMB := physicalMemMB * 0.3
} else {
cacheSizeMB := physicalMemMB * 0.35
}
메모리 크기가 20G 이하인 경우 약 10G의 여유를 두기 위해 cache size를 1G로 고정하였습니다. 20G 이상 100G 이하인 경우 물리 메모리의 30%를 할당하고 있으며 m5.2xlarge 기준으로 10G 여유공간이 있습니다. 100G 이상인 경우 물리 메모리의 35%를 할당하고 있으며 c5.18xlarge 기준으로 44.5G의 여유공간이 생깁니다.
위의 테스트는 account 수가 많은 부하 상태에서 측정한 것이기 때문에 더 많은 메모리를 할당해 주어도 문제 없이 동작할 수 있습니다. 하지만 계산이 많은 API나 contract를 호출하면 그 만큼 메모리 사용량이 높아질 수 있으며 OOM 발생을 방지하기 위해 여유 공간을 충분히 두고 설정하였습니다.
[참고사항] Klaytn 서버의 권장 사항은 m5.2xlarge입니다.
Scaling logic을 통해 Fastcache에 cache size를 할당해 주면 위의 표와 같이 fastcache size가 할당됩니다. 위의 값은 충분히 높은 TPS와 많은 account 수에서 측정한 값을 기반으로 했기 때문에, 실제 메모리 사용량은 위 결과보다 낮을 수 있습니다. 더 빠르고 안정적인 실행을 위해 klaytn 실행 flag를 통해 fastcache의 size를 증가 시킬 수 있지만, out of memory가 발생할 수 있으니 주의해 주시기 바랍니다.
Klaytn State Trie Cache Series를 통해 state trie cache를 향상시키는 과정에 대해 소개하였습니다. Klaytn에서 사용하는 cache의 문제를 발견하고, 그 대안으로 다른 cache를 탐색해 보았습니다. 또한, state trie cache의 cache miss를 발생시키는 요인을 분석하고 실험을 통해 검증하였으며, 주어진 physical 메모리에서의 적절한 cache size를 찾기 위해 cache size tuning을 적용하였습니다.
이 포스팅을 마지막으로 state trie cache를 향상시키는 과정에 대한 설명을 마칩니다. Klaytn state trie cache에 관하여 질문이 있다면 이 포스팅에 댓글 혹은 클레이튼 포럼에 질문 부탁드리겠습니다. 감사합니다.