openstack 調用API 實現雲主機的IO 控制,CGroup 策略

來源:互聯網
上載者:User

標籤:openstack   compute   nova   libvirt   cgroup   blkio   

# vim: tabstop=4 shiftwidth=4 softtabstop=4# Copyright (c) 2011 X.commerce, a business unit of eBay Inc.# Copyright 2010 United States Government as represented by the# Administrator of the National Aeronautics and Space Administration.# All Rights Reserved.##    Licensed under the Apache License, Version 2.0 (the "License"); you may#    not use this file except in compliance with the License. You may obtain#    a copy of the License at##         http://www.apache.org/licenses/LICENSE-2.0##    Unless required by applicable law or agreed to in writing, software#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the#    License for the specific language governing permissions and limitations#    under the License.#    Single virtual machine io limit , reader 70/MB , writer 50/MB"""    curl -d ‘{"auth": {"tenantName": "admin", "passwordCredentials": {"username": "admin", "password": "admin"}}}‘ -H "Content-type: application/json" http://127.0.0.1:35357/v2.0/tokens | python -m json.tool    curl -v -d ‘{"ioctlAction": {"instance_name":"instance-0000000c","limit_reader":"40MB","limit_writer":"60MB"}}‘ -i http://127.0.0.1:8774/v2/ba5a6a86a8224a70ba0ffde747d8a724/servers/e6b9cae7-8732-405d-9aaf-575643b4bbef/action -X POST -H "X-Auth-Project-Id: ba5a6a86a8224a70ba0ffde747d8a724" -H "Accept: application/json" -H "X-Auth-Token: 6f0c37595f384fd4a18766825cf49013" -H "Content-Type: application/json""""import time,sys,os,libvirt,traceback,re,subprocess,jsonfrom nova import log as loggingfrom nova import flagsfrom nova.periodic.blkio  import configfrom nova import utilsfrom nova.periodic.blkio import utils as blkio_utilsFLAGS = flags.FLAGSLOG = logging.getLogger(__name__)class ActionIoctl(object):    def __init__(self,instance_name,limit_reader,limit_writer):        self.conn = libvirt.open(None)        self.limitReader = int(limit_reader[0:-2])        self.limitWriter = int(limit_writer[0:-2])        self.name = instance_name        self.path = FLAGS.instances_path    def diskDeviceNum(self,disk):        """ Func info:  Returns the number of hard disk,other is 8:0 """        if disk == ‘/dev/sda1‘ or disk == ‘/dev/hda1‘ or disk[:-1] == ‘/dev/sda‘ or disk[:-1] == ‘/dev/hda‘:            return ‘8:0‘        elif disk == ‘/dev/sdb1‘ or disk == ‘/dev/hdb1‘ or disk[:-1] == ‘/dev/sdb‘ or disk[:-1] == ‘/dev/hdb‘:            return ‘8:16‘        elif disk == ‘/dev/sdc1‘ or disk == ‘/dev/hdc1‘ or disk[:-1] == ‘/dev/sdc‘ or disk[:-1] == ‘/dev/hdc‘:            return ‘8:32‘        elif disk == ‘/dev/sdd1‘ or disk == ‘/dev/hdd1‘ or disk[:-1] == ‘/dev/sdd‘ or disk[:-1] == ‘/dev/hdd‘:            return ‘8:48‘        else:            return ‘8:16‘    def vmsPIDall(self):        """ Getting all vm port, return to """        pid = list()        try:            cmds = """ps -ef |grep uuid|grep -v grep |awk ‘{print $2}‘"""            pid=os.popen(cmds).readlines()            return pid        except Exception,e:            LOG.error(_(‘[-william-] Error %s‘%e))            return    def cgroupPath(self):        ‘‘‘        Func info : Return Cgroup path ,Because the system is not the same,                    the Cgroup path is different also.                    By default, have RedHat, Centos, Ubuntu  linux  ...            osType : The current system version , And return to ...            Cpath  : Cgroup path        ‘‘‘        osType = open(‘/etc/issue‘).readlines()        for i in osType:            if re.match(‘Ubuntu‘,i):                Cpath = ‘/sys/fs/cgroup/‘                return Cpath            elif re.match(‘CentOS‘,i):                Cpath = ‘/cgroup/‘                return Cpath            elif re.match(‘Red Hat‘,i):                Cpath = ‘/cgroup/‘                return Cpath            else:                return ‘/sys/fs/cgroup/‘    def exeCmd(self,cmds):        ‘‘‘ Perform system command ‘‘‘        LOG.info(_(‘exeCmd  %s‘%cmds))        try:            exec_process = subprocess.Popen(cmds,                            stdin = subprocess.PIPE,                            stdout = subprocess.PIPE,                            stderr = subprocess.PIPE,                            shell = True)            exec_process.wait()            rest = exec_process.stdout.read()            err = exec_process.stderr.read()            if err == ‘‘:                return rest            else:                LOG.error(_(‘[-william-] return values is null‘))        except Exception,e:            LOG.error(_(‘[-william-] Error %s‘) %e)            return    ‘‘‘ Geting vmName name  and pid ‘‘‘    def get_vm_pid(self,name):        pid = self.conn.listDomainsID()        try:            pid = os.popen("""ps -ef |grep %s |grep -v grep |awk ‘{print $2}‘""" %name).readlines()            return int(pid[0])        except:            LOG.error(_(‘[-william-] Error %s‘                                         %traceback.format_exc()))            return    def _vm_pids(self):        try:            return os.popen(‘pidof kvm‘).read().split()        except:            return    def work(self):        """        Func info :  working func ................        Cpath : is _Cpath function return values ...        path :  The current virtual machine IMG file path        vm_count: All of the current node number of virtual machines        size :  Limit size        mountInfo : mounting point        """        Cpath = self.cgroupPath()        vm_pid = self.get_vm_pid(self.name)        LOG.info(_(‘[- william -] %s , %s‘ %(self.name,vm_pid)))        r_size = self.limitReader * 1000 * 1000        w_size = self.limitWriter * 1000 * 1000        device = blkio_utils.instance_path(self.path)        diskDeviceNum = self.diskDeviceNum(device)        vmTaskPath = "%s/blkio/%s"%(Cpath,self.name)        utils.execute("mkdir","-p",vmTaskPath,run_as_root=True)        utils.execute("tee" , "%s/blkio.throttle.read_bps_device"%vmTaskPath,                      process_input = "%s %s"%(diskDeviceNum,r_size),                      run_as_root=True)        utils.execute("tee" , "%s/blkio.throttle.write_bps_device"%vmTaskPath,                       process_input = "%s %s"%(diskDeviceNum,w_size) ,                      run_as_root=True)        LOG.info(_(""" [-william-] echo  ‘%s, %s, %s , %s , %s ‘ write oK """                    %(self.path , device, diskDeviceNum, w_size, r_size)))        utils.execute(‘tee‘, ‘%s/tasks‘%vmTaskPath,                      process_input= str(vm_pid) ,                      run_as_root=True)        LOG.info(_(‘[- william-] append pid %s in task‘ %vm_pid))if __name__ == "__main__":    sc = ActionIoctl(‘instance-0000000c‘,‘40MB‘,‘30MB‘)    sc.work()


本文出自 “歡迎評論,歡迎點贊” 部落格,請務必保留此出處http://swq499809608.blog.51cto.com/797714/1412022

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.