예전에 버퍼 풀의 사이즈를 8MB -> 128MB로 상향 조정해서 조회 성능을 끌어올렸던 적이 있었다.
(이후에 128MB -> 4GB로 또 상향 조정을 했다.)
https://qkrqkrrlrl.tistory.com/118
MySQL 버퍼 풀 사이즈 조정으로 count 쿼리 성능 개선(37초 -> 0.026초)
api_request_history에 50만 개의 데이터를 넣어두고 SELECT * FROM api_request_history ORDER BY request_date DESC; 해당 쿼리를 날려보자. request_date에 인덱스가 걸려있는 상태다. 1.32초면 나쁘진 않군요! SELECT count(*)
qkrqkrrlrl.tistory.com
문제는 여태까지 로컬에만 적용해 놓고 ec2에 올려놓은 MySQL에는 버퍼 풀을 조절하지 않았었다...
로컬호스트 버퍼 풀 사이즈
ec2 버퍼 풀 사이즈
여태까지 해골물을 마시고 있었던 것...
사실 왜 이제와서 버퍼풀을 다시 들여봤냐면 서버에 배포해 놓은 공유게시판 데이터를 조회할 때 18개의 데이터밖에 없는데 5초가 넘게 걸리는 문제가 있었다. 그래서 혹시나 하고 버퍼 풀을 확인했더니 역시나..
ec2에 존재하는 MySQL의 버퍼 풀 사이즈를 늘리는 것이 이번 목표다.
먼저 ec2에 깔려있는 도커 컨테이너에 들어가서 /etc/my.cnf 파일을 실행한다.
문제는 내 도커 컨테이너에는 nano, vi 같은 텍스트 편집 파일이 없었다. 그리고 yum, apt-get 명령어도 없어서 외부에서 파일을 만들어 복사하는 방식을 선택했다.
우선 cat my.cnf를 해주면 아래처럼 내부 파일이 주르륵 뜬다.
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.3/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.3/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password
host-cache-size=0
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock
저기서 주목할 부분은 # innodb_buffer_pool_size = 128M 여기다. 그리고 위에 주석을 보면 전용 서버의 경우 메모리의 70%로 할당하고 아닌 경우 10%부터 시작하라고 설명이 되어 있다.
즉 ec2에 mysql만 띄웠다면 70%까지 써도 되는데 나의 경우 젠킨스, 스프링부트, mysql이 올라가 있기에 10%부터 시작을 하는 것이 맞다.
아.. 그러면 현재 ec2 프리티어의 메모리는 1GB라서 128MB가 어떻게 보면 적당한 메모리라고 볼 수 있다.
일단 성능 향상은 필요하다고 느껴 200MB로 설정해 보기로 했다. 만약에 이후 메모리가 오버된다면 서버를 사던가 아니면 성능이 안 나오는 걸 감수하던가 해야 할 것 같다.
우선 my.cnf 파일을 외부에서 하나 만들고 안에 내용을 복사해준다.
nano my.cnf
그리고 # innodb_buffer_pool_size = 128M 부분의 주석을 풀고 200M로 변경하고 저장한다.
(nano의 경우 컨트롤+x 누르고 Y 누르고 엔터 하면 저장이 된다.)
이제 컨테이너 내부로 파일을 복사해 주면 된다.
docker cp my.cnf <컨테이너-이름>:/etc/
그리고 도커 컨테이너 재시작을 해준다.
docker restart <컨테이너-이름>
그리고 다시 서버 mysql의 버퍼 풀 사이즈를 확인해 보면 아래처럼 늘어난 것을 확인할 수 있다.
아 싸피를 나온 이후 프리티어로 프로젝트를 하면서 서버 성능의 중요성을 점점 느끼고 있다...
메모리가 딸려서 젠킨스를 설치하다 터지고 스왑메모리 쓰고... 이게 다 서버 때문이야...
'프로젝트 > RESTAPI 추천 서비스' 카테고리의 다른 글
MySQL의 데이터를 안전하게 백업시켜놓자(Feat, 아마존리눅스2) (0) | 2024.07.06 |
---|---|
RestTemplate -> RestClient 변경이 필요할까?(Feat, 부하테스트) (0) | 2024.07.06 |
naver 소셜 로그인 추가하기(feat, 리팩토링) (0) | 2024.07.01 |
확장성이 좋은 oauth 코드로 리팩토링하기 (0) | 2024.06.27 |