전제 조건

전제 조건

간접적으로 트리거할 커널 개체에 제한을 두는 작업을 실행하고 싶습니다. 이는 애플리케이션, 스레드 등이 사용하는 메모리에 관한 것이 아니라 커널이 사용하는 메모리에 관한 것입니다. 구체적으로는 횟수를 제한하고 싶습니다.아이노드 캐시작업을 사용할 수 있습니다.

나의 동기를 부여하는 예는 입니다 updatedb. 나중에 필요하지 않은 대부분의 작업에 대규모 inode 캐시를 사용할 수 있습니다. 특히 ext4_inode_cache행에 표시된 값을 제한하고 싶습니다 /proc/slabinfo. (이것은 표시된 "버퍼" 또는 "캐시" 줄에 포함되지 않습니다 free. 이것은 단지 파일 콘텐츠 캐시일 뿐이며 슬랩 콘텐츠는 커널 메모리이며 "사용된" 열에 기록됩니다.)

echo 2 >/proc/sys/vm/drop_caches캐시는 나중에 해제되지만 나에게는 아무런 소용이 없습니다. 실행 중인 응용 프로그램 및 자주 사용되는 파일과 같이 메모리에 보관하고 싶은 항목을 쓸모없는 항목이 대체합니다.

시스템은 최신(≥ 3.8) 커널을 갖춘 Linux입니다. 루트 액세스로 설정할 수 있습니다.

(ext4) inode 캐시에 대한 환경의 기여가 내가 설정한 값으로 제한되도록 제한된 환경(컨테이너?)에서 명령을 실행하려면 어떻게 해야 합니까?

답변1

내 자신의 질문에 따르면랑카 멜레이는 다음을 사용하여 보관할 수 있습니다.통제 그룹 v2:

전제 조건

  1. Linux 커널이 MEMCG_KMEM활성화되어 있는지 확인하세요.grep CONFIG_MEMCG_KMEM "/boot/config-$(uname -r)"
  2. 운영 체제(및 버전)에 따라 Linux 커널 명령줄에서 이를 지정하여 활성화됩니다( systemd예: .cgroups2systemd.unified_cgroup_hierarchy=1/boot/grub/grub.cfg
  3. cgroup2파일 시스템이 예를 들어 또는 /sys/fs/cgroup/이에 mount -t cgroup2 none /sys/fs/cgroup상응하는 /etc/fstab. ( systemd이것은 기본적으로 자동으로 수행됩니다)

기도하다

  1. 프로세스에 대한 새 그룹을 만듭니다 my-find(시작당 한 번).mkdir /sys/fs/cgroup/my-find
  2. (현재) 프로세스(및 향후 모든 하위 프로세스)를 그룹에 연결합니다.echo $$ >/sys/fs/cgroup/my-find/cgroup.procs
  3. 소프트 제한(예: 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단일 항목 만 입력해야 하며 및 .cgroupsortfrcode

추신

cgroup v1설정이 memory.kmem.limit_in_bytes더 이상 사용되지 않으며 프로세스가 구성된 제한을 초과하면 "메모리 부족" 이벤트가 발생하여 Linux 커널이 오래된 데이터를 삭제하여 메모리 사용량을 줄이도록 강제하는 대신 프로세스가 즉시 종료되기 때문에 작동하지 않습니다 . 인용 부호CONFIG_MEMCG_KMEM

현재 커널 메모리에는 소프트 제한이 구현되지 않습니다. 향후 작업은 이러한 한계에 도달하면 플레이트 재활용을 시작하는 것입니다.

답변2

당신이 보면커널 inode 소스 코드, ihash_entries가 커널 수준에서만 설정되는 것을 볼 수 있습니다.

사용자 또는 프로세스 수준 고려 사항은 전혀 없습니다. 이를 추가하면 성능이 크게 저하되어 비생산적일 수 있습니다.

이는 또한 캐시 항목을 사용하여 모든 프로세스를 추적하므로 이를 수행하기 위해 더 많은 메모리를 사용하는 것을 의미합니다.

게다가 현재 커널에서는 불가능할 뿐 아니라 구현하는 것도 좋은 생각이 아닙니다.

관련 정보