/sysctl/vm.txt

RHCA 달리던 중에 "RH442 Performance Tuning Linux in Physical Virtual and Cloud"라는 과목이 있습니다. 보던 중 sysctl을 이용해서 설정할 수 있는 것들은 전체적으로 어떤 것들이 있고 어떤 의미인지 궁금해졌습니다. 그래서 관련 자료를 좀 찾아보았습니다. Kernel 소스코드를 볼만한 능력은 안되서, 문서화된 것을 하나씩 DeepL을 이용해 기계번역한 내용을 바탕으로 정리해보고자 합니다.

Kernel 버전 2.6.29의 /proc/sys/vm/* 에 대한 문서
(c) 1998, 1999, Rik van Riel riel@nl.linux.org
(c) 2008 Peter W. Morreale pmorreale@novell.com

일반 정보 및 법적 고지 사항은 README 파일을 참조하십시오.

이 파일은 /proc/sys/vm 디렉토리에 있는 sysctl 파일의 문서를 포함하며, Linux 커널 버전 2.6.29에 적용됩니다.
이 디렉토리의 파일은 Linux 커널의 가상 메모리(VM) 서브시스템의 작동 조정 및 더티(dirty) 데이터의 디스크 쓰기 출력을 조정하는 데 사용될 수 있습니다.

이 파일들의 기본 값과 초기화 루틴은 대부분 mm/swap.c에서 찾을 수 있습니다.

현재 이 파일들은 /proc/sys/vm에 있습니다:

- admin_reserve_kbytes
- block_dump
- compact_memory
- compact_unevictable_allowed
- dirty_background_bytes
- dirty_background_ratio
- dirty_bytes
- dirty_expire_centisecs
- dirty_ratio
- dirtytime_expire_seconds
- dirty_writeback_centisecs
- drop_caches
- extfrag_threshold
- hugetlb_shm_group
- laptop_mode
- legacy_va_layout
- lowmem_reserve_ratio
- max_map_count
- memory_failure_early_kill
- memory_failure_recovery
- min_free_kbytes
- min_slab_ratio
- min_unmapped_ratio
- mmap_min_addr
- mmap_rnd_bits
- mmap_rnd_compat_bits
- nr_hugepages
- nr_hugepages_mempolicy
- nr_overcommit_hugepages
- nr_trim_pages         (only if CONFIG_MMU=n)
- numa_zonelist_order
- oom_dump_tasks
- oom_kill_allocating_task
- overcommit_kbytes
- overcommit_memory
- overcommit_ratio
- page-cluster
- panic_on_oom
- percpu_pagelist_fraction
- stat_interval
- stat_refresh
- numa_stat
- swappiness
- unprivileged_userfaultfd
- user_reserve_kbytes
- vfs_cache_pressure
- watermark_boost_factor
- watermark_scale_factor
- zone_reclaim_mode

admin_reserve_kbytes

시스템에 사용 가능한 메모리 중 cap_sys_admin 권한을 가진 사용자에게 예약되어야 하는 메모리 양입니다.
admin_reserve_kbytes는 기본값으로 min(사용 가능한 페이지의 3%, 8MB)로 설정됩니다.
이 설정은 기본 오버커밋 ‘추측(guess)’ 모드에서 관리자가 로그인하고 필요 시 프로세스를 종료할 수 있도록 충분한 메모리를 제공합니다.
overcommit ‘never’ 모드에서 실행되는 시스템은 이 값을 복구용 프로그램의 전체 가상 메모리 크기를 고려해 증가시켜야 합니다. 그렇지 않으면 루트 사용자가 시스템 복구를 위해 로그인하지 못할 수 있습니다.

최소 유용한 예약 용량을 어떻게 계산하나요?
sshd 또는 login + bash (또는 다른 쉘) + top (또는 ps, kill 등)

오버커밋 ‘guess’ 모드에서는 Resident Set Size(RSS)를 합산할 수 있습니다.
x86_64 아키텍처에서는 약 8MB입니다.

오버커밋 ‘never’ 모드에서는 가상 크기(VSZ)의 최대값을 취하고 그들의 RSS 합계를 추가합니다.
x86_64 아키텍처에서는 약 128MB입니다.

이 값을 변경하면 응용 프로그램이 메모리를 요청할 때마다 적용됩니다.


block_dump

block_dump는 0이 아닌(nonzero) 값으로 설정될 경우 블록 I/O 디버깅을 활성화합니다. 블록 I/O 디버깅에 대한 자세한 내용은 Documentation/laptops/laptop-mode.txt에 있습니다.


compact_memory

CONFIG_COMPACTION이 설정된 경우에만 사용할 수 있습니다. 파일에 1을 기록하면 모든 영역이 압축되어 가능한 경우 연속된 블록에 자유 메모리가 할당됩니다.
이는 예를 들어 거대 페이지 할당 시 중요할 수 있지만, 프로세스도 필요에 따라 직접 메모리를 압축합니다.


compact_unevictable_allowed

CONFIG_COMPACTION이 설정된 경우에만 사용할 수 있습니다. 이 값을 1로 설정하면 압축 과정에서 압축 대상 페이지로 사용할 수 없는 LRU(mlocked 페이지)를 검사할 수 있습니다.
이 옵션은 소규모 페이지 오류로 인한 지연이 큰 연속된 자유 메모리와 교환할 수 있는 시스템에서 사용해야 합니다. 0으로 설정하면 압축이 제거 불가능한 페이지를 이동하지 않도록 방지합니다. 기본값은 1입니다.


dirty_background_bytes

백그라운드 커널 플러셔(flusher) 스레드가 쓰기 백업을 시작하는 더티 메모리의 양을 포함합니다.

참고: dirty_background_bytes는 dirty_background_ratio의 대응 항목입니다. 두 개 중 하나만 동시에 지정할 수 있습니다. 한 sysctl이 설정되면 즉시 더티 메모리 한도를 평가하는 데 반영되며, 다른 하나는 읽을 때 0으로 표시됩니다.


dirty_background_ratio

사용 가능한 총 메모리 중 자유 페이지와 회수 가능한 페이지의 비율로, 배경 커널 플러셔 스레드가 더티 데이터를 쓰기 시작하는 페이지 수를 나타냅니다.
사용 가능한 총 메모리는 시스템 총 메모리와 동일하지 않습니다.


dirty_bytes

디스크 쓰기를 생성하는 프로세스가 자체적으로 쓰기 백업을 시작하는 더티 메모리의 양을 포함합니다.

참고: dirty_bytes는 dirty_ratio의 대응 항목입니다. 두 가지 중 하나만 동시에 지정할 수 있습니다. 한 sysctl이 쓰여지면 즉시 더티 메모리 한도를 평가하는 데 반영되며, 다른 하나는 읽을 때 0으로 표시됩니다.

참고: dirty_bytes의 최소 허용 값은 두 페이지(바이트 단위)입니다. 이 한도보다 낮은 값은 무시되며 기존 구성은 유지됩니다.


dirty_expire_centisecs

이 조정 가능한 설정은 커널 플러셔 스레드가 쓰기 작업을 수행하기에 충분한 시간이 경과한 더티 데이터를 정의하는 데 사용됩니다. 이 값은 100분의 1 초 단위로 표시됩니다. 메모리 내에서 이 간격보다 더 오래 더티 상태로 유지된 데이터는 다음에 플러셔 스레드가 활성화될 때 쓰기 작업이 수행됩니다.


dirty_ratio

사용 가능한 총 메모리 중 자유 페이지와 회수 가능한 페이지의 비율로, 디스크 쓰기를 생성하는 프로세스가 자체적으로 더티 데이터를 쓰기 시작하는 페이지 수를 나타냅니다.
사용 가능한 총 메모리는 시스템 총 메모리와 동일하지 않습니다.


dirtytime_expire_seconds

lazytime inode의 페이지가 지속적으로 더티 상태가 되면, 업데이트된 타임스탬프를 가진 inode는 절대 디스크에 쓰여지지 않을 수 있습니다. 또한, 파일 시스템에서 발생한 유일한 이벤트가 atime 업데이트로 인해 발생한 dirtytime inode인 경우, 해당 inode가 결국 디스크에 쓰여지도록 작업자가 스케줄링됩니다. 이 조정 가능한 값은 커널 플러셔 스레드가 dirty inode를 쓰기 백업 대상으로 선택할 수 있을 만큼 충분히 오래되었는지 정의하는 데 사용됩니다. 또한 dirtytime_writeback 스레드를 깨우는 간격으로도 사용됩니다.


dirty_writeback_centisecs

커널 플러셔 스레드는 주기적으로 깨어나서 old 데이터를 디스크에 기록합니다. 이 조정 항목은 이러한 깨어남 사이의 간격을 100분의 1초 단위로 표현합니다.
이 값을 0으로 설정하면 주기적인 쓰기 백업을 완전히 비활성화합니다.


drop_caches

이 파일에 쓰기를 수행하면 커널이 깨끗한 캐시를 삭제하고 dentry 및 inode와 같은 회수 가능한 슬래브 객체를 회수합니다. 삭제된 후에는 해당 메모리가 자유 메모리로 변환됩니다.

페이지 캐시를 해제하려면:

echo 1 > /proc/sys/vm/drop_caches

재사용 가능한 슬래브(slab) 객체(덴트리(dentrie) 및 아이노드 포함)를 해제하려면:

echo 2 > /proc/sys/vm/drop_caches

슬래브 객체와 페이지 캐시를 모두 해제하려면:

echo 3 > /proc/sys/vm/drop_caches

이 작업은 비파괴적이며 더러운 객체를 해제하지 않습니다. 이 작업으로 해제되는 객체의 수를 늘리려면 사용자는 /proc/sys/vm/drop_caches에 쓰기 전에 sync를 실행할 수 있습니다. 이는 시스템에 있는 더러운 객체의 수를 최소화하고 해제될 후보 객체를 더 많이 생성합니다.
이 파일은 커널 캐시(inodes, dentries, 페이지 캐시 등)의 성장 을 제어하는 수단이 아닙니다.
이 파일은 시스템의 다른 부분에서 메모리가 필요할 때 커널이 자동으로 회수하는 객체입니다. 이 객체들은 시스템의 다른 부분에서 메모리가 필요할 때 커널에 의해 자동으로 회수됩니다.
이 파일을 사용하면 성능 문제가 발생할 수 있습니다. 캐시된 객체를 버리기 때문에, 특히 해당 객체가 활발히 사용 중이었다면, 삭제된 객체를 재구성하는 데 상당한 양의 I/O 및 CPU 자원이 소요될 수 있습니다. 이 때문에 테스트 또는 디버깅 환경 외에서는 사용을 권장하지 않습니다.
이 파일을 사용할 때 커널 로그에 정보 메시지가 표시될 수 있습니다:

cat (1234): drop_caches: 3

이 메시지는 정보 제공용이며, 시스템에 문제가 있다는 의미는 아닙니다. 이 메시지를 비활성화하려면 drop_caches에 echo 4(비트 2)하세요.


extfrag_threshold

이 매개변수는 커널이 hight-order 할당을 충족시키기 위해 메모리를 압축하거나 직접 회수할지 여부에 영향을 미칩니다. debugfs에 있는 extfrag/extfrag_index 파일은 시스템 내 각 구역에서 각 차원의 분할 지수를 표시합니다. 0에 가까운 값은 메모리 부족으로 인해 할당이 실패할 수 있음을 의미하며, 1000에 가까운 값은 분할로 인해 실패가 발생함을 의미하며, -1은 워터마크가 충족되면 할당이 성공할 것임을 의미합니다.
커널은 분할 지수가 extfrag_threshold 이하인 경우 해당 구역에서 메모리를 압축하지 않습니다. 기본 값은 500입니다.


highmem_is_dirtyable

CONFIG_HIGHMEM이 활성화된 시스템(32비트 시스템)에서만 사용할 수 있습니다.
이 매개변수는 high 메모리가 더티 작성자 제한에 포함되는지 여부를 제어합니다. 기본적으로 이 경우 커널이 직접적으로 접근하거나 사용할 수 있는 메모리 양만 더티 처리될 수 있습니다. 결과적으로 메모리 용량이 큰 시스템에서 저메모리가 거의 소진된 경우 작성자가 너무 일찍 제한될 수 있으며 스트리밍 쓰기가 매우 느려질 수 있습니다.
값을 0이 아닌 값으로 변경하면 더 많은 메모리가 더티 처리될 수 있으며, 이로 인해 작성기가 더 많은 데이터를 작성하고 이를 저장 장치에 더 효율적으로 플러시할 수 있습니다. 주의할 점은 이 경우 조기 OOM 킬러 위험이 동반될 수 있다는 점입니다. 일부 작성기(예: 직접 블록 장치 작성기)는 저메모리만 사용할 수 있으며, 스로틀링 없이 저메모리를 더티 데이터로 채울 수 있기 때문입니다.


hugetlb_shm_group

hugetlb_shm_group에는 hugetlb 페이지를 사용하여 SysV 공유 메모리 세그먼트를 생성할 수 있는 그룹 ID가 포함되어 있습니다.


laptop_mode

laptop_mode는 “laptop mode”를 제어하는 설정 항목입니다. 이 설정 항목으로 제어되는 모든 사항은 Documentation/laptops/laptop-mode.txt에 자세히 설명되어 있습니다.


legacy_va_layout

이 값이 0이 아니면 이 sysctl은 새로운 32비트 mmap 레이아웃을 비활성화합니다. 커널은 모든 프로세스에 대해 레거시(2.4) 레이아웃을 사용합니다.


lowmem_reserve_ratio

highmem 시스템을 사용하는 특정 특수 작업 부하에서 커널이 프로세스 메모리를 “lowmem” 구역에서 할당하도록 허용하는 것은 위험합니다. 이는 해당 메모리가 mlock() 시스템 호출을 통해 고정되거나 스왑 공간의 부족으로 인해 고정될 수 있기 때문입니다.
또한 대규모 highmem 메모리 시스템에서 회수 가능한 lowmem 메모리의 부족은 치명적일 수 있습니다.
따라서 Linux 페이지 할당기는 highmem를 사용할 수 있는 할당을 lowmem를 과도하게 사용하지 않도록 방지하는 메커니즘을 갖추고 있습니다. 이는 특정 양의 lowmem이 고정된 사용자 메모리로 캡처되는 가능성으로부터 보호된다는 의미입니다.
(같은 논리가 16메가바이트 ISA DMA 영역에도 적용됩니다. 이 메커니즘은 highmem나 lowmem를 사용할 수 있는 할당으로부터 해당 영역도 보호합니다).
lowmem_reserve_ratio 조정 변수는 커널이 이러한 lowmem 구역을 보호하는 데 얼마나 공격적으로 행동하는지 결정합니다.
highmem이나 ISA DMA를 사용하는 시스템에서 애플리케이션이 mlock()을 사용하거나 스왑 없이 실행 중인 경우 lowmem_reserve_ratio 설정을 변경하는 것이 좋습니다.
lowmem_reserve_ratio는 배열입니다. 이 파일을 읽으면 확인할 수 있습니다.

% cat /proc/sys/vm/lowmem_reserve_ratio
256     256     32

그러나 이 값들은 직접 사용되지 않습니다. 커널은 이 값들로부터 각 영역의 보호 페이지 #를 계산합니다. 이들은 /proc/zoneinfo에 보호 페이지 배열로 표시됩니다. (이것은 x86-64 시스템의 예시입니다).
각 존은 다음과 같은 보호 페이지 배열을 갖습니다.

Node 0, zone      DMA
  pages free     1355
        min      3
        low      3
        high     4
    :
    :
    numa_other   0
        protection: (0, 2004, 2004, 2004)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  pagesets
    cpu: 0 pcp: 0
        :

이 보호 설정은 이 존이 페이지 할당에 사용되어야 하는지, 아니면 회수되어야 하는지 판단하기 위해 점수에 추가됩니다.
이 예에서, 이 DMA 구역에 일반 페이지(index=2)가 필요하고 워터마크[WMARK_HIGH]가 워터마크로 사용된다면, 커널은 이 구역을 사용하지 않아야 한다고 판단합니다. 왜냐하면 pages_free(1355)가 watermark + protection[2](4 + 2004 = 2008)보다 작기 때문입니다. 이 protection 값이 0이라면 이 구역은 일반 페이지 요구사항에 사용됩니다. 요구사항이 DMA 구역(index=0)인 경우 protection0이 사용됩니다.
zone[i]의 보호[j]는 다음 표현식으로 계산됩니다.

(i < j): zone[i]->protection[j]
= (노드 내 zone[i+1]부터 zone[j]까지 관리되는 페이지의 총합) / lowmem_reserve_ratio[i];

(i = j):
(보호되지 않아야 함. = 0;

(i > j):
(필요 없음, 하지만 0으로 표시됨)

lowmem_reserve_ratio[i]의 기본 값은 다음과 같습니다.
256 (zone[i]가 DMA 또는 DMA32 구역을 의미하는 경우)
32 (기타 경우).

위 식과 같이 이들은 비율의 역수입니다.
256은 1/256을 의미합니다. 보호 페이지 수는 노드 내 상위 구역의 관리 페이지 총합의 약 “0.39%”가 됩니다.

더 많은 페이지를 보호하려면 더 작은 값이 효과적입니다. 최소 값은 1(1/1 -> 100%)입니다. 1보다 작은 값은 페이지 보호를 완전히 비활성화합니다.


max_map_count:

이 파일에는 프로세스가 가질 수 있는 메모리 매핑 영역의 최대 수가 포함되어 있습니다. 메모리 매핑 영역은 malloc 함수를 호출하는 부수적 효과로 사용되며, mmap, mprotect, madvise 함수를 직접 호출할 때, 그리고 공유 라이브러리를 로드할 때도 사용됩니다.
대부분의 응용 프로그램은 1,000개 미만의 맵을 필요로 하지만, 특정 프로그램, 특히 malloc 디버거는 많은 맵을 소비할 수 있으며, 예를 들어 할당당 1~2개의 맵을 사용할 수 있습니다.
기본값은 65,536입니다.


memory_failure_early_kill:

하드웨어가 커널로 처리할 수 없는 배경에서 교정 안된(uncorrected) 메모리 오류(일반적으로 메모리 모듈의 2비트 오류)가 감지될 때 프로세스를 종료하는 방법을 제어합니다. 일부 경우(예: 페이지가 디스크에 유효한 복사본을 여전히 가지고 있는 경우) 커널은 응용 프로그램에 영향을 주지 않고 오류를 투명하게 처리합니다. 그러나 데이터의 다른 최신 복사본이 없는 경우, 데이터 손상이 확산되는 것을 방지하기 위해 프로세스를 종료합니다.

1: 손상된 페이지가 재로드 불가능한 경우, 해당 페이지를 매핑한 모든 프로세스를 손상이 감지되는 즉시 종료합니다. 이 옵션은 커널 내부에서 할당된 데이터나 스왑 캐시와 같은 일부 페이지 유형에는 지원되지 않지만, 대부분의 사용자 페이지에는 적용됩니다.

0: 손상된 페이지를 모든 프로세스에서 매핑 해제하고 해당 페이지를 액세스하려는 프로세스만 종료합니다.

종료는 catchable SIGBUS 신호(BUS_MCEERR_AO)를 사용하여 수행되므로, 프로세스는 원할 경우 이를 처리할 수 있습니다.
이 기능은 고급 기계 검사 처리를 지원하는 아키텍처/플랫폼에서만 활성화되며, 하드웨어 기능에 따라 다릅니다.
응용 프로그램은 PR_MCE_KILL prctl을 사용하여 이 설정을 개별적으로 재정의할 수 있습니다.


memory_failure_recovery:

플랫폼에서 지원되는 경우 메모리 오류 복구를 활성화합니다.

1: 복구를 시도합니다.
0: 메모리 오류 시 항상 패닉을 발생시킵니다.


min_free_kbytes:

이 옵션은 Linux VM이 최소 수의 킬로바이트를 자유롭게 유지하도록 강제합니다. VM은 이 수치를 사용하여 시스템 내 각 lowmem 구역에 대한 워터마크[WMARK_MIN] 값을 계산합니다. 각 lowmem 구역은 크기에 비례하여 예비 자유 페이지 수를 할당받습니다.
PF_MEMALLOC 할당을 충족시키기 위해 최소량의 메모리가 필요합니다; 이 값을 1024KB 미만으로 설정하면 시스템이 미묘하게 고장나고 고부하 시 데드락에 취약해집니다.
이 값을 너무 높게 설정하면 시스템이 즉시 OOM(메모리 부족) 상태가 됩니다.


min_slab_ratio:

이 옵션은 NUMA 커널에서만 사용할 수 있습니다.
각 존의 총 페이지 수 중 일정 비율입니다. 존 재할당 시(로컬 존에서 재할당으로 전환되는 경우) 해당 존의 페이지 중 이 비율보다 많은 페이지가 재할당 가능한 슬래브 페이지인 경우 슬래브가 재할당됩니다. 이 설정은 NUMA 시스템에서 글로벌 회수 작업이 드물게 수행되더라도 슬래브 성장 속도가 통제되도록 보장합니다.

기본값은 5%입니다.

참고: 슬래브 회수는 존/노드별로 트리거됩니다. 현재 슬래브 메모리 회수 과정은 노드별 특성이 없으며 빠르지 않을 수 있습니다.


min_unmapped_ratio:

이 옵션은 NUMA 커널에서만 사용할 수 있습니다.

이 값은 각 존의 총 페이지 수에 대한 백분율입니다. 존 재할당은 이 백분율보다 많은 페이지가 zone_reclaim_mode에서 재할당을 허용하는 상태에 있을 경우에만 발생합니다.

zone_reclaim_mode가 4와 OR 연산된 경우, 이 비율은 스왑 캐시 페이지와 tmpfs 파일을 포함한 모든 파일 기반 미매핑 페이지와 비교됩니다. 그렇지 않은 경우, tmpfs 파일과 유사한 파일은 제외된 일반 파일 기반 미매핑 페이지만 고려됩니다.

기본값은 1%입니다.


mmap_min_addr:

이 파일은 사용자 프로세스가 mmap을 통해 할당 받을 수 있는 주소 공간의 최소 크기를 지정합니다. 커널의 null 참조 오류가 메모리 사용 공간 프로세스의 첫 몇 페이지에 있는 정보에 따라 우연히 작동할 수 있으므로, 사용 공간 프로세스는 해당 영역에 쓰기 작업을 수행하지 못하도록 해야 합니다. 기본적으로 이 값은 0으로 설정되어 있으며, 보안 모듈에 의해 보호 조치가 적용되지 않습니다. 이 값을 64k와 같은 값으로 설정하면 대부분의 응용 프로그램이 정상적으로 작동할 수 있으며, 미래의 잠재적인 커널 오류에 대비한 다층 방어 체계를 제공할 수 있습니다.


mmap_rnd_bits:

이 값은 mmap 할당 시 주소 공간 무작위화 조정이 지원되는 아키텍처에서 vma 영역의 기본 주소에 대한 무작위 오프셋을 결정하는 데 사용되는 비트 수를 선택하는 데 사용됩니다. 이 값은 아키텍처의 최소 및 최대 지원 값으로 제한됩니다.

이 값은 부팅 후 /proc/sys/vm/mmap_rnd_bits 조정 옵션을 사용하여 변경할 수 있습니다.


mmap_rnd_compat_bits:

이 값은 호환 모드에서 실행되는 응용 프로그램의 mmap 할당으로 인해 생성된 vma 영역의 기본 주소에 대한 무작위 오프셋을 결정하기 위해 사용할 비트 수를 선택하는 데 사용됩니다. 이 값은 주소 공간 무작위화 조정이 가능한 아키텍처에서 적용됩니다. 이 값은 아키텍처의 최소 및 최대 지원 값으로 제한됩니다.

이 값은 부팅 후 /proc/sys/vm/mmap_rnd_compat_bits 조정 옵션을 사용하여 변경할 수 있습니다.


nr_hugepages:

hugepage 풀의 최소 크기를 변경합니다.
자세한 내용은 Documentation/admin-guide/mm/hugetlbpage.rst를 참조하세요.


nr_hugepages_mempolicy

실행 시 특정 NUMA 노드 집합에서 hugepage 풀의 크기를 변경합니다.
자세한 내용은 Documentation/admin-guide/mm/hugetlbpage.rst를 참조하세요.


nr_overcommit_hugepages

hugepage 풀의 최대 크기를 변경합니다. 최대 크기는 nr_hugepages + nr_overcommit_hugepages입니다.
Documentation/admin-guide/mm/hugetlbpage.rst를 참조하세요.


nr_trim_pages

이 옵션은 NOMMU 커널에서만 사용할 수 있습니다.

이 값은 2의 제곱으로 정렬된 NOMMU mmap 할당에 대한 초과 페이지 트리밍 동작을 조정합니다.

0 값은 할당에 대한 트리밍을 완전히 비활성화하며, 1 값은 과도한 페이지를 적극적으로 트리밍합니다. 1 이상인 값은 트리밍이 시작되는 기준점 역할을 합니다.

기본 값은 1입니다.

자세한 내용은 Documentation/nommu-mmap.txt를 참조하세요.


numa_zonelist_order

이 sysctl은 NUMA 전용이며 사용 중단되었습니다. 노드 순서 외의 다른 설정은 실패할 수 있습니다!
‘메모리가 할당되는 위치’는 zonelists에 의해 제어됩니다. (이 문서에서는 간단한 설명을 위해 ZONE_HIGHMEM/ZONE_DMA32를 제외했습니다. ZONE_DMA를 ZONE_DMA32로 읽을 수 있습니다…)

NUMA가 아닌 경우, GFP_KERNEL용 zonelist는 다음과 같은 순서로 구성됩니다.
ZONE_NORMAL -> ZONE_DMA

이는 GFP_KERNEL 메모리 할당 요청이 ZONE_NORMAL이 사용할 수 없을 때만 ZONE_DMA에서 메모리를 할당받음을 의미합니다.
NUMA 환경에서는 다음 두 가지 유형의 순서를 고려할 수 있습니다. 2노드 NUMA를 가정하고 아래는 Node(0)의 GFP_KERNEL zonelist입니다.
(A) Node(0) ZONE_NORMAL -> Node(0) ZONE_DMA -> Node(1) ZONE_NORMAL
(B) Node(0) ZONE_NORMAL -> Node(1) ZONE_NORMAL -> Node(0) ZONE_DMA.

유형(A)은 노드(0)의 프로세스에 대한 최상의 로컬리티를 제공하지만, ZONE_NORMAL이 소진되기 전에 ZONE_DMA가 사용됩니다. 이것은 ZONE_DMA가 일반적으로 작기 때문에 ZONE_DMA의 메모리 부족(OOM) 발생 가능성이 증가합니다.

Type(B)는 최상의 로컬리티를 제공하지는 않지만 DMA 존의 OOM에 대해 더 견고합니다.

Type(A)는 “Node” 순서라고 합니다. Type(B)는 “Zone” 순서입니다.

“Node Order”는 노드별로 zonelist를 정렬한 후 각 노드 내의 존별로 정렬합니다. 노드 순서를 지정하려면 “[Nn]ode”를 사용합니다.

“Zone Order”는 존 유형별로 zonelist를 정렬한 후 각 존 내의 노드별로 정렬합니다. 존 순서를 지정하려면 “[Zz]one”을 사용합니다.

자동 구성을 요청하려면 “[Dd]efault”를 지정합니다.

32비트 시스템에서는 커널이 액세스할 수 있는 할당을 위해 Normal 존을 유지해야 하기 때문에 “zone” 순서가 선택됩니다.

64비트 시스템에서는 DMA32/DMA가 필요한 장치가 상대적으로 드물기 때문에 “Node” 순서가 선택됩니다.

시스템/응용 프로그램에 문제가 발생하지 않는 한 기본 순서를 권장합니다.


oom_dump_tasks

커널이 OOM-killing을 수행할 때 커널 스레드를 제외하고 시스템 전체의 작업 덤프를 생성하도록 활성화합니다. 이 덤프에는 pid, uid, tgid, vm size, rss, pgtables_bytes, swapents, oom_score_adj, score, name과 같은 정보가 포함됩니다. 이 정보는 OOM 킬러가 왜 호출되었는지, 이를 유발한 악성 작업을 식별하는 데 도움이 되며, OOM 킬러가 특정 작업을 선택해 종료한 이유를 파악하는 데도 유용합니다.
이 옵션이 0으로 설정되면 해당 정보가 표시되지 않습니다. 매우 큰 시스템(수천 개의 작업이 있는 경우)에서는 각 작업의 메모리 상태 정보를 덤프하는 것이 현실적이지 않을 수 있습니다. 이러한 시스템은 OOM 조건에서 성능 저하를 강제로 초래하지 않도록 해야 하며, 해당 정보가 필요하지 않을 수 있기 때문입니다.
이 값이 0이 아닌 경우, OOM 킬러가 메모리 과다 사용 작업을 실제로 종료할 때마다 이 정보가 표시됩니다.
기본값은 1(활성화)입니다.


oom_kill_allocating_task

이 옵션은 메모리 부족 상황에서 OOM을 유발한 작업을 종료할지 여부를 활성화 또는 비활성화합니다.
이 옵션이 0으로 설정되면 OOM 킬러는 전체 작업 목록을 스캔하고 헤우리스틱(heuristics)을 기반으로 종료할 작업을 선택합니다. 이는 일반적으로 종료 시 큰 양의 메모리를 해제하는 악성 메모리 과다 사용 작업을 선택합니다.
이 값이 0이 아닌 경우, OOM 킬러는 단순히 메모리 부족 상태를 유발한 작업을 종료합니다. 이는 비용이 많이 드는 작업 목록 스캔을 피합니다.
panic_on_oom이 선택되면, oom_kill_allocating_task에서 사용되는 값보다 우선순위를 가집니다.
기본값은 0입니다.


overcommit_ratio:

overcommit_memory가 2로 설정되면 할당된 주소 공간은 스왑 공간에 이 백분율만큼의 물리적 RAM을 더한 값을 초과할 수 없습니다.
위 내용을 참조하세요.


page-cluster

page-cluster는 단일 시도에서 스왑에서 연속된 페이지를 읽을 수 있는 페이지 수를 제어합니다. 이는 페이지 캐시 미리 읽기와 유사한 스왑의 기능입니다.
언급된 연속성은 가상/물리 주소가 아닌 스왑 공간 내에서의 연속성을 의미합니다. 즉, 함께 스왑 아웃된 페이지들을 의미합니다.
이 값은 로그 값입니다. 0으로 설정하면 “1 페이지”, 1로 설정하면 “2 페이지”, 2로 설정하면 “4 페이지” 등을 의미합니다. 0으로 설정하면 스왑 미리 읽기 기능이 완전히 비활성화됩니다.
기본 값은 3(한 번에 8페이지)입니다. 작업 부하가 스왑 집약적이라면 이 값을 다른 값으로 조정하는 것이 약간의 이점이 있을 수 있습니다.
낮은 값은 초기 오류의 지연 시간을 줄이지만, 동시에 연속 페이지 미리 읽기가 가져왔을 오류와 I/O 지연이 추가로 발생할 수 있습니다.


panic_on_oom

이 옵션은 메모리 부족 시 패닉을 활성화하거나 비활성화합니다.

이 옵션이 0으로 설정되면 커널은 일부 이상 프로세스를 종료합니다. 이 프로세스는 oom_killer라고 불립니다. 일반적으로 oom_killer는 이상 프로세스를 종료하고 시스템은 정상적으로 작동합니다.

이 옵션이 1로 설정되면 메모리 부족 시 커널이 패닉 상태에 빠집니다. 그러나 mempolicy/cpusets를 통해 노드 사용을 제한하는 프로세스가 해당 노드가 메모리 고갈 상태가 되면, 해당 프로세스가 oom-killer에 의해 종료될 수 있습니다. 이 경우 패닉은 발생하지 않습니다. 다른 노드의 메모리가 자유로울 수 있기 때문입니다. 이는 시스템 전체 상태가 아직 치명적이지 않을 수 있음을 의미합니다.

이 값이 2로 설정되면, 위에서 언급된 경우에도 커널은 강제적으로 패닉을 발생시킵니다. 메모리 cgroup 하에서 oom이 발생하더라도 전체시스템이 패닉 상태가 됩니다.

기본값은 0입니다. 1과 2는 클러스터링의 failover를 위해 사용됩니다. failover 정책에 따라 적절한 값을 선택하십시오.
panic_on_oom=2+kdump는 oom이 발생하는 이유를 조사하는 강력한 도구를 제공합니다. 스냅샷을 얻을 수 있습니다.


percpu_pagelist_fraction

이 값은 각 존에서 각 per_cpu_pagelist에 할당되는 페이지의 최대 비율(pcp->high의 고점)을 표시합니다. 이 값의 최소값은 8입니다. 이는 각 존에서 각 per_cpu_pagelist에 할당되는 페이지가 존의 전체 페이지 수의 1/8을 초과하지 않도록 제한합니다. 이 설정은 핫 per cpu 페이지 목록의 값만 변경합니다. 사용자는 100과 같은 숫자를 지정하여 각 존의 1/100을 각 per cpu 페이지 목록에 할당할 수 있습니다.

각 per cpu 페이지 목록의 배치 값도 이에 따라 업데이트됩니다. 이는 pcp->high/4로 설정됩니다. 배치의 상한은 (PAGE_SHIFT * 8)입니다.

초기값은 0입니다. 커널은 부팅 시 이 값을 사용하여 각 CPU별 페이지 목록의 고수위 표시를 설정하지 않습니다. 사용자가 이 sysctl에 ‘0’을 작성하면 기본 동작으로 돌아갑니다.


stat_interval

VM 통계가 업데이트되는 시간 간격입니다. 기본값은 1초입니다.


stat_refresh

루트 사용자만 수행할 수 있는 읽기 또는 쓰기 작업은 각 CPU별 VM 통계를 글로벌 총계로 플러시합니다. 테스트 시 더 정확한 보고서를 위해. 예: cat /proc/sys/vm/stat_refresh /proc/meminfo

부작용으로, 이 명령은 음수 총합(다른 곳에서는 0으로 보고됨)을 검사하며, 음수 총합이 발견되면 EINVAL 오류로 실패하고 dmesg에 경고 메시지를 출력합니다. (현재 시점에서 일부 통계는 가끔 음수로 표시될 수 있지만, 이로 인한 부작용은 없습니다: 이러한 통계에 대한 오류 및 경고는 억제됩니다.)


numa_stat

이 인터페이스는 NUMA 통계의 런타임 구성을 허용합니다. 페이지 할당 성능이 병목 현상이 되고 일부 도구 고장이나 NUMA 카운터 정밀도 저하를 용인할 수 있다면 다음과 같이 할 수 있습니다:

echo 0 > /proc/sys/vm/numa_stat

페이지 할당 성능이 병목 현상이 아니며 모든 도구가 정상적으로 작동하도록 원한다면 다음과 같이 할 수 있습니다:

echo 1 > /proc/sys/vm/numa_stat

swappiness

이 제어 옵션은 커널이 메모리 페이지를 스왑하는 정도를 정의합니다. 높은 값은 스왑 공격성을 증가시키고, 낮은 값은 스왑 양을 감소시킵니다. 0 값은 커널이 자유 메모리와 파일 기반 페이지의 양이 높은 워터마크 마크보다 작아질 때까지 스왑을 시작하지 않도록 지시합니다.

기본 값은 60입니다.


unprivileged_userfaultfd

이 플래그는 비특권 사용자가 userfaultfd 시스템 호출을 사용할 수 있는지 여부를 제어합니다. 이 값을 1로 설정하면 비특권 사용자가 userfaultfd 시스템 호출을 사용할 수 있도록 허용하며, 0으로 설정하면 userfaultfd를 특권 사용자(SYS_CAP_PTRACE 권한을 가진 사용자)에게만 제한합니다.

기본값은 1입니다.


user_reserve_kbytes

overcommit_memory가 2로 설정되어 있을 때(“never overcommit” 모드), 현재 프로세스 크기의 3%와 user_reserve_kbytes 중 작은 값을 자유 메모리에서 예약합니다. 이는 사용자가 단일 메모리 과다 사용 프로세스를 시작하여 복구(과다 사용 프로세스 종료)가 불가능한 상황을 방지하기 위해 설계되었습니다.

user_reserve_kbytes는 기본적으로 현재 프로세스 크기의 3%와 128MB 중 작은 값으로 설정됩니다.

이 값을 0으로 줄이면 사용자는 admin_reserve_kbytes를 제외한 모든 자유 메모리를 단일 프로세스에 할당할 수 있습니다. 이후 명령어를 실행하려는 시도는 “fork: Cannot allocate memory” 오류가 발생합니다.
이 설정을 변경하면 응용 프로그램이 메모리를 요청할 때마다 적용됩니다.


vfs_cache_pressure

이 백분율 값은 커널이 디렉토리 및 inode 객체의 캐싱에 사용되는 메모리를 회수하려는 경향을 제어합니다.
vfs_cache_pressure=100의 기본값에서 커널은 페이지 캐시 및 스왑 캐시 회수와의 균형을 고려해 dentries와 inodes를 “공정하게” 회수하려고 시도합니다. vfs_cache_pressure를 감소시키면 커널은 dentries 및 inode 캐시를 유지하는 것을 선호합니다. vfs_cache_pressure=0일 경우, 커널은 메모리 압력으로 인해 dentries 및 inode를 절대로 회수하지 않으며,
이것은 쉽게 메모리 부족 상태로 이어질 수 있습니다. vfs_cache_pressure를 100을 초과해 증가시키면 커널은 dentries 및 inode를 회수하는 것을 선호합니다.

vfs_cache_pressure를 100을 크게 초과하여 증가시키면 성능에 부정적인 영향을 미칠 수 있습니다. 회수 코드는 사용 가능한 디렉토리 및 inode 객체를 찾기 위해 다양한 잠금을 획득해야 합니다. vfs_cache_pressure=1000일 경우, 사용 가능한 객체의 10배를 검색하게 됩니다.


watermark_boost_factor:

이 요소는 메모리가 분할될 때 재할당되는 수준을 제어합니다. 이 요소는 페이지블록 내부에 이동성이 다른 페이지가 혼합될 경우 해당 구역의 고수위 표시기의 백분율만큼 재할당될 것을 정의합니다. 이 설정의 목적은 향후 압축 작업의 부담을 줄이고 SLUB 할당, THP 및 hugetlbfs 페이지와 같은 고차원 할당의 성공률을 높이는 것입니다.

watermark_scale_factor 매개변수와 일관성을 유지하기 위해 단위는 10,000의 분수입니다. !DISCONTIGMEM 구성에서 기본값 15,000은 분할로 인해 페이지 블록이 혼합될 경우 높은 워터마크의 최대 150%가 회수된다는 의미입니다. 회수 수준은 최근에 발생한 조각화 이벤트의 수에 따라 결정됩니다. 이 값이 페이지 블록보다 작다면 페이지 블록 분량의 페이지가 회수됩니다(예: 64비트 x86에서 2MB). 부스트 요소가 0이면 이 기능이 비활성화됩니다.


watermark_scale_factor:

이 요소는 kswapd의 공격성을 제어합니다. 이는 노드/시스템에 kswapd가 깨어날 때까지 남아 있는 메모리 양과 kswapd가 다시 잠들기 전에 필요한 자유 메모리 양을 정의합니다.

단위는 10,000분의 1입니다. 기본값 10은 노드/시스템의 사용 가능한 메모리 중 워터마크 간 거리가 0.1%임을 의미합니다. 최대값은 1000(메모리의 10%)입니다.

직접 회수(allocstall)에 진입하는 스레드의 비율이 높거나 kswapd가 조기에 수면 상태로 전환되는 경우(kswapd_low_wmark_hit_quickly)는 kswapd가 지연 시간 이유로 유지하는 자유 페이지 수가 시스템에서 발생하는 할당 급증에 비해 너무 작을 수 있음을 나타냅니다. 이 매개변수는 이에 따라 kswapd의 공격성을 조정하는 데 사용할 수 있습니다.


zone_reclaim_mode:

zone_reclaim_mode는 존이 메모리 부족 상태가 되었을 때 메모리를 회수하는 방식의 강도를 조정할 수 있도록 합니다. 이 값이 0으로 설정되면 존 메모리 회수가 발생하지 않습니다. 할당 요청은 시스템 내 다른 존/노드에서 충족됩니다.
이 값은 다음 값들의 OR 연산 결과입니다.
1 = Zone 재할당 활성화
2 = Zone 재할당 시 더티 페이지를 외부로 쓰기
4 = Zone 재할당 시 페이지를 스왑

zone_reclaim_mode는 기본적으로 비활성화되어 있습니다. 파일 서버나 데이터 캐싱이 유리한 워크로드의 경우, 캐싱 효과가 데이터 로컬리티보다 더 중요할 수 있으므로 zone_reclaim_mode를 비활성화 상태로 유지해야 합니다.
zone_reclaim은 워크로드가 각 파티션이 NUMA 노드 내에 맞도록 분할되어 있으며 원격 메모리 액세스가 측정 가능한 성능 저하를 초래한다는 것이 알려진 경우 활성화될 수 있습니다. 페이지 할당기는 노드 외 페이지 할당 전에 쉽게 재사용 가능한 페이지(현재 사용되지 않는 페이지 캐시 페이지)를 회수합니다.

zone reclaim이 페이지를 작성하도록 허용하면 대량의 데이터를 작성하는 프로세스가 다른 노드의 페이지를 더럽히지 않도록 합니다. zone reclaim은 존이 가득 차면 더러운 페이지를 작성하여 실질적으로 프로세스를 제한합니다. 이것은 단일 프로세스의 성능을 감소시킬 수 있습니다. 왜냐하면 해당 프로세스가 시스템 메모리를 모두 사용하여 출력 쓰기를 버퍼링할 수 없기 때문입니다. 그러나 다른 노드의 메모리를 보존하여 다른 노드에서 실행되는 다른 프로세스의 성능이 영향을 받지 않도록 합니다.

정규 스왑을 허용하면 메모리 정책이나 cpuset 구성에 의해 명시적으로 오버라이드되지 않는 한 할당은 로컬 노드로 제한됩니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

You May Also Like
Read More

Zram 성능 분석

Blog를 보다가 관심 가는 글이 보여서 AI번역+약간 교정해 보았습니다.출처: https://notes.xeome.dev/notes/Zram 소개 Zram은 압축된 가상 메모리 블록 장치를 활용하여…
Read More

/sysctl/user.txt

출처: https://www.kernel.org/doc/Documentation/sysctl/user.txt proc/sys/user/* 커널 버전 4.9.0에 대한 문서(c) 2016 Eric Biederman ebiederm@xmission.com 이 파일에는 /proc/sys/user의 sysctl 파일에 대한…
Read More

/vm/numa.rst: What is NUMA

Linux 설명서의 본진이라 생각되는 kernel.org/doc/Documentation 의 문서들을 시간날 때 조금씩 보려고 합니다. 영어를 잘 못하지만 DeepL을 이용해서 기계번역하고,…
Read More

/sysctl/README

RHCA 달리던 중에 "RH442 Performance Tuning Linux in Physical Virtual and Cloud"라는 과목이 있습니다. 보던 중 sysctl을 이용해서…