1

私は openstack で作業しており、仮想マシンの CPU 使用率を監視したいと考えています。そのために、親 (中央) の openstack インスタンスから PID を見つけたいと考えています。使った

ps補助 | grep

出力を受け取りました。ただし、これが正しい PID であるかどうかを確認したいと思います。これを確認する方法はありますか?

または、仮想マシンの PID を見つける他の方法はありますか?

アップデート。このコマンドは機能しません。それは私に常に変化するPIDを与えます。一定ではありません。ありがとうございました

4

4 に答える 4

1

libvirt には、このためのインターフェースがいくつかあります。そのデータをデータ構造に抽出する python を次に示します。

#!/usr/bin/env python

# Modules
import subprocess
import traceback
import commands
import signal
import time
import sys
import re
import os
import getopt
import pprint



try:
    import libvirt
except:
    print "no libvirt detected"
    sys.exit(0)
from xml.dom.minidom import parseString

global instances
global virt_conn
global tick
global virt_exist

def virtstats():
    global virt_exist
    global virt_conn
    global instances
    cpu_stats = []
    if virt_exist == True:
        if virt_conn == None:
            print 'Failed to open connection to the hypervisor'
            virt_exist = False

    if virt_exist == True:

        virt_info = virt_conn.getInfo()
        for x in range(0, virt_info[2]):
            cpu_stats.append(virt_conn.getCPUStats(x,0))
        virt_capabilities = virt_conn.getCapabilities()
        domcpustats = 0
        # domcpustats = virDomain::GetcpuSTATS()
        totmem = 0
        totvcpu = 0
        totcount = 0
        vcpu_stats = []
        for id in virt_conn.listDomainsID():
            dom = virt_conn.lookupByID(id)
            totvcpu += dom.maxVcpus()
            vcpu_stats.append(dom.vcpus())
            totmem += dom.maxMemory()
            totcount += 1

        dom = parseString(virt_capabilities)
        xmlTag = dom.getElementsByTagName('model')[0].toxml()
        xmlData=xmlTag.replace('<model>','').replace('</model>','')
        for info in virt_info:
            print info
        for stat in cpu_stats:
            print "cpu %s" % stat
        for vstat in vcpu_stats:
            print "vcpu:\n"
            pprint.pprint(vstat)
        print "CPU ( %s ) Use - %s vCPUS ( %s logical processors )" % (xmlData, totvcpu, virt_info[2])
        sys.exit(0)



def main():

    try:
        global virt_conn
        global virt_exist
        virt_conn = libvirt.openReadOnly(None)
        virt_exist = True
    except:
        virt_exist = False
        print "OK: not a compute node"
        sys.exit(0)

    virtstats()

if __name__ == "__main__":
    main()

使用量に関してこれから得られるのはCPU時間です。

vcpu ブロックは基本的に次のレイアウトになっています。

1st: vCPU number, starting from 0.
2nd: vCPU state.
    0: offline
    1: running
    2: blocked on resource
3rd: CPU time used in nanoseconds
4th: real CPU number

CPU ブロックは、libvirt でダウンしているものだと理解すれば明らかです。

それが役立つことを願っています!

于 2013-09-24T17:24:49.710 に答える
1

仮想インスタンス (ドメイン) に表示出力セットがある場合、libvirt、python、lxml、および lsof を使用して pid を回復できます。(VNC、スパイス、...)

  1. ディスプレイ ポートの取得
  2. 開いているディスプレイ ポートから pid を取得する

コードは次のとおりです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from lxml import etree
import libvirt
from subprocess import check_output

def get_port_from_XML(xml_desc):
    tree = etree.fromstring(xml_desc)
    ports = tree.xpath('//graphics/@port')
    if len(ports):
        return ports[0]
    return None

def get_pid_from_listen_port(port):
    if port is None:
        return ''
    return check_output(['lsof', '-i:%s' % port, '-t']).replace('\n','')

conn = libvirt.openReadOnly('')
if conn is None:
    print 'Failed to open connection to the hypervisor'
    sys.exit(1)

for domain_id in conn.listDomainsID():
    domain_instance = conn.lookupByID(domain_id)
    name = domain_instance.name()
    xml_desc = domain_instance.XMLDesc(0)
    port = get_port_from_XML(xml_desc)
    pid = get_pid_from_listen_port(port)
    print '%s (port:%s) (pid:%s)' % (name, port, pid)
于 2014-10-22T13:14:03.810 に答える
0
grep "79d87652-8c8e-4afa-8c13-32fbcbf98e76" --include=libvirt.xml /path/to/nova/instances -r -A 2 | grep "<name"  | cut -d " " -f 3

「-name」パラメーターの ps aux 出力にマップできる「instance-」を見つけることができます。そのため、openstack インスタンス ID を pid にマップできます。

于 2014-10-31T13:21:42.627 に答える