A.11. VDSM フックの例
このセクションで提供されているフックスクリプトの例は、Red Hat では厳密にはサポートされていません。ソースにかかわらず、システムにインストールするすべてのフックスクリプトは、環境に対して徹底的にテストされているか確認する必要があります。
例A.5 NUMA ノードのチューニング
目的:
このフックスクリプトを使用すると、numaset カスタムプロパティーに基づいて NUMA ホストのメモリー割り当てを調整できます。カスタムプロパティーが設定されていない場合、アクションは実行されません。
設定文字列:
numaset=^(interleave|strict|preferred):[\^]?\d+(-\d+)?(,[\^]?\d+(-\d+)?)*$
使用される正規表現により、特定の仮想マシンの numaset カスタムプロパティーで、割り当てモード (interleave、strict、preferred) と使用するノードの両方を指定できます。2 つの値はコロン (:) で区切られます。正規表現を使用すると、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)