-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
인터파크 0.001%
Spike 테스트 보고서
#135
Comments
Report
K6 Report
Resource ReportNginx ReportSpring ReportMySQL Report병목 지점 분석원인CPU와 메모리 이상보다는 SQL 분석Get Events는
테이블analyze table event; -- 통계 최신화
select table_schema, table_name, table_rows,
round(data_length/(1024*1024),2) as 'data_size(mb)',
round(index_length/(1024*1024),2) as 'index_size(mb)'
from information_schema.tables
where TABLE_SCHEMA="ticketingdb" and TABLE_NAME = "event"
group by table_name
order by data_length desc
limit 100;
쿼리1. 리스트 조회 쿼리 EXPLAIN SELECT * FROM event ORDER BY id asc LIMIT 0, 10;
EXPLAIN ANALYZE SELECT * FROM event ORDER BY id asc LIMIT 0, 10;
리스트 조회 쿼리는 현재
2. totalElements 조회 쿼리 EXPLAIN SELECT COUNT(1) FROM event;
EXPLAIN ANALYZE SELECT COUNT(1) FROM event;
슬로우 쿼리 조회 SELECT start_time, user_host, query_time, lock_time, rows_sent, rows_examined, db, CONVERT(sql_text USING utf8 ) sql_text FROM mysql.slow_log; 현재 1천만개의 인덱스를 모두 집계하고 있기 때문에 상당히 많은 시간이 소요된다. 개선 방법참고 1. 무한 스크롤특히 SNS에서 자주 사용한다. 예상 문제점:
2. 유사 페이지네이션 구현N개의 페이지네이션 바를 고정 노출한다 (즉 totalCount 를 조회하지 않는다)
3. totalCount 캐싱가장 대표적으로 COUNT 쿼리 캐싱을 사용한다. 또는 첫 페이지 요청시에만 totalCount를 계산하고, 두번째 페이지부터는 프론트에서 저장한 totalCount 를 계속 사용한다. 4. 유사 totalCount방법
위 모든 작업이, 5. Count 쿼리의 응답 속도를 증가시킨다COUNT 쿼리를 Paralle 로 실행한다. (MYSQL 8.0)
조회 전용 Replica DB를 증설한다. 의사 결정설계상 (프론트엔드가 존재한다면) 무한스크롤을 가정했기 때문에, 만약 비지니스상 totalCount를 반환해야하는 순간이 온다면 위 방법 중 하나를 고려해볼만 하다
개선 이후 동일 테스트 Report#124 을 통해 totalCountQuery를 제거했다.
|
왜 대기열 시스템이 필요할까?동시성 문제(=갱신누락)에 대한 어떤 해결 방법이 있을까?
갱신누락 문제를 방지하면서, 하나의 자원(=Event)에 대한 각 유저의 Wait time을 어떻게 개선할 수 있을까?
그렇다면 각 유저의 Wait Time을 개선할 수 없는데, 왜 대기열을 구현해야할까?
지연이 아니라, 정상 응답 조차 감당할 수 없을 정도로 트래픽이 늘어나면 어떠한 문제점이 발생할까?
대기열 시스템은 트래픽의 안정적 순차 처리에 중점을 둔다.
왜 API 서버로 Non-blocking을 논할까?사례
서블릿 컨테이너는 즉 한 쓰레드당 한개의 요청 밖에 처리하지못한다. 그렇게 되면 I/O 작업이 일어날때 쓰레드는 실질적으로 하고있는것이 없지만 다른요청을 처리하지못한다. 그렇게 되면 자원이 부족한 서버(thread를 많이 만들 수 없는)에서 처리할 수 있는 동시 처리량은 매우 제한적일 것이다. 쓰레드를 많이 만든다하더라도 컨텍스트 스위칭 문제가 생겨서 성능에 많은 부담을 주게된다. 특히 이벤트루프기반 비동기 + 논블록킹 Node.js를 사용하면 트래픽을 효율적으로 처리 가능할 것이다
참고
대기열 적용 이후 테스트변경 시나리오
대기열 조건 JOB_INTEVAL_SEC: 10
JOB_MOVE_PER_INTEVAL: 20
JOB_TICKET_EXPIRED_SEC: 180 K6 Report
Spring
MySQL- 기존 테스트에 비해 개선되었다 (MAX: 4.31 => 2.53s, AVG: 616 => 507ms) |
Description
인터파크 기준 0.001% Spike 테스트 보고서
0.002%
Spike 테스트 보고서 #144테스트 요약
SELECT COUNT(*)
를NoOffset
구현으로 개선Enviroment
[t3.small]
[t3.small, t3.small, t2.small, t2.small]
Thresholds
시나리오 (각 유저당 총 15 Request 발생)
GET /events?sort=id,asc&size=20&page=0
)page += randomInt(1, 10)
GET /event/{ID}
)max_attendees
를 가진 이벤트를 사용)POST /reservations
)The text was updated successfully, but these errors were encountered: