4월 회고
4월 회고
- 한번 회고가 밀리기 시작하니 답도 없이 밀려버려 결국 한달 회고를 작성하게 되었다. (맙소사!)
이번달에 있었던 일
-
DB 메모리 이슈 해결
-
React 개인 프로젝트
-
ML 강의
-
뒤돌아보는 시간
1. DB 메모리 이슈 해결
거진 한달을 괴롭혔던 메모리 이슈를 해결하는데 성공하였다. 일단 해결한 이후부터 동일한 문제는 발생하지 않지만 계속 데이터가 쌓여가면 문제가 발생할 가능성이 있어 차후에 테이블 구조를 개선하기로 하였다. 메모리 이슈를 해결하기 전까지의 상황을 정리하면 이렇다.
- 유저가 몰리는 시간대에 급격한 DB 반응성 저하.
- 조사결과 메모리 락이 발생하고 있음.
- 이 메모리 락때문에 전체 시스템의 반응성이 저하되는 문제가 발생함.
여기까지가 이전까지의 상황이였다. 그럼 문제는 무엇인가?
도대체 어떤 쿼리가 얼마만큼의 메모리를 점유하는가?
이걸 당최 알수가 없어서 근 한달동안 어찌할 도리가 없었다. 이전의 해결 과정에서 문서 목록 조회 쿼리가 문제라고 판단하여 튜닝을 진행했지만 별 소득이 없었다. 헛다리 짚은것이였다. 그렇게 삽질과 구글링을 거치다보니 결국 해외 사이트에서 해답을 찾을 수 있었다.
Troubleshooting SQL Server RESOURCE_SEMAPHORE Waittype Memory Issues
해결과정
1) 리소스 대기중인 프로세스 확인
SELECT * FROM SYSPROCESSES
ORDER BY lastwaittype
이 쿼리의 결과로 몇개의 프로세스가 리소스 대기중인지 알 수 있다. DB 메모리 이슈가 발생한 상태에서 이 쿼리를 실행하면 수많은 쿼리들이 RESOURCE_SEMAPHORE
상태임을 알 수 있었다.
2) 메모리가 부여된 쿼리와 아직 부여되지 않은 쿼리 수를 확인
SELECT * FROM sys.dm_exec_query_resource_semaphore
3) 메모리를 할당받기 위해 대기열에서 대기중인 모든 쿼리의 세부정보 조회
SELECT * FROM sys.dm_exec_query_memory_grants
이 쿼리를 통해 현재 메모리를 할당받기위해 대기중인 쿼리에 대한 정보를 파악할 수 있었다. 이 쿼리가 나타내는 정보는 sys.dm_exec_query_memory_grants링크에 상세히 나타나 있으며 내가 주목한 부분은 grant_time
과 requested_memory_kb
였다. 이 항목은 각각 쿼리에 메모리가 부여된 시각 / 요청된 총 메모리 양이며 아직 메모리가 부여되지 않은경우 NULL이 된다. 메모리 이슈가 발생한 상태에서 이 쿼리를 실행했더니 requested_memory_kb
가 2GB에 가까운 쿼리들이 메모리를 할당받기위해 대기하고 있었던 것이였다. 도대체 어떤 쿼리가 2GB씩이나 요청하고 있는것인가.
4) 대기중인 쿼리의 핸들값을 통해 실제 쿼리 실행문 알아내기
SELECT * FROM sys.dm_exec_sql_text(sql_handle)
3)에서 실행한 결과값 중 sql_handle
이 함께 나오는데 이 값을 가지고 위 쿼리를 실행하면 실제 쿼리의 텍스트가 나오게 된다.
5) 쿼리 분석
실제 쿼리를 분석한 결과 문서 조회 쿼리가 중첩되어 실행 대기중이었다는것을 알 수 있었다. 추측이지만 옵티마이저가 병렬처리를 위해 쿼리를 묶어버린게 아닌가 생각된다.
6) 정리
- 동시에 너무 많은 쿼리를 실행하려고 하는 바람에 엄청난 메모리할당을 요청하였고 DB에 부여된 시스템 메모리는 고작해야 16GB였으므로 저 쿼리가 여러번 요청되면 메모리 할당을 위해 리소스 락이 걸린 것이였다.
7) 해결
- DB의 병렬처리 수준을 조절하는것으로 해결하였다.
이 메모리 이슈를 해결하기위해 한달을 넘게 삽질을 하고 우리팀 특히 팀장님이 고생을 많이 하셨다. 문제가 재현이 잘 안되고 분석이 어려워 이때까지 겪은 이슈중 가장 머리아픈 이슈 Best 3안에 들어가고도 남을것이다. 이번 문제 해결을 통해 얻은것은 모든 문제에는 원인이 있고 구글링을 잘하면 대부분 해결된다는것이였다. 이전까지는 언제 어떻게 이 문제가 발생하는지에 대해 검색했다면 이번에는 메모리 사용 중심으로 검색을 하여 위의 해답을 찾은것이였다. 결론은? 침착한 디버깅과 검색능력이 중요한것같다. (이 문서 조회의 쿼리 튜닝은 또 별개의 문제이니 다음에 또 이야기 하겠다.)
2. React 개인 프로젝트
작년부터 틈틈히 React 관련 공부(?)를 진행했지만 그리 순탄히 진행되지 않았고 결국 인프런의 노마드코더스가 올린 react관련 동영상 강의를 보게 되었다. 클론 코딩이라는 방식으로 강의가 진행되었는데 이게 나와 잘맞았는지 책으로 보는것보다 이게 훨씬 이해가 잘되었다. React가 왜 생겼는지, 어떤 방식으로 동작하는지를 말이다. 무튼 영화 목록을 가지고 오는 API를 이용하여 간단한 영화 목록 조회 페이지를 만들게 되었다.
그런데 이거 만들다보니 재미가 생겨서 좀더 개선해서 토이 프로젝트로 하나 진행하려고 한다. 시간이 얼마나 날지 모르겠지만 퇴근하고 나서 틈틈히 놀아볼 생각이다.
3. ML 강의
React와 더불어 최근 듣고 있는 머신러닝 관련 강의가 있다. 링크
같은 팀의 선배가 추천해준 구글에서 진행하는 강의인데 통계를 가지고 머신러닝 강의를 진행해 나가고 있다. 시작한지는 2주정도 되었는데, 이거 정말 어렵다. 그러나 재미있으니 어떻게든 해나가야겠다.
4. 잡소리
내일(시간상 오늘이지만) 출근해야하는데 큰일났다.. 헣.. 무튼, 요즘들어 이직욕구가 폭발하고 있다. 지금 다니고 있는회사에 처음 들어올때는 솔루션 회사인줄 알았는데 3년차 개발자(현재 2년 1개월 근무)가 될때까지 SI만 죽어라 한것같다. 물론 내가 있는 부서가 그나마 적자 안내고 잘 해나가고 있다는것은 함정이긴 하지만..
아무튼간에 발주사의 갑질(특히 요구사항이 숨쉬듯 바뀌는것과 기한을 멋대로 바꾸는것), 발주사 직원의 막말, 그리고 최신 기술 스택과는 거리가 너무 먼 폐쇄망 개발 환경 등에 진절머리가 나고 있다.(SI 업계에 오래 계신분들 정말 진심으로 존경합니다.) 정말 화가 나는건 내 능력의 부족이다. React 관련 개발업무를 하고싶지만 React에 대해 잘 모르니 할수가 없다. 그러니 공부하고있는것이지만 퇴근하고나서 항상 딴짓하기 바쁘니 미칠 지경이다. 더이상 발주사에 갑질 당하지 않고 행복한 개발자가 되기위해 노력해야지..
힘내자.
Leave a comment