만족
[Ubuntu] Memory Swap 활성화 본문
[Ubuntu] Memory Swap 활성화
Ubuntu Satisfaction 2021. 5. 18. 21:07
aws lightsail 을 사용 중 메모리 사용률이 100%에 매우 근접하게 되면 시스템이 아예 서버리는 문제가 발생되었다.
(그래프가 끊긴 시점에서 전혀 서버가 응답하지 않았다)
특히 크롤링 작업을 할 때나, 사용자 수가 급증할 때 발생하는데
해결법은 aws lightsail console로 입장해 서버를 재시작하는 방법밖에 없는 데다가
재부팅 시간도 길기 때문에 서비스 품질 면에서 이는 매우 좋지 않은 경우다.
특히 저가형 VPS를 사용중일 경우 DB와 Web Server만 구동시키더라도 메모리 부족 현상이 금방 나타나고,
여기서 시스템 다운과 정상 작동 사이에서 아슬아슬한 줄타기를 하게 된다.
Memory Swap
설명하기 전에 잠시 운영체제 관련 지식에 대해 설명할 것이다.
고전 OS들은 물리적 메모리들을 일정한 크기로 자른 것을 Slot이라 하고,
하나의 Slot을 한 개의 응용 프로그램이 사용했었다.
매우 단순한 구조이지만, 응용 프로그램들은 물리적 메모리의 크기가 충분히 크거나, 사용되지 않는 Slot이 있더라도,
하나의 응용 프로그램은 정해진 Slot 크기만큼의 메모리만 사용할 수 있었다.
그러나 모던 OS에서 물리적 메모리들은 Page라는 단위로 관리되며,
이 페이지들로 Virtual Memory를 구성하여 응용 프로그램이 사용하게 된다.
이런 방식 덕분에 각각의 응용 프로그램이 사용 가능한 메모리의 크기는
"물리적 메모리 용량/응용 프로그램 갯수" 가 아닌
"물리적 메모리 용량"과 비슷하게 사용할 수 있다.
이렇게 되면 응용 프로그램이 사용 가능한 메모리에 대해 탄력성은 늘어나지만,
응용 프로그램들이 최대 메모리 이상으로 메모리를 요구할 수 있게 되어,
메모리 고갈 현상이 나타날 수 있다는 문제점이 있다.
(이 경우 맨 위에서 보았듯 시스템이 정지해버린다)
이 문제를 Memory Swap을 이용해 해결한다.
Memory Swap은 우선순위가 낮은 Page를 Storage로 옮기고, 그 Page를 사용 가능한 상태로 만든다.
예를 들어, 최대 Page의 갯수가 10이고, 현재 10개의 Page를 전부 사용중일 때 응용 프로그램이 2개의 Page를 추가로 요청하면,
현재 사용중인 Page에서 우선순위가 낮은 Page 2개를 Storage에 저장하여 Page를 확보한다.
미래에 Storage에 저장된 Page가 다시 필요하게 되면(이를 Page Fault라고 부른다),
마찬가지로 다시 현재 메모리의 Page들 중 우선순위가 낮은 Page를 Storage로 보내고,
Storage로 보냈던 Page를 다시 물리 메모리로 복귀시킨다.
조금 복잡할 수 있지만, 정리하면
Memory Swap은 Storage를 활용하여 실제 물리 메모리의 용량보다 더 많은 Memory를 사용할 수 있게 해 주는 방법이다.
Memory Swap의 단점
우선 메모리가 왜 필요할까?
에 대해 생각해보면, "Storage는 느리기 때문에" 라는 답이 나온다.
Memory Swap은 마치 Storage의 일부를 메모리처럼 사용하는 방식이기 때문에 속도가 느리다.
그럼에도 불구하고, Swap을 사용할 때는 메모리가 꽉 찼을 때에도 느린 속도로라도 동작할 수 있게 해 준다는 점에서 의의가 있다.
속도가 느린 것 하고, 아예 작동하지 않는 것은 엄청난 차이가 있다.
Ubuntu에서 Memory Swap 활성화
https://psychoria.tistory.com/717
위 링크를 참조하여 swap space를 만들고 활성화시킬 수 있다.
이제 물리 메모리 2GB에 swap space 2GB를 추가하여, 4GB까지 메모리를 사용할 수 있게 되었다.
적절한 Memory Swap Space 크기는?
무조건 Swap Space를 크게 하는 것이 좋은 것은 아니다.
위에서도 말했듯이 Swap Space는 Storage상에 존재하고,
이 Storage는 CPU와 물리적 거리가 있기도 하고, 속도 자체도 더 느리다.
무작정 크게만 하는 경우 Storage가 의미없이 낭비될 수도 있으며, 과도한 Memory 사용으로 인해 시스템이 매우 느려지더라도 응답을 아예 안하는 것도 아니라 모니터링 서비스에서 그 모습이 관찰되지 않을 수 있다.
(이 경우엔 차라리 System failure를 빠르게 감지하고, 조치를 취하는 것이 더 좋을 수 있다)
(예를 들어, 게임 서버처럼 높은 반응성을 요구하는 곳에서는 스왑 메모리를 만들 것이 아니라 빠르게 인식하고 서버 스펙을 올리던지 해야 할 것이다)
구글 형님은 위와 같은 답을 내려주셨다.
결론은 2기가 미만은 사용중인 메모리의 2배만큼,
2기가 이상 8기가 미만은 메모리와 동일하게 설정해주는 것이 일반적이라고 한다.
물론 여기에 정답은 없기 때문에, 운영중인 서비스의 상황에 맞게 설정해 주어야 한다.
정 모르겠다면 람다같은 서버리스 서비스를 사용해 귀찮은 것은 전부 클라우드 제공사에 떠넘길 수도 있겠다.
'Ubuntu' 카테고리의 다른 글
[Ubuntu] Crontab을 이용해 특정 Task 자동화시키기 (0) | 2021.11.11 |
---|---|
[Ubuntu] 특정 포트를 사용중인 프로세스의 정보 검색하기 (0) | 2021.07.25 |
[Ubuntu] sudo vs sudo su (0) | 2021.06.06 |
[Ubuntu] ssh 커맨드에서 비밀번호 옵션 주기 (3) | 2021.04.17 |
[Ubuntu] VirtualBox 폴더 공유 후 게스트 OS에서 접근이 불가능한 현상 (0) | 2021.03.15 |