2013-09-24 3 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

프로세스 ID에서 얻는 것보다 libvirt에서 더 많은 정보를 얻을 수 있습니다. 사실, libvirt는 의도적으로 프로세스 ID를 얻는 방법을 제공하지 않습니다. 프로세스 ID와 상호 작용하는 것이 libvirt를 사용하는 잘못된 방법입니다. 만약 당신이 그 길을 가기 위해 죽었다면 (그리고 나는 그렇게하는 것을 강력히 추천한다.) 프로세스리스트가 qemu/kvm /을 식별하고 처리 할 것이 무엇인지 그리고 어떤 VM이 어떤 것인지를 구별하고 싶을 것이다 flags를 awking하고 libvirt 도메인에 설정된 일부 공유 값과 비교합니다. 다시 이에 대해주의하십시오. –

1

libvirt, python, lxml 및 lsof를 사용하면 가상 인스턴스 (도메인)에 디스플레이 출력 세트가 있으면 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 

가 허용 : 개방 디스플레이 포트 여기

행 (VNC, 스파이스, ...)

  1. 검색 디스플레이 포트
  2. 검색 PID 코드이며 "-name"매개 변수의 ps aux 출력에 매핑 될 수있는 "instance-"를 찾습니다. openstack 인스턴스 ID를 pid에 매핑 할 수 있습니다.

0

가장 간단한 방법 cgroup을 사용하고 있습니다 : 우분투에서

:

cat /sys/fs/cgroup/cpuset/libvirt/qemu/<machine-name>/tasks