MSSQL을 사용하고 있고 DB 전용 서버를 구축하고 있는 고객사에서 메모리 과부하 증상으로
원격 점검을 시행했다.
현상 분석
1.DB 서버의 전체 용량은 32G였으며, 점검 당시 약 30G의 메모리를 SQL Server에서 독점하고 있었다.
2.SQLServer 내 최대 메모리 설정은 29000MB로 설정되어 있었다.
메모리가 항상 이렇게 가득 차있어서 점검 요청을 한 것이고,
결론적으로는 '최대로 설정한 메모리만큼 가득 차 있고, 메모리 부족 에러가 발생하지 않는 상태는 '정상'이다!'
하지만 가득 차도 너무 가득 차서(30G/32G), 자칫 하면 메모리 부족 에러로 갈 수 있는 상황이였기 때문에 조치를 취했다.
여기서 드는 의문점
1) 최대 메모리 설정을 29G로 했는데, 왜 이를 넘어섰을까?
최대 메모리 설정을 해 두어도, SQL Server는 그 외의 메모리 (worker thread 메모리, 확장 저장 프로시저 등)을 사용한다고 한다. 이러한 메모리 때문에 29G로 설정했음에도 30G 이상을 MSSQL이 사용하고 있던 것이다.
2) 왜 최대 메모리까지 쓰는데 정상인걸까?
이건 MSSQL의 특성 때문인데,
MSSQL은 메모리를 한 번 점유하면 OS가 요청하지 않는 한 거의 메모리 반환을 하지 않는다고 한다.
(쿼리의 재사용성을 위해서)
따라서 메모리를 쓰는 만큼 계속 차오르고, 다 쓴 메모리를 반환하지 않으니 늘 최대치까지 차 있는 것으로 보인다.
하지만 이는 잘 돌아가고 있는 상태라고 한다. (메모리 부족 에러가 나지 않는다면!)
이걸 굳이 내려주려면 DB서버 재부팅을 시켜주라고 한다. 하지만 그렇게 내려준다고 하더라도 어짜피 다시 찰것이다.
처리 내용
현재는 메모리 부하 상태가 아니였으나, 최대 메모리 설정 값이 너무 높게 설정되어 있어 자칫하면 부하 상태로 들어갈 수 있어 최대 메모리 설정 값을 변경해주기로 하였다.
최대 메모리 권장 설정 값은 아래 표와 같으나, 나는 저 수치보다 낮게 줄여주었다. (29G > 24G로 변경)
다른 글을 참고해보면 서버 메모리의 60-70%를 쓰는 것이 좋다고도 한다.
변경 방법
변경 방법은 간단하며, 시스템 재시작도 필요하지 않다.
1.SQL Server에서 루트를 우클릭 > 속성(Properties)클릭
2.왼쪽 페이지 선택 > 메모리 > 서버 메모리 옵션 > 최대 서버 메모리 설정 (MB단위)
결과
내려서 적용하자 마자 메모리가 쭉 내려갔다. 하지만 적용해 준 메모리가 최적의 메모리가 아닐 수 있다.
지속적인 모니터링 후 적정 값을 조절할 필요가 있다.
'DATABASE' 카테고리의 다른 글
[MSSQL] 엑셀 데이터 가져오기와 에러 해결하기 (0) | 2022.04.22 |
---|---|
[MySQL] MySQL 쓰면서 하지 말아야 할 것 17가지 (0) | 2022.04.19 |
[MYSQL] HeidiSQL 사용하여 간단하게 csv파일 테이블로 import (0) | 2022.01.21 |
[MySQL] 문자로 된 숫자 정렬 (1) | 2021.12.20 |
[MSSQL] 중복 데이터 삭제하기 (0) | 2021.11.10 |
댓글