MariaDB 스레드 풀 설정

최민길(Gale)·2023년 9월 16일
1

DB

목록 보기
1/1

안녕하세요 이번 시간에는 MariaDB에서 적정한 스레드 풀을 사용하여 TPS를 향상시키고 캐시 미스 비율을 줄이는 방법에 대해 포스팅해보도록 하겠습니다.

먼저 DB에서 스레드 풀을 사용하기 위한 적정 스레드 풀 크기에 대해 알아보겠습니다. DB는 하나의 커넥션을 하나의 스레드가 처리하기 때문에 커넥션의 수와 스레드의 수가 유사하다는 특징이 있습니다. 따라서 스레드 풀의 크기는 커넥션 풀의 크기보다 크거나 같게 유지하는 것이 좋습니다. 만약 스레드 풀의 크기가 커넥션 풀의 크기보다 작다면 커넥션이 스레드를 할당받기까지 대기하는 시간이 길어져 성능이 저하될 수 있기 때문입니다.

이전 DB의 경우 스레드 풀을 2로 설정하여 캐시 미스 비율이 32% 가량 발생하였습니다. 하지만 DB의 코어 수는 2로 이론적인 커넥션 풀을 구하는 공식에 적용해보면 약 4에서 5 정도의 크기를 가지기 때문에 현재 커넥션 풀보다 작은 스레드 풀 크기를 가지고 있습니다. 그렇다면 스레드 풀의 크기를 증가시키면 TPS와 캐시 미스 비율이 향상될까요?

결론부터 말씀드리자면 DB 인스턴스의 메모리가 부족해서 스레드 풀에 생성한 스레드를 캐싱할 수 없다는 문제 때문에 TPS는 향상되지만 오히려 캐시 미스 비율을 증가합니다.

스레드 풀은 생성한 스레드를 메모리에 캐싱하여 스레드가 필요할 때마다 캐싱된 스레드를 사용하는 방식으로 동작합니다. 따라서 메모리가 부족해서 스레드 풀에 생성한 스레드를 저장할 수 없다면 스레드가 계속해서 재생성되며 이로 인해 높은 캐시 미스 비율을 나타내는 것입니다.

아래의 Sysbench 결과와 DB status 값은 2Core CPU와 1GB 메모리의 인스턴스에서 스레드 풀의 크기를 2로 설정했을 때의 값입니다. TPS는 127.69, 캐시 미스 비율은 32%로 나타납니다.

반면 아래의 Sysbench 결과와 DB status 값은 같은 인스턴스에서 스레드 풀의 크기를 5로 설정했을 때입니다. TPS는 142.28로 증가하였으나 캐시 미스 비율이 84%로 엄청나게 높아진 것을 알 수 있습니다.

이 결과는 위에서 설명드린 것처럼 메모리 내에 스레드 풀 크기만큼의 스레드를 캐싱할 수 없어 스레드 재생성이 더욱 빈번하게 발생하기 때문에 발생했습니다. TPS가 증가했기 때문에 DB의 처리량이 많아졌다고 볼 수 있으나 TPS 증가와 캐시 미스 비율 증가의 모든 요인을 고려해야 합니다. TPS가 증가하여 DB의 처리량이 높아진 만큼 스레드 캐싱이 되지 않고 재생성이 일어나 이로 인한 오버헤드 역시 많이 발생합니다. 따라서 이는 이슈를 완벽하게 해결하지 못한 것이라고 볼 수 있습니다.

그렇다면 인스턴스의 메모리를 1GB에서 2GB로 증가시키면 어떨까요? 다음은 그 결과입니다. 보시는 것처럼 TPS는 176.45로 증가하였고 캐시 미스 비율 역시 4%로 굉장히 낮아진 것을 확인하실 수 있습니다. 캐싱할 수 있는 메모리 공간이 증가하여 스레드 재생성 비율이 굉장히 크게 감소하였고 TPS 역시 향상된 것을 확인할 수 있습니다.

그렇다면 실제 메모리가 얼마나 할당되었는지 확인해보겠습니다. MariaDB에서 스레드를 캐싱하여 저장하는 역할은 InnoDB가 담당합니다. 따라서 innodb_buffer_pool_size를 체크하면 DB가 어느 정도 메모리를 할당받았는지를 체크할 수 있습니다. 확인해보니 기존 1GB 인스턴스에서는 402MB만큼 할당되었던 반면 2GB 인스턴스에서는 1GB 가량 할당되어 더 많은 스레드를 캐싱할 수 있다는 점을 확인할 수 있습니다.

따라서 스레드 풀을 설정할 때는

1. 커넥션 풀의 크기를 고려하여 스레드 풀 크기를 설정해야 하며
2. 설정한 스레드 개수를 모두 캐싱할 수 있는 인스턴스로 확장을 고려해야 합니다.

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글