|
- import json
- from operator import itemgetter
-
- NUM_OF_HOSTS = 12000
- NUM_OF_INSTANCES = 150000
-
-
- def change_balance(input_fil, output_fil):
- ## 初始化
- ins_cpu = list() # [[,,,],...,[,,,]]
- host_cpu = list() # [,...,]
- ins_memory = list()
- host_memory = list()
- ins_disk = list()
- host_disk = list()
- used_cpu_0 = list()
- used_cpu_1 = list()
- used_cpu_2 = list()
- used_cpu_3 = list()
- used_memory_0 = list()
- used_memory_1 = list()
- used_memory_2 = list()
- used_memory_3 = list()
- used_disk_0 = list()
- used_disk_1 = list()
- used_disk_2 = list()
- used_disk_3 = list()
- p_used = list() # 物理机使用情况百分比
- host_executed_instance = list() # 当前物理机装载的实例
- output_list = list() # 最终输出的数据
-
-
- # 初始化每台物理机每时刻的CPU消耗
- for i in range(NUM_OF_HOSTS):
- used_cpu_0.append(0)
- used_cpu_1.append(0)
- used_cpu_2.append(0)
- used_cpu_3.append(0)
- used_memory_0.append(0)
- used_memory_1.append(0)
- used_memory_2.append(0)
- used_memory_3.append(0)
- used_disk_0.append(0)
- used_disk_1.append(0)
- used_disk_2.append(0)
- used_disk_3.append(0)
- host_cpu.append(0)
- host_memory.append(0)
- host_disk.append(0)
- p_used.append(0)
- host_executed_instance.append(list())
-
- # 初始化每个实例每时刻需要的CPU 和 每台物理机的CPU
- for i in range(NUM_OF_INSTANCES):
- ins_cpu.append([0,0,0,0])
- ins_memory.append([0, 0, 0, 0])
- ins_disk.append([0, 0, 0, 0])
- output_list1 = list() # 转csv
- for line in open(input_fil, 'r', encoding='utf-8').readlines():
- dict = json.loads(line)
- output_list1.append(dict)
- if dict['type'] == 'host':
- host_cpu[dict['host_id']-1] = dict['host_cpu']
- host_memory[dict['host_id']-1] = dict['host_memory']
- host_disk[dict['host_id']-1] = dict['host_disk']
-
- elif dict['type'] == 'instance':
- ins_cpu[dict['instance_id']-1]=[dict['instance_cpu_0'],dict['instance_cpu_1'],dict['instance_cpu_2'],dict['instance_cpu_3']]
- ins_memory[dict['instance_id']-1]=[dict['instance_memory_0'],dict['instance_memory_1'],dict['instance_memory_2'],dict['instance_memory_3']]
- ins_disk[dict['instance_id']-1]=[dict['instance_disk_0'],dict['instance_disk_1'],dict['instance_disk_2'],dict['instance_disk_3']]
-
- ## 统计
- for line in open(output_fil, 'r', encoding='utf-8').readlines():
- dict = json.loads(line)
- hid = dict['host_id']
- iid = dict['instance_id']
- host_executed_instance[dict['host_id']-1].append(dict['instance_id'])
- output_list.append({'host_id': dict['host_id'], 'instance_id': dict['instance_id']})
- # 统计每台物理机每时刻的CPU消耗
- used_cpu_0[hid-1] = used_cpu_0[hid-1] + ins_cpu[iid-1][0]
- used_cpu_1[hid-1] = used_cpu_1[hid-1] + ins_cpu[iid-1][1]
- used_cpu_2[hid-1] = used_cpu_2[hid-1] + ins_cpu[iid-1][2]
- used_cpu_3[hid-1] = used_cpu_3[hid-1] + ins_cpu[iid-1][3]
- # 统计每台物理机每时刻的Memory消耗
- used_memory_0[hid-1] = used_memory_0[hid-1] + ins_memory[iid-1][0]
- used_memory_1[hid-1] = used_memory_1[hid-1] + ins_memory[iid-1][1]
- used_memory_2[hid-1] = used_memory_2[hid-1] + ins_memory[iid-1][2]
- used_memory_3[hid-1] = used_memory_3[hid-1] + ins_memory[iid-1][3]
- # 统计每台物理机每时刻的Disk消耗
- used_disk_0[hid - 1] = used_disk_0[hid - 1] + ins_disk[iid - 1][0]
- used_disk_1[hid - 1] = used_disk_1[hid - 1] + ins_disk[iid - 1][1]
- used_disk_2[hid - 1] = used_disk_2[hid - 1] + ins_disk[iid - 1][2]
- used_disk_3[hid - 1] = used_disk_3[hid - 1] + ins_disk[iid - 1][3]
- # 统计每台物理机使用情况百分比
- for i in range(NUM_OF_HOSTS):
- p_used[i] = {
- 'cpu0': used_cpu_0[i] / host_cpu[i] * 100, 'cpu1': used_cpu_1[i] / host_cpu[i] * 100,
- 'cpu2': used_cpu_2[i] / host_cpu[i] * 100, 'cpu3': used_cpu_3[i] / host_cpu[i] * 100,
- 'memory0': used_memory_0[i] / host_memory[i] * 100, 'memory1': used_memory_1[i] / host_memory[i] * 100,
- 'memory2': used_memory_2[i] / host_memory[i] * 100, 'memory3': used_memory_3[i] / host_memory[i] * 100,
- 'disk0': used_disk_0[i] / host_disk[i] * 100, 'disk1': used_disk_1[i] / host_disk[i] * 100,
- 'disk2': used_disk_2[i] / host_disk[i] * 100, 'disk3': used_disk_3[i] / host_disk[i] * 100,
- 'instance_executed': host_executed_instance[i]
- }
- data_sorted = sorted(p_used, key=itemgetter('cpu0')) # 基于cpu 0时刻百分比排序
- for i in range(800):
- if(data_sorted[i]['cpu0'] != 0):
- instance1 = data_sorted[i]['instance_executed'][0]
- instance2 = data_sorted[i+1]['instance_executed'][0]
- output_list = merge_instance(output_list, instance1, instance2)
- print(instance1)
- print(instance2)
- break
- return output_list
-
- # 将instance1合并到instance2
- def merge_instance(output_data,instance1,instance2):
- host1 = 0
- instance1_index = 0
- for i in range(len(output_data)):
- if(output_data[i]['instance_id'] == instance2):
- host1 = output_data[i]['host_id']
- if(output_data[i]['instance_id'] == instance1):
- instance1_index = i
- del output_data[instance1_index]
- output_data.append({'host_id': host1, 'instance_id': instance1})
- return output_data
-
-
- # 将字典数组写入文件
- def write_data2jsonl(data2, file_path):
- with open(file_path, 'w') as outfile:
- for entry in data2:
- json.dump(entry, outfile, ensure_ascii=False)
- outfile.write('\n')
-
-
- data = change_balance('input.jsonl', 'demo_results.jsonl')
- file = open("demo_results.txt", 'w').close()
- write_data2jsonl(data, 'demo_results.jsonl')
|