A.13. VDSM 후크 예

이 부분에서 지정된 후크 스크립트 예는 Red Hat에서 완전 지원되지 않습니다. 소스에 관계없이 시스템에 설치한 모든 후크 스크립트를 환경에서 완전히 테스트해야 합니다.

예 A.5. NUMA 노드 튜닝

목적:

이러한 후크 스크립트를 사용하여 numaset 사용자 정의 속성에 기반하는 NUMA 호스트에서 메모리 할당을 조정합니다. 사용자 정의 속성이 설정되어 있지 않은 경우 동작하지 않게 됩니다.

설정 문자열:

numaset=^(interleave|strict|preferred):[\^]?\d+(-\d+)?(,[\^]?\d+(-\d+)?)*$

정규 표현식을 사용하여 지정된 가상 머신의 numaset 사용자 정의 속성을 통해 할당 모드 (interleave, strict, preferred) 및 사용할 노드 모두를 지정할 수 있습니다. 두 값은 콜론 (:)으로 구분됩니다. 정규 표현식을 통해 다음과 같이 nodeset 사양을 지정할 수 있습니다:
  • 특정 노드 (numaset=strict:1, 노드 1만 사용하도록 지정)
  • 사용할 노드 범위 (numaset=strict:1-4, 노드 1에서 4 까지 사용하도록 지정)
  • 사용하지 않을 특정 노드 (numaset=strict:^3, 노드 3을 사용하지 않도록 지정)
  • 위의 사양을 콤마로 구분하여 조합 (numaset=strict:1-4,6, 노드 1에서 4 그리고 6을 사용하도록 지정)
스크립트:

/usr/libexec/vdsm/hooks/before_vm_start/50_numa

#!/usr/bin/python

import os
import sys
import hooking
import traceback

'''
numa hook
=========
add numa support for domain xml:

<numatune>
    <memory mode="strict" nodeset="1-4,^3" />
</numatune>

memory=interleave|strict|preferred

numaset="1" (use one NUMA node)
numaset="1-4" (use 1-4 NUMA nodes)
numaset="^3" (don't use NUMA node 3)
numaset="1-4,^3,6" (or combinations)

syntax:
    numa=strict:1-4
'''

if os.environ.has_key('numa'):
    try:
        mode, nodeset = os.environ['numa'].split(':')

        domxml = hooking.read_domxml()

        domain = domxml.getElementsByTagName('domain')[0]
        numas = domxml.getElementsByTagName('numatune')

        if not len(numas) > 0:
            numatune = domxml.createElement('numatune')
            domain.appendChild(numatune)

            memory = domxml.createElement('memory')
            memory.setAttribute('mode', mode)
            memory.setAttribute('nodeset', nodeset)
            numatune.appendChild(memory)

            hooking.write_domxml(domxml)
        else:
            sys.stderr.write('numa: numa already exists in domain xml')
            sys.exit(2)
    except:
        sys.stderr.write('numa: [unexpected error]: %s\n' % traceback.format_exc())
        sys.exit(2)