Virtual machine 查找PID';openstack中虚拟机的设计

Virtual machine 查找PID';openstack中虚拟机的设计,virtual-machine,pid,openstack,Virtual Machine,Pid,Openstack,我正在openstack上工作,我想监控虚拟机的cpu使用情况。为此,我希望通过父(中心)openstack实例找到它们的PID。 我用过 ps aux| grep 我确实收到了一个输出。但是,我想确认这是否正确。他们有什么办法让我查一下吗 或者他们是否有其他方法来查找虚拟机的PID 更新。 此命令不起作用。它给了我一个经常变化的PID。它不是常数。 谢谢libvirt为此提供了一些接口。下面是一些python,它可以将数据提取到数据结构中: #!/usr/bin/env python # M

我正在openstack上工作,我想监控虚拟机的cpu使用情况。为此,我希望通过父(中心)openstack实例找到它们的PID。 我用过

ps aux| grep

我确实收到了一个输出。但是,我想确认这是否正确。他们有什么办法让我查一下吗

或者他们是否有其他方法来查找虚拟机的PID

更新。 此命令不起作用。它给了我一个经常变化的PID。它不是常数。
谢谢

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()
一旦你意识到这就是libvirt中发生的事情,CPU块是显而易见的


希望有帮助

通过使用libvirt、python、lxml和lsof,如果虚拟实例(域)具有显示输出集,则可以恢复pid。(VNC,香料,…)

  • 检索显示端口
  • 从打开的显示端口检索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)
    

    grep“79d87652-8c8e-4afa-8c13-32fbcbf98e76”--include=libvirt.xml/path/to/nova/instances-r-a2 | grep”最简单的方法是使用cGroup:

    在Ubuntu中:

    cat /sys/fs/cgroup/cpuset/libvirt/qemu/<machine-name>/tasks
    
    cat/sys/fs/cgroup/cpuset/libvirt/qemu//tasks
    
    很抱歉,我之前不清楚。这不仅是关于cpu使用率,还有虚拟机的许多因素。为此,我需要虚拟机的PID。我想通过运行虚拟机监控程序本身的命令来收集这些信息,以便接收虚拟机的统计数据。我想使用PID来完成这项工作。有什么方法可以请告诉我如何获取虚拟机的PID。从libvirt中获得的信息比从进程ID中获得的信息要多得多。事实上,libvirt故意不提供获取进程ID的方法,因为与进程ID交互是用libvirt做任何事情的错误方式。如果你一意孤行,那么(我强烈建议不要这样做),您可能希望这样一个进程列表来标识qemu/kvm/what have you processs,然后通过awking标志并与libvirt域中的某些共享值集进行匹配来区分哪个vm是哪个vm。我再次警告您不要这样做。
    grep "79d87652-8c8e-4afa-8c13-32fbcbf98e76" --include=libvirt.xml /path/to/nova/instances -r -A 2 | grep "<name"  | cut -d " " -f 3
    
    cat /sys/fs/cgroup/cpuset/libvirt/qemu/<machine-name>/tasks