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 클러스터를 업그레이드한 후 Linux cgroup 메모리 서브시스템을 통해 메모리 또는 스왑 적용을 사용으로 설정하는 경우, lsf.conf 파일에 다음 매개변수가 설정되어 있는지 확인하십시오.
  • LSF_PROCESS_TRACKING=Y
  • LSF_LINUX_CGROUP_ACCT=Y

LSB_RESOURCE_ENFORCE="memory" 를 설정하면 메모리 및 스왑 적용 검사를 위해 보다 정확한 메모리 및 스왑 사용 데이터를 제공하기 위해 cgroup 계정 (LSF_LINUX_CGROUP_ACCT=Y) 이 자동으로 켜집니다. LSF_PROCESS_TRACKING=Y 를 설정하면 LSF 가 메모리 및 스왑 한계를 초과한 후에 작업을 완전히 강제 종료할 수 있습니다.

참고: LSB_RESOURCE_ENFORCE="memory" 가 구성된 경우 모든 기존 LSF 메모리 한계 관련 매개변수 (예: LSF_HPC_EXTENSIONS="TASK_MEMLIMIT", LSF_HPC_EXTENSIONS="TASK_SWAPLIMIT", "LSB_JOB_MEMLIMIT""LSB_MEMLIMIT_ENFORCE" ) 는 무시됩니다.

한 호스트에서 두 개의 태스크를 실행하고 다른 호스트에서 한 개의 태스크를 실행할 수 있도록 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.

주: cgroup 메모리 서브시스템은 메모리 사용 및 스왑 사용의 적용을 분리하지 않습니다. 스왑 한계가 지정된 경우 한계 적용은 이전 LSF 동작과 다릅니다. bjobs -l 에서는 SWAP를 0으로 표시합니다. 스왑 디바이스 사용량은 메모리 사용량과 별도로 수집되지 않으므로 이는 올바릅니다.

예를 들어, 다음 작업 제출의 경우:

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 는 작업이 종료되지 않고 작업이 항상 실행됨을 인식합니다.