2013-09-24 21 views
1

我在openstack上工作,我想監視虛擬機cpu的使用情況。爲此,我想通過父(中央)openstack實例找到它們的PID。 我用
在openstack中查找虛擬機的PID

ps aux | grep

我確實收到了一個輸出。然而,我想確認這是否是正確的PID。他們有什麼辦法可以檢查嗎?

或者是他們找到虛擬機的PID的任何其他方式?

更新。 該命令不起作用。它給了我一個總是改變的PID。它不是恆定的。 謝謝

回答

1

那麼libvirt有一些這樣的接口。下面是一些蟒蛇,其提取數據到數據結構爲您提供:

#!/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動力塊基本都在此佈局:一旦你知道這是什麼是布萊恩在libvirt的下降

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模塊是顯而易見的。

希望有幫助!

+0

我很抱歉,我之前並不清楚。它不僅關於CPU的使用情況,還包括虛擬機的許多因素,因此我需要虛擬機的PID。我想通過從我的管理程序本身運行命令來收集這些信息,以便我收到VM的統計數據。我想用PID來做到這一點。有沒有什麼方法可以幫助我獲得虛擬機的PID .. –

+1

您將從libvirt中獲得比從進程ID更多的信息。實際上,libvirt有意無法獲得進程ID,因爲與進程ID交互是對libvirt執行任何操作的錯誤方式。 如果你已經死定了這條路(儘管我建議不要這樣做),你可能會想要這樣一個流程列表來標識qemu/kvm /你有什麼過程,然後區分哪個vm是哪個喚醒標誌並匹配libvirt域中設置的某些共享值。 我再次謹慎反對。 –

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) 
0
grep "79d87652-8c8e-4afa-8c13-32fbcbf98e76" --include=libvirt.xml /path/to/nova/instances -r -A 2 | grep "<name" | cut -d " " -f 3 

允許找到「instance-」,它可以映射到ps-aux輸出的「-name」參數。所以你可以將openstack實例ID映射到pid。

0

最簡單的方法是使用的cgroup:

在Ubuntu中:

cat /sys/fs/cgroup/cpuset/libvirt/qemu/<machine-name>/tasks 
相關問題