|
@@ -0,0 +1,123 @@
|
|
|
+#!/usr/bin/env python
|
|
|
+# -*- coding: utf-8 -*-
|
|
|
+'''
|
|
|
+按照磁盘占用率从大到小装箱,即按照磁盘先用完为止进行分配实例到主机。
|
|
|
+@Auther :liuyuqi.gov@msn.cn
|
|
|
+@Time :2018/7/7 0:43
|
|
|
+@File :sort_by_disk.py
|
|
|
+'''
|
|
|
+
|
|
|
+import matplotlib
|
|
|
+
|
|
|
+matplotlib.use('Agg')
|
|
|
+import pandas as pd
|
|
|
+import matplotlib.pyplot as plt
|
|
|
+from configparser import ConfigParser
|
|
|
+
|
|
|
+cf = ConfigParser()
|
|
|
+config_path = "../conf/config.ini"
|
|
|
+section_name = "data_file_name"
|
|
|
+cf.read(config_path)
|
|
|
+
|
|
|
+app_interference = cf.get(section_name, "app_interference")
|
|
|
+app_resources = cf.get(section_name, "app_resources")
|
|
|
+instance_deploy = cf.get(section_name, "instance_deploy")
|
|
|
+machine_resources = cf.get(section_name, "machine_resources")
|
|
|
+app = cf.get(section_name, "app")
|
|
|
+instance = cf.get(section_name, "instance")
|
|
|
+# app
|
|
|
+df1 = pd.read_csv(app_resources, encoding="utf-8")
|
|
|
+
|
|
|
+# instance
|
|
|
+df3 = pd.read_csv(instance_deploy, header=None,
|
|
|
+ names=list(["instanceid", "appid", "machineid"]))
|
|
|
+
|
|
|
+# machine
|
|
|
+# 其实就两类,所以就不需要导入数据了。
|
|
|
+
|
|
|
+# 限制表
|
|
|
+df4 = pd.read_csv(app_interference, header=None,
|
|
|
+ names=list(["appid1", "appid2", "max_interference"]), encoding="utf-8")
|
|
|
+
|
|
|
+result = pd.DataFrame(columns=list(["instanceid"], "machineid"))
|
|
|
+
|
|
|
+tem_disk = tem_mem = tem_cpu = tem_P = tem_M = tem_PM = 0
|
|
|
+tmp_stand_cpu1 = 32
|
|
|
+tmp_stand_mem1 = 64
|
|
|
+tmp_stand_disk1 = 600
|
|
|
+
|
|
|
+tmp_stand_cpu2 = 92
|
|
|
+tmp_stand_mem2 = 288
|
|
|
+tmp_stand_disk2 = 600
|
|
|
+
|
|
|
+tmp_stand_P = 7
|
|
|
+tmp_stand_M1 = 3
|
|
|
+tmp_stand_M2 = 7
|
|
|
+tmp_stand_PM1 = 7
|
|
|
+tmp_stand_PM2 = 9
|
|
|
+
|
|
|
+machine_count = 0 # 3000小机器,3000大机器。所以在小机器用完换大机器
|
|
|
+j = 1 # j表示主机序号,从1-3000,3001到6000
|
|
|
+is_deploy = False # 主机j是否部署了instance
|
|
|
+deploy_list = list() # 主机j部署的instanceid实例
|
|
|
+
|
|
|
+
|
|
|
+# 各app之间的限制
|
|
|
+def restrictApp(instance, deploy_list):
|
|
|
+ # df4["appid1"]
|
|
|
+ # df4["appid2"]
|
|
|
+
|
|
|
+ return True
|
|
|
+
|
|
|
+
|
|
|
+# 执行部署方案
|
|
|
+def deplay():
|
|
|
+ mlength = df3["instanceid"].size()
|
|
|
+ while mlength > 0:
|
|
|
+ deployInstance(mlength)
|
|
|
+
|
|
|
+ result.to_csv("../submit/xx.csv")
|
|
|
+
|
|
|
+
|
|
|
+def deployInstance(mlength):
|
|
|
+ for i in range(0, mlength):
|
|
|
+ tem_disk = tem_disk + df3["disk"][i] # 当前磁盘消耗
|
|
|
+ tem_mem = tem_mem + df3["mem"][i]
|
|
|
+ tem_cpu = tem_cpu + df3["cpu"][i]
|
|
|
+ tem_P = tem_P + df3["P"][i]
|
|
|
+ tem_M = tem_M + df3["M"][i]
|
|
|
+ tem_PM = tem_PM + df3["PM"][i]
|
|
|
+
|
|
|
+ if tem_disk < tmp_stand_disk1: # 磁盘够
|
|
|
+ # if 满足限制表条件,则把当前实例部署到这台主机上。
|
|
|
+ if is_deploy == True:
|
|
|
+ if restrictApp(instance=df3["instanceid"], deploy_list=deploy_list):
|
|
|
+ if tem_mem < tmp_stand_mem1: # 内存够
|
|
|
+ if tem_cpu < tmp_stand_cpu1: # CPU够
|
|
|
+ if tem_M < tmp_stand_M1:
|
|
|
+ if tem_P < tmp_stand_P:
|
|
|
+ if tem_PM < tmp_stand_PM1:
|
|
|
+ result["machine"][i] = "machine_" + i
|
|
|
+ else:
|
|
|
+ # 主机j没有部署实例,则先部署一个
|
|
|
+ result["machine"][i] = "machine_" + i
|
|
|
+ is_deploy = True
|
|
|
+ # 整个instace都遍历了,第j主机无法再放入一个,所以添加j+1主机
|
|
|
+ j = j + 1
|
|
|
+
|
|
|
+
|
|
|
+def plotGroup(): # df3新建一列
|
|
|
+ df3["disk"] = None
|
|
|
+ for i in range(0, 68219):
|
|
|
+ df3["disk"][i] = lambda x: x[i], df1["disk"]
|
|
|
+
|
|
|
+ # instance分类统计
|
|
|
+ group1 = df3.groupby("appid").count()
|
|
|
+ print(type(group1))
|
|
|
+ print(group1["instanceid"].sort_values(ascending=False))
|
|
|
+ plt.plot(group1["instanceid"].sort_values(ascending=False))
|
|
|
+ plt.savefig("../submit/group1.jpg")
|
|
|
+
|
|
|
+ # 找到每个instance消耗的disk
|
|
|
+
|
|
|
+ # df3["disk"] =
|