RHEL7과 RHEL8 kernel간의 Swap 사용성의 변화
Environment
- Red Hat Enterprise Linux 8 and later
Issue
- swappiness가 낮고 page cache에 사용 가능한 메모리가 충분함에도 불구하고 swap 사용이 관찰됩니다.
- 'vm.swappiness'는 적절히 설정되었으며, cgroup swappiness 관련 이슈도 이미 해결된 상태입니다.
Resolution
- RHEL 7과 8 사이의 가상 메모리(VM) 관리 방식 변화로 인해, 유사한 워크로드와 튜닝 환경에서도 swap 사용 패턴이 다르게 나타날 수 있습니다.
- swap 사용량 자체나 swap 사용률이 100%가 되는 경향이 반드시 메모리 압박(memory pressure)을 의미하는 것은 아닙니다.
- 시스템이 메모리 압박을 받고 있는지 판단하기 위해 다른 통계 지표들을 모니터링할 것을 권장합니다(진단 단계 참조).
Root Cause
- RHEL 7과 8 출시 사이의 기간 동안 리눅스 커널 VM 알고리즘에 수많은 변경이 있었습니다.
- 주요 이유는 SSD와 전통적인 회전식 디스크(HDD) 사이의 디스크 속도 증가였습니다.
- SSD/NVMe 등은 전통적인 HDD 디스크보다 성능에 미치는 영향이 훨씬 적으며, 커널 VM 모델은 이를 반영하도록 업데이트되었습니다.
- 일반적으로 anonymous 메모리(일반적인 용도로 프로그램이 소유한 메모리)는 낮은 vm.swappiness 설정에서도 swap에 기록될 가능성이 더 높아졌습니다.
- 이제 페이지 가중치는 실제 페이지 크기로 계산됩니다. 이전에는 transparent huge pag(THP, 일반적으로 512개의 일반 페이지와 같음)가 1개의 pagecache 페이지와 동일하게 간주되어, THP 사용자들이 FILE LRU에 압박을 줄 가능성이 더 낮았습니다.
- 이전에는 anonymous 페이지는 active LRU에서 시작되었습니다. 이는 anonymous 메모리가 교체(eviction) 대상으로 고려되기 전에 반드시 inactive로 먼저 강등되어야 했음을 의미합니다. 이제 anonymous와 file 페이지 모두 생성 시점에 동일하게 inactive 상태가 됩니다.
- 메모리로 fault 된 파일이 나중에 교체되었다가 다시 fault 되어 돌아오는 것을 refaulted라고 합니다. 이러한 경향을 cache thrashing이라고 부릅니다.
- 이는 동일한 파일들이 여러 번 읽히고 그 전체 크기가 사용 가능한 memory/pagecache를 초과할 때 발생합니다.
- RHEL 8에서 커널은 cache thrashing을 더 공격적으로 방지하여, pagecache를 늘리고 thrashing을 줄이기 위해 inactive anonymous 페이지를 교체(evict)/swap 할 수 있습니다.
- 이러한 밸런싱은 active anonymous 페이지를 고려하지 않습니다. 즉, 활발하게 사용되는 페이지는 pagecache를 늘리기 위해 swap 되지 않습니다.
- 이 개념은 커널에서 workingset이라고 불립니다. '/proc/vmstat'에는 이 동작을 설명하는 여러 workingset 지표가 있습니다.
- RHEL 8의 'vm.swappiness' 값은 이제 0-200의 범위를 가집니다 (RHEL 7 및 이전은 0-100이었습니다).
- 'vm.swappiness=0' 설정은 swap을 거의 하지 않도록 합니다. 값 '0'을 피하거나 설정 전에 충분히 테스트할 것을 권장합니다.
Diagnostic Steps
- Swap 사용량(utilization)은 메모리 부족을 판단하는 좋은 지표가 아닙니다. 이는 I/O 양이 많은 워크로드에서 특히 그러합니다.
- 대신, '/proc/meminfo'의 MemAvailable이 시스템이 메모리 부족에 빠지거나 완전히 고갈되기 전에 얼마나 많은 메모리를 할당할 수 있는지 보여주는 더 나은 지표입니다. 이 값이 0에 가까워진다면 시스템이 Out Of Memory(OOM) 상태로 향하고 있음을 나타낼 수 있습니다.
- sar 데이터에서 'pswpin/s'와 'pswpout/s'는 swap 파티션에 대한 읽기 및 쓰기를 나타냅니다. 만약 이 수치들이 동시에 0이 아니라면, 이는 시스템이 현재 메모리 압박(memory pressure)을 받고 있음을 의미할 수 있습니다.
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.
Comments