
간접적으로 트리거할 커널 개체에 제한을 두는 작업을 실행하고 싶습니다. 이는 애플리케이션, 스레드 등이 사용하는 메모리에 관한 것이 아니라 커널이 사용하는 메모리에 관한 것입니다. 구체적으로는 횟수를 제한하고 싶습니다.아이노드 캐시작업을 사용할 수 있습니다.
나의 동기를 부여하는 예는 입니다 updatedb
. 나중에 필요하지 않은 대부분의 작업에 대규모 inode 캐시를 사용할 수 있습니다. 특히 ext4_inode_cache
행에 표시된 값을 제한하고 싶습니다 /proc/slabinfo
. (이것은 표시된 "버퍼" 또는 "캐시" 줄에 포함되지 않습니다 free
. 이것은 단지 파일 콘텐츠 캐시일 뿐이며 슬랩 콘텐츠는 커널 메모리이며 "사용된" 열에 기록됩니다.)
echo 2 >/proc/sys/vm/drop_caches
캐시는 나중에 해제되지만 나에게는 아무런 소용이 없습니다. 실행 중인 응용 프로그램 및 자주 사용되는 파일과 같이 메모리에 보관하고 싶은 항목을 쓸모없는 항목이 대체합니다.
시스템은 최신(≥ 3.8) 커널을 갖춘 Linux입니다. 루트 액세스로 설정할 수 있습니다.
(ext4) inode 캐시에 대한 환경의 기여가 내가 설정한 값으로 제한되도록 제한된 환경(컨테이너?)에서 명령을 실행하려면 어떻게 해야 합니까?
답변1
내 자신의 질문에 따르면랑카 멜레이는 다음을 사용하여 보관할 수 있습니다.통제 그룹 v2:
전제 조건
- Linux 커널이
MEMCG_KMEM
활성화되어 있는지 확인하세요.grep CONFIG_MEMCG_KMEM "/boot/config-$(uname -r)"
- 운영 체제(및 버전)에 따라 Linux 커널 명령줄에서 이를 지정하여 활성화됩니다(
systemd
예: .cgroups2
systemd.unified_cgroup_hierarchy=1
/boot/grub/grub.cfg
cgroup2
파일 시스템이 예를 들어 또는/sys/fs/cgroup/
이에mount -t cgroup2 none /sys/fs/cgroup
상응하는/etc/fstab
. (systemd
이것은 기본적으로 자동으로 수행됩니다)
기도하다
- 프로세스에 대한 새 그룹을 만듭니다
my-find
(시작당 한 번).mkdir /sys/fs/cgroup/my-find
- (현재) 프로세스(및 향후 모든 하위 프로세스)를 그룹에 연결합니다.
echo $$ >/sys/fs/cgroup/my-find/cgroup.procs
- 소프트 제한(예: 2MiB)을 구성합니다.
echo 2M >/sys/fs/cgroup/my-find/memory.high
올바른 값을 찾으려면 조정과 실험이 필요합니다. memory.current
및/또는 에서 현재 값을 얻을 수 있습니다 memory.stat
. 시간이 지남에 따라 이제 Linux 커널이 캐시를 반복적으로 강제 축소하므로 high
증가하는 것을 볼 수 있습니다 .memory.events
부록
이 제한사항이 적용됩니다.둘 다사용자 공간 메모리와 커널 메모리. 그것은 또한 작동합니다모두에 의해 시작된 하위 프로세스를 포함한 프로세스 그룹은 updatedb
기본적으로 다음 작업을 수행합니다 find | sort | frcode
.
find
우리가 제한하고 싶은 것은 손상시키고 캐시하는dentry
프로그램 입니다 .inode
그렇지 않으면 사용자 공간 메모리 요구 사항은 (이론적으로) 일정합니다.sort
많은 메모리가 필요합니다. 그렇지 않으면 임시 파일을 사용하게 되어 추가 IO가 발생합니다.frcode
결과를 디스크(예: 단일 파일)에 쓰려면 지속적인 메모리가 필요합니다.
따라서 기본적으로 캐시 쓰레기를 제한하기 위해 find
단일 항목 만 입력해야 하며 및 .cgroup
sort
frcode
추신
cgroup v1
설정이 memory.kmem.limit_in_bytes
더 이상 사용되지 않으며 프로세스가 구성된 제한을 초과하면 "메모리 부족" 이벤트가 발생하여 Linux 커널이 오래된 데이터를 삭제하여 메모리 사용량을 줄이도록 강제하는 대신 프로세스가 즉시 종료되기 때문에 작동하지 않습니다 . 인용 부호CONFIG_MEMCG_KMEM
현재 커널 메모리에는 소프트 제한이 구현되지 않습니다. 향후 작업은 이러한 한계에 도달하면 플레이트 재활용을 시작하는 것입니다.
답변2
당신이 보면커널 inode 소스 코드, ihash_entries가 커널 수준에서만 설정되는 것을 볼 수 있습니다.
사용자 또는 프로세스 수준 고려 사항은 전혀 없습니다. 이를 추가하면 성능이 크게 저하되어 비생산적일 수 있습니다.
이는 또한 캐시 항목을 사용하여 모든 프로세스를 추적하므로 이를 수행하기 위해 더 많은 메모리를 사용하는 것을 의미합니다.
게다가 현재 커널에서는 불가능할 뿐 아니라 구현하는 것도 좋은 생각이 아닙니다.