Linux cgroup 메모리 서브시스템에 기반한 메모리 및 스왑 한계 적용
모든 LSF 작업 프로세스는 cgroup 메모리 및 스왑 한계를 초과할 수 없도록 Linux cgroup 시스템에 의해 제어됩니다. 이러한 한계는 Red Hat Enterprise Linux (RHEL) 6.2 이상 및 SuSe Linux Enterprise Linux 11 SP2 이상에서 태스크별이 아니라 작업별 및 호스트별로 적용됩니다. LSF 는 주기적으로 작업 사용량을 수집하고 이를 사용자가 설정한 한계와 비교하여 작업에 대한 메모리 및 스왑 한계를 적용합니다. LSF 는 Linux cgroup
v1 또는 cgroup v2 cgroups를 지원하는 시스템에 엄격한 호스트 레벨 메모리 및 스왑 한계를 부과할 수 있습니다.
클러스터의 다른 LSF 호스트는 각 개별 LSF 호스트가 하나의 cgroup 버전만 실행하는 한 다른 버전의 cgroup을 사용할 수 있습니다. 호스트에서 두 버전의 cgroup을 모두 사용하는 경우 버전 중 하나를 사용 안함으로 설정해야 합니다. 예를 들어, hostA 는 cgroup v1 를 사용할 수 있고 hostB 는 각 호스트가 cgroup의 한 버전만 실행하는 한 cgroup v2 를 사용할 수 있습니다.
Linux cgroup 메모리 서브시스템을 통해 메모리 적용을 사용하려면 lsf.conf 파일에서 LSB_RESOURCE_ENFORCE="memory" 매개변수를 구성하십시오.
호스트 OS가 Red Hat Enterprise Linux 6.3 이상인 경우 cgroup 메모리 한계가 적용되고 LSF 에 작업을 종료하도록 알립니다. bhist –l에 의해 표시되는 특정 종료 이유를 통해 추가 알림이 사용자에게 제공됩니다.
실행 중인 작업의 cgroup 메모리 한계를 변경 (예: 감축) 하려면 bmod -M 를 사용하여 작업의 메모리 한계를 변경하고 bmod -v 를 사용하여 작업의 스왑 한계를 변경하십시오. 작업의 메모리 또는 스왑 한계를 변경하도록 요청할 때 LSF 는 사용자의 요청을 수용하기 위해 작업의 요구사항을 수정하고 작업의 cgroup 한계 설정을 수정합니다. OS가 cgroup 메모리 또는 스왑 한계 수정을 거부하면 LSF 가 작업에 메시지를 게시하여 cgroup이 변경되지 않았음을 표시합니다. cgroup 한계가 변경되면 OS가 작업의 메모리 또는 스왑 할당을 조정할 수 있습니다. 우수 사례로서 cgroup 메모리 또는 스왑 한계를 애플리케이션 사용보다 적게 줄이지 마십시오.
- LSF_PROCESS_TRACKING=Y
- LSF_LINUX_CGROUP_ACCT=Y
LSB_RESOURCE_ENFORCE="memory" 를 설정하면 메모리 및 스왑 적용 검사를 위해 보다 정확한 메모리 및 스왑 사용 데이터를 제공하기 위해 cgroup 계정 (LSF_LINUX_CGROUP_ACCT=Y) 이 자동으로 켜집니다. LSF_PROCESS_TRACKING=Y 를 설정하면 LSF 가 메모리 및 스왑 한계를 초과한 후에 작업을 완전히 강제 종료할 수 있습니다.
예
한 호스트에서 두 개의 태스크를 실행하고 다른 호스트에서 한 개의 태스크를 실행할 수 있도록 span [ptile=2] 인 세 개의 태스크와 100MB의 메모리 한계가 있는 병렬 작업을 제출하십시오.
bsub -n 3 -M 100 –R "span[ptile=2]" blaunch ./mem_eater
애플리케이션 mem_eater 은 계속해서 메모리 사용량을 늘립니다.
LSF 는 총 200MB이상의 메모리를 사용하는 임의의 시점에 작업을 강제 종료합니다.hosta또는 100MB이상의 총 메모리hostb. 예를 들어, 언제든 두 개의 태스크가 다음에서 실행되는 경우hosta및 1개의 태스크가 실행됨hostb에서 두 개의 태스크가 총 메모리를 사용하는 경우에만 작업이 강제 종료됩니다.hosta200MB 초과hosta또는 100MBhostb.
LSF 는 cgroups에 대한 태스크별 메모리 적용을 지원하지 않습니다. 예를 들어,hosta150MB의 메모리를 사용하고 다른 태스크는 10MB만 사용하는 경우, 해당 시점에서 작업이 사용하는 총 메모리가 사용되기 때문에 작업이 강제 종료되지 않습니다.hosta160MB입니다.
메모리 적용은 누적된 메모리 사용량에 적용되지 않습니다. 예를 들어, 두 개의 태스크는 최대 250MB를 사용합니다.hosta총계입니다. task1 의 최대 메모리 rusagehosta150MB이고 task2 의 최대 메모리 rusagehosta100MB이지만 동시에 발생하지 않으므로 지정된 시간에 두 개의 태스크가 200M 보다 적게 사용되고 이 작업은 강제 종료되지 않습니다. 특정 시점에 두 개의 태스크가 200M 이상을 사용하는 경우에만 작업이 강제 종료됩니다.hosta.
예를 들어, 다음 작업 제출의 경우:
bsub -M 100 -v 50 ./mem_eater
애플리케이션이 100MB가 넘는 메모리를 사용하면 cgroup이 작업 프로세스에 스왑을 사용하기 시작합니다. 애플리케이션이 150MB메모리 사용량 (100MB메모리+50MB스왑) 에 도달할 때까지 작업이 강제 종료되지 않습니다.
다음 작업은 스왑 한계만 지정합니다.
bsub -v 50 ./mem_eater
메모리 한계가 지정되지 않았으므로 LSF 는 메모리 한계를 스왑 한계와 동일하게 간주합니다. 50MB결합 메모리 및 스왑 사용량에 도달하면 작업이 강제 종료됩니다.
Linux cgroups에 의한 호스트 기반 메모리 및 스왑 한계 적용
LSB_RESOURCE_ENFORCE="memory" 매개변수가 lsf.conf 파일에 구성된 경우, 메모리 및 스왑 한계가 작업에 대해 지정될 때 ( -M 및 -v를 사용하는 작업 레벨 또는 MEMLIMIT및 SWAPLIMIT를 사용하는 lsb.queues 또는 lsb.applications 에서) 실행 호스트에서 실행 중인 태스크 수의 배수로 메모리 및 스왑 한계가 계산되고 적용됩니다.
bsub -hl 옵션을 사용하면 실행 호스트에서 실행 중인 태스크 수에 관계없이 작업 레벨 호스트 기반 메모리 및 스왑 한계 적용을 사용할 수 있습니다. -hl 옵션을 사용하여 호스트 기반 메모리 및 스왑 한계 적용을 적용하려면 LSB_RESOURCE_ENFORCE="memory" 매개변수를 lsf.conf 에 지정해야 합니다.
작업에 대해 메모리 또는 스왑 한계가 지정되지 않았거나 (지정된 경우 작업, 큐 및 애플리케이션 프로파일에 대한 병합된 한계) LSB_RESOURCE_ENFORCE="memory" 매개변수가 지정되지 않은 경우, 작업에 대해 호스트 기반 메모리 한계가 설정되지 않습니다. -hl 옵션은 메모리 및 스왑 한계에만 적용됩니다. 다른 자원 사용 한계에는 적용되지 않습니다.
제한사항 및 알려진 문제
- 병렬 작업의 경우 cgroup 한계는 LSF blaunch 프레임워크를 통해 실행되는 작업에만 적용됩니다. LSF PAM/taskstarter 를 통해 실행되는 병렬 작업은 지원되지 않습니다.
- RHEL 6.2에서 LSF 는 cgroup으로부터 메모리 및 스왑 한계가 초과되었음을 알리는 알림을 수신할 수 없습니다. 작업 메모리 및 스왑 한계를 초과하면 LSF 은 작업이 강제 종료되었음을 보장할 수 없습니다. RHEL 6.3에서 LSF 는 알림을 수신하고 작업을 종료합니다.
- RHEL 6.2에서는 메모리 적용으로 인해 애플리케이션이 cgroup에 의해 강제 종료되는 경우 멀티스레드 애플리케이션이 좀비 프로세스가 됩니다. 결과적으로 LSF 는 사용자 애플리케이션 종료 상태를 대기할 수 없으며 LSF 프로세스가 정지됩니다. LSF 는 작업이 종료되지 않고 작업이 항상 실행됨을 인식합니다.