안녕!
우아한테크코스 5기 [스탬프크러쉬]팀 깃짱이라고 합니다.
사장모드: stampcrush.site/admin
고객모드: stampcrush.site
💋 목표
- 수치를 설정하고 정한 이유를 발표한다.
- hikariCP configuration 보고 필요한 값 설정한다.
💋 예상
무조건 HikariCP 커넥션 풀의 크기를 크게 잡았다고 해서 성능이 개선되는 것은 아니다. PostgreSQL이 추천하는 Connection Pool Size 공식에 따르면, Connection Pool Size = (core_count * 2) + effective_spindle_count
로 설정했을 때 최적이다.
풀 사이즈를 무한정 늘린다고 하더라도 CPU 코어 수가 한정되어 있어 멀티 쓰레딩을 하게 되더라도 컨텍스트 스위칭으로 인해 비효율이 발생한다. 그렇다고 풀 사이즈를 크게 줄이게 되면 디스크나 네트워크를 사용하는 동안은 스레드가 block되어 다른 작업을 할 수 없고, 그에 따라 성능이 저하되기 때문에, 위와 같은 식이 도출된다.
core_count
: CPU 코어 개수.effective_spindle_count
: 하드 디스크의 개수. spindle은 DB 서버가 관리할 수 있는 동시 I/O 요청의 개수를 의미한다.
스탬프크러쉬에서 사용중인 EC2 인스턴스의 core_count
는 2개이고, 우리가 사용중인 데이터베이스 클라우드 서버의 실제 물리 디스크 개수는 알 수 없어서, 보수적으로 1개로 생각해 effective_spindle_count
는 1개로 설정했다.
💋 실습 방법
✔️ Ngrinder 설치 후 실행
export NGRINDER_HOME=${HOME}/.ngrinder
export JAVA_HOME=$(/usr/libexec/java_home -v 11)
java -Djava.io.tmpdir=${NGRINDER_HOME}/lib -jar ngrinder-controller-3.5.8.war
✔️ 스크립트
import static net.grinder.script.Grinder.grinder
import static org.junit.Assert.*
import static org.hamcrest.Matchers.*
import net.grinder.script.GTest
import net.grinder.script.Grinder
import net.grinder.scriptengine.groovy.junit.GrinderRunner
import net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess
import net.grinder.scriptengine.groovy.junit.annotation.BeforeThread
// import static net.grinder.util.GrinderUtils.* // You can use this if you're using nGrinder after 3.2.3
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Test
import org.junit.runner.RunWith
import org.ngrinder.http.HTTPRequest
import org.ngrinder.http.HTTPRequestControl
import org.ngrinder.http.HTTPResponse
import org.ngrinder.http.cookie.Cookie
import org.ngrinder.http.cookie.CookieManager
/**
* A simple example using the HTTP plugin that shows the retrieval of a single page via HTTP.
*
* This script is automatically generated by ngrinder.
*
* @author admin
*/
@RunWith(GrinderRunner)
class TestRunner {
public static GTest test
public static HTTPRequest request
public static Map<String, String> headers = [:]
public static Map<String, Object> params = [:]
public static Map<String, Object> params2 = [:]
public static List<Cookie> cookies = []
@BeforeProcess
public static void beforeProcess() {
HTTPRequestControl.setConnectionTimeout(300000)
test = new GTest(1, "3.37.28.4")
request = new HTTPRequest()
grinder.logger.info("before process.")
}
@BeforeThread
public void beforeThread() {
test.record(this, "test")
grinder.statistics.delayReports = true
grinder.logger.info("before thread.")
}
@Before
public void before() {
headers.put("Authorization", "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIyIiwiZXhwIjoxNjk1MjgyMzEyfQ.lgNhB8MH3cO3j2F7Vc4ehXjNtp0-1lpNp7kDVlVDjsHuIMLzVuLTUECy_y4rjZZRoB4qEIc4aJmoiMat8OgLFw")
request.setHeaders(headers)
CookieManager.addCookies(cookies)
grinder.logger.info("before. init headers and cookies")
}
@Test
public void test() {
HTTPResponse response = request.GET("http://3.37.28.4:8080/api/admin/customers?phone-number=01038626099", params)
if (response.statusCode == 301 || response.statusCode == 302) {
grinder.logger.warn("Warning. The response may not be correct. The response code was {}.", response.statusCode)
} else {
assertThat(response.statusCode, is(200))
}
}
}
✔️ 실습 환경
프로세스 10개에 쓰레드 각각 100개로, 총 1000개의 가상 Agent를 사용해 5분 동안 점진적으로 요청을 보냈고, interval은 1000ms로 설정했다.
💋 실습
✔️ HikariCP Maximum Pool Size: 5개
✔️ HikariCP Maximum Pool Size: 2개
✔️ HikariCP Maximum Pool Size: 10개(기본 설정)
💋 결정
✔️ 풀 사이즈 5개로 결정
예상과 비슷한 결과가 나왔고, 풀 사이즈를 5개로 설정했을 때 TPS가 가장 높고, MTT도 가장 낮게 나온 것을 확인했다. 5개로 변경! ⭐️
✔️ HikariCP Maximum Pool Size 설정
프로젝트 내 application.yml
파일에 아래와 같이 설정 추가함.
spring:
datasource:
hikari:
maximum-pool-size: 5
도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟
'PROJECT > Stamp Crush' 카테고리의 다른 글
[우테코] 무중단 배포 자동화(2): 배포서버에 Github Actions self-hosted runners, Nginx, Docker 설정 (2) | 2023.10.28 |
---|---|
[우테코] 무중단 배포 자동화(1): Github Actions workflow 생성, Secrets 설정 (2) | 2023.10.27 |
[모집공고] 스탬프크러쉬 기획/영업/마케팅 팀원 모집 (0) | 2023.10.16 |
[우테코] 스탬프크러쉬의 실제 사용자(카페 사장)와 함께한 일주일 (5) | 2023.10.12 |
[우테코] 스탬프크러쉬의 무중단 배포 자동화 (Zero-Downtime Deployment using Docker, Jenkins, Nginx, Spring Boot) (0) | 2023.10.11 |