cgroup 계층 내에서 폴더를 생성하려고 할 때 "메모리를 할당할 수 없습니다" 오류

cgroup 계층 내에서 폴더를 생성하려고 할 때 "메모리를 할당할 수 없습니다" 오류

오늘 우리는 흥미로운 버그를 만났습니다. 우리 서버에서는 사용자를 cgroup 폴더에 넣어 CPU 및 메모리와 같은 리소스 사용량을 모니터링하고 제어합니다. 사용자별 메모리 cgroup 폴더를 추가하려고 할 때 오류가 발생하기 시작했습니다.

mkdir /sys/fs/cgroup/memory/users/newuser
mkdir: cannot create directory ‘/sys/fs/cgroup/memory/users/newusers’: Cannot allocate memory

머신에 실제로 적당한 양의 메모리와 사용 가능한 스왑 공간이 있기 때문에 이는 다소 이상해 보입니다. sysctl값을 0에서 1로 변경해도 vm.overcommit_memory아무런 효과가 없습니다.

우리는 많은 수의 사용자별 하위 폴더(실제로 약 7,000개)를 실행하고 있다는 사실을 발견했습니다. 그 중 대부분은 해당 컴퓨터에서 더 이상 프로세스가 실행되지 않는 사용자를 위한 것이었습니다.

ls /sys/fs/cgroup/memory/users/ | wc -l
7298

cgroup 계층 구조에서 사용되지 않는 폴더를 제거하면 실제로 문제가 해결되었습니다.

cd /sys/fs/cgroup/memory/users/
ls | xargs -n1 rmdir
# errors for folders in-use, succeeds for unused
mkdir /sys/fs/cgroup/memory/users/newuser
# now works fine

흥미롭게도 이 문제는 메모리 cgroup에만 영향을 미칩니다. CPU/회계 cgroup은 괜찮지만 실제로는 계층 구조에 더 많은 사용자가 있습니다.

ls /sys/fs/cgroup/cpu,cpuacct/users/ | wc -l
7450
mkdir /sys/fs/cgroup/cpu,cpuacct/users/newuser
# fine

그렇다면 이러한 메모리 부족 오류의 원인은 무엇입니까? memory-cgroup 하위 시스템 자체에 일종의 메모리 제한이 있습니까?

cgroup 마운트의 내용을 찾을 수 있습니다여기

답변1

각 cgroup에는 제한이 있습니다. 이에 대해 읽을 수 있습니다.LWN.net에서:

각 cgroup에는 이와 관련된 메모리 컨트롤러별 데이터 구조(mem_cgroup)가 있습니다.

.... 회계는 cgroup에 의해 수행됩니다.

에 저장되는 최대 메모리 양/sys/fs/cgroup/memory/memory.limit_in_bytes. 겪고 있는 문제가 실제로 다음과 관련이 있는 경우그룹메모리 제한, 그럼/sys/fs/cgroup/memory/memory.max_usage_in_bytes위의 내용과 가까워야 합니다. 확인을 통해 확인할 수도 있습니다.기억상실, 실제 사용량이 위 한도에 도달한 횟수를 기록합니다.

어쩌면 당신도 확인할 수 있습니다memory.kmem.failcnt그리고memory.kmem.tcp.failcnt커널 메모리와 TCP 버퍼 메모리에 대한 유사한 통계입니다.

관련 정보