我在openstack上工作,我想監視虛擬機cpu的使用情況。爲此,我想通過父(中央)openstack實例找到它們的PID。 我用
在openstack中查找虛擬機的PID
ps aux | grep
我確實收到了一個輸出。然而,我想確認這是否是正確的PID。他們有什麼辦法可以檢查嗎?
或者是他們找到虛擬機的PID的任何其他方式?
更新。 該命令不起作用。它給了我一個總是改變的PID。它不是恆定的。 謝謝
我在openstack上工作,我想監視虛擬機cpu的使用情況。爲此,我想通過父(中央)openstack實例找到它們的PID。 我用
在openstack中查找虛擬機的PID
ps aux | grep
我確實收到了一個輸出。然而,我想確認這是否是正確的PID。他們有什麼辦法可以檢查嗎?
或者是他們找到虛擬機的PID的任何其他方式?
更新。 該命令不起作用。它給了我一個總是改變的PID。它不是恆定的。 謝謝
那麼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模塊是顯而易見的。
希望有幫助!
通過使用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 -A 2 | grep "<name" | cut -d " " -f 3
允許找到「instance-」,它可以映射到ps-aux輸出的「-name」參數。所以你可以將openstack實例ID映射到pid。
最簡單的方法是使用的cgroup:
在Ubuntu中:
cat /sys/fs/cgroup/cpuset/libvirt/qemu/<machine-name>/tasks
我很抱歉,我之前並不清楚。它不僅關於CPU的使用情況,還包括虛擬機的許多因素,因此我需要虛擬機的PID。我想通過從我的管理程序本身運行命令來收集這些信息,以便我收到VM的統計數據。我想用PID來做到這一點。有沒有什麼方法可以幫助我獲得虛擬機的PID .. –
您將從libvirt中獲得比從進程ID更多的信息。實際上,libvirt有意無法獲得進程ID,因爲與進程ID交互是對libvirt執行任何操作的錯誤方式。 如果你已經死定了這條路(儘管我建議不要這樣做),你可能會想要這樣一個流程列表來標識qemu/kvm /你有什麼過程,然後區分哪個vm是哪個喚醒標誌並匹配libvirt域中設置的某些共享值。 我再次謹慎反對。 –