VScode를 사용했더니 kswapd0 사용률이 100%?..
API 배포를 위한 개발용으로 네이버 클라우드 플랫폼에 서버를 하나 두고 사용하고 있다
최근 들어 계속 아래 그림처럼, CPU랑 MEM 사용량이 100% 찍어 느려지거나 재부팅되는 현상이 발생됐다
그래서 Top 명령어 실행해두고 곁눈질로 모니터링하면서 업무를 하던 도중, kswapd0라는 놈을 잡아냈다
참고: WhaTap - 리눅스 free 명령어로 메모리 상태 확인하기
SWAP
- 스왑은 디스크의 일정 부분을 메모리 공간 부족 시 메모리 처럼 사용하기 위해 설정해 둔 공간으로, 커널은 메모리가 부족한 상황에서는 Buffer와 Cache로 할당된 것 중에 자주 사용되지 않는 것들을 비우고 메모리에 할당하려고 시도함
- 또한 메모리에 있는 데이터 중 최근 자주 사용되지 않은 데이터를 SWAP 공간으로 이동시킴(SWAP-OUT)
- 그리고 SWAP으로 옮겨진 데이터를 프로세스가 읽기 위해 메모리로 데이터를 다시 가져옴(SWAP-IN)
- 이는 디스크에 있던 데이터를 -> 메모리로 가져오기 떄문에 레이턴시가 발생하고 -> 성능 저하로 이어짐
참고 : AskUbuntu - kswapd0, CPU 사용량 폼 미쳤다
상태
- kswapd0 프로세스가 CPU를 과점유 하고 있음
- 각 종 블로그에는 해당 프로세스의 경우 리눅스의 가상 메모리를 담당하는 프로세스라고 하며, 메모리가 부족해서 SWAP 메모리를 사용할 때 생성되는 프로세스라고 함
원인
- 메모리가 부족할 떄, kswapd0 은 사용하지 않거나 다른 프로그램만큼 많이 사용하지 않는 프로그램을 SWAP로 이동해서 해당 프로세스에 극심한 지연 유발
- kswapd는 존재하지 않는 스왑 공간(스왑파티션이 가득 찬 경우)을 검색할 때 CPU를 많이 점유함
해결방법
A1
- RAM 부족할 때만 SWAP 메모리를 사용하셈
- 메모리를 많이 사용하는 작업할 때는 다른 프로세스 종료하셈
- 비싼 RAM 구매하세요
- CPU 사용량 낮추셈
A2
- 재부팅하셈
- 스크립트로 캐시 삭제 스케줄링하셈
- `kswapd0`프로세스의 CPU 사용률을 확인하고, 그 값이 90 이상인 경우에는 캐시를 삭제하는 작업을 수행
- 메모리 관리를 위해 캐시를 강제로 비우는 동작
#!/bin/bash
# Rev 2: Use ps instead of top
## run as cron, thus no $PATH, thus need to define all absolute paths
cpu=$(/usr/bin/printf %.0f $(/bin/ps -o pcpu= -C kswapd0))
[[ -n $cpu ]] \
&& (( $cpu >= 90 )) \
&& echo 1 > /proc/sys/vm/drop_caches \
&& echo "$$ $0: cache dropped (kswapd0 %CPU=$cpu)" >&2 \
&& exit 1
exit 0
A3
- 스왑공간 늘리셈
CPU와 MEM 사용량을 확인하고 Vscode 관련한 내용을 확인했다
아래와 같은 글을 찾을 수 있었다
Vscode remote-ssh extension, 그는 RAM 괴물인가?
OKKY 커뮤니티 댓글 중
CPU 사용률 Top 10 확인
MEM 사용률 Top 10 확인
결론
- Vscode extension 중 remote-ssh를 사용해서 서버에 접속했고, 이것은 메모리 사용량이 적지 않은 편임. (현재 서버는 최저 사양임)
- 메모리가 부족해져서 kswapd0는 SWAP 메모리를 사용했고 kswapd0 사용률은 99% 처럼 과점유 상태가 일어남
- 줄 알았으나, SWAP 메모리는 0이었고, 그냥 메모리 부족해서 발생한 문제 같음
- vscode-server를 포함한 프로세스를 강제 종료해서 사용률을 정상화 시킴
ps uxa | grep .vscode-server | awk '{print $2}' | xargs kill -9
참고