3.7. memory

memory 서브시스템은 cgroup의 작업에서 사용되는 메모리 리소스에 대한 보고서를 자동으로 생성하고 다른 작업을 사용하여 메모리 사용의 제한을 설정합니다:
memory.stat
다음 표에서 볼 수 있듯이 광범위한 메모리 통계를 보고합니다:

표 3.1. 메모리 통계가 보고하는 값들

통계 설명
cache tmpfs (shmem)를 포함하는 페이지 캐시 (바이트 단위)
rss tmpfs (shmem)를 포함하지 않는 익명 ​​스왑 캐시 (바이트 단위)
mapped_file tmpfs (shmem)를 포함한 메모리 맵핑된 파일의 크기 (바이트 단위)
pgpgin 메모리에 페이지된 페이지 갯수
pgpgout 메모리에서 페이지아웃된 페이지 갯수
swap 스왑 사용량 (바이트 단위)
active_anon tmpfs (shmem)를 포함한 활성화된 최근 최소 사용(LRU,least-recently-used) 목록에 있는 무명/스왑 캐시 (바이트 단위)
inactive_anon tmpfs (shmem)를 포함한 비활성 LRU 목록에서 익명의 스왑 캐시 (바이트 단위)
active_file 활성화된 LRU 목록에 있는 파일 기반 메모리(바이트 단위)
inactive_file 비활성화된 LRU 목록에 있는 파일기반 메모리 (바이트 단위)
unevictable 재활용할 수 없는 메모리 (바이트 단위)
hierarchical_memory_limit memory cgroup을 포함하는 계층의 메모리 제한 (바이트 단위)
hierarchical_memsw_limit memory cgroup을 포함하는 계층의 메모리와 스왑 제한 (바이트 단위)
또한 hierarchical_memory_limithierarchical_memsw_limit 이외의 파일은 각각 cgroup 뿐만 아니라 모든 자식 그룹에도 보고하는 total_ 접두사를 갖습니다. 예들 들어, swap은 cgroup에 의한 스왑 사용량을 보고하고 total_swap은 cgroup과 자식 그룹에 의한 총 스왑 사용량을 보고합니다.
memory.stat에 의해 보고된 값을 구문 분석할 때 다향한 통계가 서로 관련되어 있다는 점에 유의하십시오:
  • active_anon + inactive_anon = 익명 메모리 + tmpfs 파일 캐시 + 스왑 캐시
    따라서 active_anon + inactive_anonrss가 됩니다. 이는 rss에는 tmpfs가 포함되지 않기 때문입니다.
  • active_file + inactive_file = cache - size of tmpfs
memory.usage_in_bytes
cgroup에서 프로세스에 의해 현재 사용되는 전체 메모리 사용량을 보고합니다 (바이트 단위).
memory.memsw.usage_in_bytes
cgroup에서 프로세스에 의해 사용되는 현재 메모리 사용량과 스왑 영역 사용량의 합계를 보고합니다 (바이트 단위).
memory.max_usage_in_bytes
cgroup에서 프로세스에 의한 최대 메모리 사용량을 보고합니다 (바이트단위).
memory.memsw.max_usage_in_bytes
cgroup에서 프로세스에 의해 사용된 스왑 영역 및 최대 메모리 사용량을 보고합니다 (바이트 단위).
memory.limit_in_bytes
최대 사용자 메모리양 (파일 캐시 포함)을 설정합니다. 단위가 지정되어 있지 않으면 값은 바이트 단위로 해석됩니다. 하지만, 더 큰 단위를 숫자 뒤에 사용할 수 도 있습니다. k,K는 킬로바이트, m,M는 메가바이트, g,G는 기가바이트를 의미합니다.
root cgroup을 제한하기 위해 memory.limit_in_bytes는 사용할 수 없습니다. 계층에 있는 하위 그룹에만 값을 적용할 수 있습니다.
memory.limit_in_bytes-1을 작성하여 기존 제한을 제거합니다.
memory.memsw.limit_in_bytes
총 메모리와 스왑 사용량의 최대 크기를 지정합니다. 단위를 지정하지 않으면 값은 바이트 단위로 해석됩니다. 하지만 더 큰 단위를 숫자 뒤에 사용할 수 있습니다. k,K는 킬로바이트, m,M는 메가바이트, g,G은 기가바이트를 의미합니다.
root cgroup을 제한하기 위해 memory.memsw.limit_in_bytes는 사용할 수 없습니다. 계층에 있는 하위 그룹에만 값을 적용할 수 있습니다.
memory.memsw.limit_in_bytes-1로 작성하여 기존 제한을 제거합니다.
memory.failcnt
memory.limit_in_bytes로 설정된 메모리 제한에 도달한 횟수를 보고합니다.
memory.memsw.failcnt
memory.memsw.limit_in_bytes에 설정된 메모리와 스왑 공간의 합계가 상한에 도달한 횟수를 보고합니다.
memory.force_empty
0으로 설정하면, cgroup의 작업에서 사용되는 모든 페이지의 메모리를 비웁니다. 이 인터페이스는 cgroup에 작업이 없는 경우에만 사용할 수 있습니다. 메모리를 해제할 수 없을 경우, 가능하면 부모 cgroup으로 이동됩니다. cgroup을 삭제하기 전 memory.force_empty를 사용하여 사용되지 않는 페이지 캐시가 부모 cgroup에 이동되지 않게 합니다.
memory.swappiness
이 cgroup에 속한 작업이 사용중인 프로세스 메모리를 커널이 페이지 캐시에서 페이지를 재활용하지 하는 대신에 스왑 아웃하는 경향을 지정합니다. 이 값은 /proc/sys/vm/swappiness에 시스템 전체로 지정된 경향과 정확히 같은 방식으로 계산되는 경향 값입니다. 기본 값은 60입니다. 이 값보다 더 낮은 값으로 지정하면 커널이 프로세스 메모리를 스왑아웃 하는 경향을 감소시키고, 60 보다 더 높은 값으로 지정하면 커널이 프로세스 메모리를 스왑 아웃하는 경향을 증가시킵니다. 100보다 더 큰 값을 지정하면, 이 cgroup에 속한 프로세스의 주소 공간에 있는 페이지들을 커널이 스왑 아웃하는 것을 허용합니다.
0의 값으로 설정하면 프로세스 메모리가 스왑 아웃되는 것을 막을 수 없다는 점에 유의하십시오. 글로벌 가상 메모리 관리 논리는 cgroup 값을 읽지 않기 때문에 시스템 메모리가 부족한 경우 여전히 스왑 아웃이 발생할 수 있습니다. 페이지를 완전히 잠금하려면 cgroup 대신 mlock()을 사용합니다.
다음과 같은 그룹의 swappiness는 변경할 수 없습니다:
  • /proc/sys/vm/swappiness에 설정된 swappiness를 사용하는 root cgroup
  • 아래에 자식 그룹을 갖는 cgroup
memory.use_hierarchy
cgroup의 계층구조 전체에 대해 메모리 사용량이 계산되어야 할지를 지정하는 플래그(0 또는 1)가 포함됩니다. 만약 활성화되면(1로 지정), 메모리 서브시스템은 메모리 제한을 넘어간 프로세스와 그 자식 프로세스로부터 메모리를 재활용하게 됩니다. 디폴트값(0)에서 서브시스템은 작업의 자식에서 메모리를 재활용하지 않습니다.