Red Hat Training

A Red Hat training course is available for Red Hat Virtualization

A.13. VDSM Hook 示例

本节中提供的 hook 脚本示例严格不受红帽支持。您必须确保安装到您的系统的任何和所有 hook 脚本,无论源是什么,都对您的环境进行了全面的测试。

例 A.5. NUMA 节点调优

用途:

此 hook 脚本允许根据 numaset 自定义属性调整 NUMA 主机上的内存分配。其中 custom 属性未设置任何操作。

配置字符串:

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

使用的正则表达式,允许给定虚拟机的 numaset 自定义属性来指定分配模式(interleave严格preferred)以及使用的节点。这两个值用冒号(:)分隔。正则表达式允许按以下方式指定 nodeset
  • 该特定节点(numaset=strict:1, 指定只使用节点 1)或者
  • 使用的节点范围(numaset=strict:1-4,指定使用节点 1 到 4)或
  • 不使用特定节点(numaset=strict:^3,指定不使用节点 3)或
  • 上述任意以逗号分隔的组合(numaset=strict:1-4,6,指定要使用的节点为节点 1 到 4 和节点 6)。

script:

/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)