zoukankan      html  css  js  c++  java
  • 通过进程id找到进程对应的容器并统计每个进程的内存占用写到excel里

      1 # coding=utf-8
      2 import re
      3 import os
      4 import commands
      5 import json
      6 import psutil
      7 from pyExcelerator import *
      8 
      9 
     10 def execute(cmd):
     11     status, output = commands.getstatusoutput(cmd)
     12     if status != 0:
     13         raise Exception('status is %s, output is %s' % (status, output))
     14     return output
     15 
     16 
     17 def get_all_container_ids_name():
     18     infos = execute("docker ps |awk '{print $1, $NF}'").split('
    ')
     19     all_ids = {}
     20     regex = re.compile('s+')
     21     for info in infos:
     22         docker_id, docker_name = regex.split(info)
     23         short_id = docker_id.strip()
     24         if short_id.strip().startswith('CON'):
     25             continue
     26         full_id = execute("docker inspect -f '{{.Id}}' %s" % short_id)
     27         state = execute("cat /run/runc/%s/state.json" % full_id)
     28         f = json.loads(state)
     29         cgroup_paths = f['cgroup_paths']['pids']
     30         pids_path = os.path.join(cgroup_paths, 'cgroup.procs')
     31         ids = execute("cat %s" % pids_path).split('
    ')
     32         for prgress_id in ids:
     33             pr_id = prgress_id.strip()
     34             all_ids[pr_id] = {'id': short_id, 'name': docker_name}
     35     return all_ids
     36 
     37 
     38 def get_process_info(p):
     39     try:
     40         # cpu = int(p.cpu_percent(interval=1))
     41         rss = p.memory_info().rss
     42         name = p.name()
     43         pid = p.pid
     44         return '%s,%s,%s
    ' % (pid, name, rss)
     45     except Exception as e:
     46         print e.message
     47 
     48 
     49 def get_all_process_info():
     50     """取出全部进程的进程名,进程ID,进程实际内存, 虚拟内存,CPU使用率
     51     """
     52     node_name = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'node_test.log')
     53     instances = ''
     54     all_processes = list(psutil.process_iter())
     55     for proc in all_processes:
     56         ret = get_process_info(proc)
     57         if ret:
     58             instances += ret
     59     with open(node_name, 'w') as fp:
     60         fp.writelines(instances)
     61 
     62 
     63 def get_docker_name():
     64     file_name = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'node_test.log')
     65     result_name = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data.txt')
     66     id_name_relation = get_all_container_ids_name()
     67     tmp = ''
     68     regex = re.compile(',')
     69     with open(file_name, 'r') as fp:
     70         for progress_info in fp.readlines():
     71             progress_id, mem, progress_name = regex.split(progress_info)[0], regex.split(progress_info)[2], 
     72                                               regex.split(progress_info)[1]
     73             if progress_id in id_name_relation:
     74                 tmp += '%s %s %s %s %s
    ' % (progress_id, id_name_relation[progress_id]['id'],
     75                                              id_name_relation[progress_id]['name'], progress_name, mem)
     76             else:
     77                 tmp += '%s %s %s %s %s
    ' % (progress_id, 'sys_progress', 'sys_progress', progress_name, mem)
     78     with open(result_name, 'w') as fp:
     79         fp.writelines(tmp)
     80 
     81 
     82 def ge_excel():
     83     file_name = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data.txt')
     84     result_name = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data.xlsx')
     85     regex = re.compile(' ')
     86     w = Workbook()  # 创建一个工作簿
     87     ws = w.add_sheet('node_1_data')  # 创建一个工作表
     88     ws.write(0, 0, 'pid')
     89     ws.write(0, 1, 'docker_id')
     90     ws.write(0, 2, 'docker_name')
     91     ws.write(0, 3, 'progress_name')
     92     ws.write(0, 4, 'mem(MB)')
     93     index = 1
     94     with open(file_name, 'r') as fp:
     95         for info in fp.readlines():
     96             progress_info = info.strip()
     97             if progress_info:
     98                 progress_id, docker_id, docker_name, progress_name, mem = regex.split(progress_info)
     99                 ws.write(index, 0, progress_id)
    100                 ws.write(index, 1, docker_id)
    101                 ws.write(index, 2, docker_name)
    102                 ws.write(index, 3, progress_name)
    103                 ws.write(index, 4, float(mem) / 1024 / 1024)
    104                 index += 1
    105     w.save(result_name)
    106 
    107 
    108 def delete_tmp_file():
    109     data_name = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data.txt')
    110     node_test_name = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'node_test.log')
    111     if os.path.exists(data_name):
    112         os.remove(data_name)
    113     if os.path.exists(node_test_name):
    114         os.remove(node_test_name)
    115 
    116 
    117 if __name__ == '__main__':
    118     delete_tmp_file()
    119     get_all_process_info()
    120     get_docker_name()
    121     ge_excel()
    122     delete_tmp_file()
  • 相关阅读:
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    使用Jasmine和karma对传统js进行单元测试
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    nginx 基于IP的多虚拟主机配置
    Shiro 框架的MD5加密算法实现原理
    项目实战:Qt+OSG三维点云引擎(支持原点,缩放,单独轴或者组合多轴拽拖旋转,支持导入点云文件)
    实用技巧:阿里云服务器建立公网物联网服务器(解决阿里云服务器端口,公网连接不上的问题)
  • 原文地址:https://www.cnblogs.com/small-office/p/9876913.html
Copyright © 2011-2022 走看看