안녕하세요
오늘은 Linux 메모리 재할당과 관련하여 정리한 내용입니다.
해당 부분에 대해 잘 정리가 안되고 있던 분이 계시다면 제가 작성한 내용이 도움이 되었으면 좋겠습니다.
혹시 잘못된 내용이 발견되면 말씀해주세요!
1. 리눅스 커널의 메모리 재할당
커널은 기본적으로 메모리가 아무 데도 쓰이지 않고 노는 것을 싫어합니다. 그래서 프로세스에서 메모리를 사용하지 않는다고 한다면 커널은 메모리를 아래 그림처럼 cache 용도로 사용해 시스템 성능을 향상시킵니다.
(보통 이 cache 영역은 page cache, dentry cache, inode cache 등이 사용합니다.)
이렇게 커널은 cache로 메모리를 활용하다가 프로세스가 메모리가 필요하다고 하면, cache 영역(주로 page cache)을 반환하여 프로세스에게 넘겨주고, 더 이상 줄 cache 영역이 없을 때면 우리가 싫어하는 swap이 발생합니다.
위 그림은 메모리 재할당의 두 가지 로직입니다. 첫 번째 과정은 시스템 입장에서는 자연스럽고 성능 저하에 크게 영향을 주지 않지만 swap을 사용하는 두 번째 과정은 성능 저하가 발생합니다.
만약 2번 과정을 최대한 줄이고 1번 과정으로 메모리 재할당을 해주고 싶다면? vm.swappiness와 vm.vfs_cache_pressure 커널 파라미터를 사용해 조절할 수 있습니다.
2. vm.swappiness / vm.vfs_cache_pressure
1) vm.swappiness (기본 값 = 60)
해당 값은 커널이 얼마나 공격적으로 메모리 영역을 swap 영역으로 옮기느냐를 결정하는 파라미터 입니다.
이 값이 커진다면 cache를 비우지 않고 swap 영역으로 옮기는 작업을 진행하며, 겂이 작아지면 최대한 cache를 비우는 작업을 진행하게 됩니다.
메모리 단편화 문제가 있었던 WAS 서버는 vm.swappiness 값을 30으로 쓰고 있었습니다. (기본값 = 60) 나름대로 swap 사용률을 줄이려고 파라미터 값을 수정한 것 같은데 cache(Slab) 영역으로 생각보다 많은 메모리를 사용해 효과가 크게 없었던 것 같습니다…
(TMI) 가끔 블로그에 vm.swappiness 값을 0으로 하면 swap을 안 쓴다는 이야기도 있는데 그렇지는 않다고 합니다. 0으로 값이 설정되면 pachecache를 전부 비워내고 난 후 swap이 사용된다고 합니다.
2) vm.vfs_cache_pressure (기본 값 = 100)
해당 값은 캐시를 재할당 한다고 했을 때 pachecache를 더 많이 재할당할지 아니면 dentry나 inode 캐시를 더 많이 재할당할지를 결정하는 파라미터입니다.
- Dentry cache : 디렉터리 간 부모/자식 관계 등을 저장해 디렉터리 간 이동을 더 빠르게 해주는 캐시
- Inode cache : 파일의 inode에 대한 정보를 저장하는 캐시
3. 정리
“물론 무조건적인 pagecache 영역을 비우는 것은 좋은 것은 아닙니다. Pagecache는 I/O 작업 시 디스크로의 접근을 줄여주기 때문에 시스템의 전체적인 응답 속도 향상에 도움이 되기 때문입니다.”
“오히려 자주 사용하지 않는 프로세스라면 swap으로 내리고 전체적인 시스템 성능 향상을 위해 pagecache 영역을 활용하는 것이 더 좋을 수도 있겠습니다.”
책에서는 만약 파라미터 값을 수정한다면 vm.swappiness 값만 수정하는 것을 권장하고 있습니다.
(추가) pagecache?
커널은 메모리의 일부를 상대적으로 느린 디스크 요청에 대한 디스크 요청에 대한 캐싱 영역으로 할당해 사용합니다. 이때 pagecahe가 사용되는데, 그림처럼 크기 20kb의 test 파일을 cat으로 확인한 후 buff/cache 영역이 test 파일의 크기만큼 증가한 모습을 볼 수 있습니다.
즉 한번 읽은 디스크의 내용을 메모리에 저장하여 이후 동일한 파일을 읽고자 하면 디스크에 요청하지 않고 메모리에 요청하게 됩니다. Pagecache의 사용으로 커널은 사용자에 디스크로의 요청을 좀 더 빠르게 처리할 수 있습니다.
(추가2) 멘토팀의 이야기
최근 메모리 단편화 문제가 있었던 WAS 서버는 redhat 권고로 캐시를 비우라는 내용을 받았습니다. 그래서 제가 알아봤던 내용은
# echo 2 > /proc/sys/vm/drop_caches
echo 1, 3 명령은 pagecache 영역을 날리게 되어 CPU 부하가 심할 수 있으니 echo 2로 dentry, inode 영역만 날리는게 낫겠다라는 결론이 였는데요. 멘토님이 해당 부분에 대해 이야기 해주신 부분은
“ echo 2로 dentry, inode 영역만 날리는게 OS 전체적으로 볼 때 영향이 적을 수는 있어도 프로세스에 영향이 갈 수 있다. 해당 명령보다는 업무팀과 연락하여 프로세스 재기동을 하고 메모리 사용 과정을 한번 더 보는게 좋을 것 같다.”
참고 : “DevOps와 SE를 위한 리눅스 커널 이야기”
'Operating System' 카테고리의 다른 글
SSL 통신과 인증서 검증 (0) | 2024.08.21 |
---|---|
Max user processes & Open files (0) | 2022.10.18 |
[Kubernetes] Container Runtime (0) | 2022.01.26 |
[Linux] TCP KeepAlive에 대한 고찰 (0) | 2021.12.13 |