通过进程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(‘\n‘)
 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(‘\n‘)
 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\n‘ % (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\n‘ % (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\n‘ % (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()

原文地址:https://www.cnblogs.com/small-office/p/9876913.html

时间: 2024-11-29 10:14:05

通过进程id找到进程对应的容器并统计每个进程的内存占用写到excel里的相关文章

Linux/Unix分配进程ID的方法以及源代码实现

在Linux/Unix系统中.每一个进程都有一个非负整型表示的唯一进程ID.尽管是唯一的.可是进程的ID能够重用.当一个进程终止后,其进程ID就能够再次使用了. 大多数Linux/Unix系统採用延迟重用的算法,使得赋予新建进程ID不同于近期终止进程所使用的ID,这主要是为了防止将新进程误觉得是使用同一ID的某个已终止的先前进程.本文讨论了Linux/Unix分配进程ID的方法以及源代码实现. 分配进程ID的方法 在大多数Linux/Unix系统中,生成一个进程ID方法是:从0開始依次连续分配,

Linux/Unix分配进程ID的方法以及源码实现

在Linux/Unix系统中,每个进程都有一个非负整型表示的唯一进程ID.虽然是唯一的,但是进程的ID可以重用.当一个进程终止后,其进程ID就可以再次使用了.大多数Linux/Unix系统采用延迟重用的算法,使得赋予新建进程ID不同于最近终止进程所使用的ID,这主要是为了防止将新进程误认为是使用同一ID的某个已终止的先前进程.本文讨论了Linux/Unix分配进程ID的方法以及源码实现. 分配进程ID的方法 在大多数Linux/Unix系统中,生成一个进程ID方法是:从0开始依次连续分配,一直到

Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> 参考:C和指针学习 说明:本文非常的长,也是为了便于查找和比较,所以放在一起了 Linux 传统的进程间通信有很多,如各类管道.消息队列.内存共享.信号量等等.但它们都无法介于内核态与用户态使用,原因如表 通信方法 无法介于内核态与用户态的原因 管道(不包括命名管道) 局限于父子进程间的通信. 消息队列 在

jstack:将Process Explorer中看到的进程ID做16进制转换,到ThreadDump中加上0x 前缀即能找到对应线程(转)

原文链接:http://www.iteye.com/topic/1133941 症状: 使用Eclipse win 64位版本,indigo及kepler都重现了,使用tomcat 6.0.39,jdk1.6.u45及1.7u45均尝试了,也重现. 重现步骤很简单,使用debug模式启动时较容易出来,debug启动tomcat,(我的是webapp)然后在页面上随便点点即发现eclipse僵死,且任何从浏览器发出的请求都卡住不能被接收执行. 1.然后从任务管理器直接杀掉eclipse对应的jav

Linux 内核进程管理之进程ID

Linux 内核进程管理之进程IDLinux 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,是内核中最重要的数据结构之一.该数据结构在内核文件 include/linux/sched.h 中定义,在Linux 3.8 的内核中,该数据结构足足有 380 行之多,在这里我不可能逐项去描述其表示的含义,本篇文章只关注该数据结构如何来组织和管理进程ID的. 进程ID类型要想了解内核如何来组织和管理进程

Linux 内核进程管理之进程ID 。图解

http://www.cnblogs.com/hazir/tag/kernel/ Linux 内核进程管理之进程ID Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,是内核中最重要的数据结构之一.该数据结构在内核文件 include/linux/sched.h 中定义,在Linux 3.8 的内核中,该数据结构足足有 380 行之多,在这里我不可能逐项去描述其表示的含义,本篇文章只关注

Linux进程ID号--Linux进程的管理与调度(三)

日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux-4.5 X86 & arm gatieme LinuxDeviceDrivers Linux-进程管理与调度 Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,是内核中最重要的数据结构之一. 该数据结构在内核文件include/linux/sched.h中定义,在目前最新的Linux-4.5(截至目前的

dos命令记录以及dos下通过进程id查找工作路径

摘自:http://www.cnblogs.com/lisuyun/p/5880815.html dos命令 tasklist |findstr "1696" 通过进程id查看进程名 tasklist 列出所有进程 netstat -ano 查看当前网络通信进程连接的各种状态 以下转自http://blog.chinaunix.net/uid-27570589-id-3969108.html windows下通过pid 找到运行程序的路径有没有遇到过这样的情景,通过window的任务管

【转】iis解决应用程序池**提供服务的进程意外终止进程ID是**。进程退出代码是&#39;0x80&#39;

转自:http://blog.sina.com.cn/s/blog_56a68d5501013xdd.html 我们公司旗下的红黑互联会遇到这种问题 事件类型: 警告事件来源: W3SVC事件种类: 无事件 ID: 1009日期: 事件: XX:XX:XX用户: XX计算机: XXXX描述:为应用程序池 XXXXX 提供服务的进程意外终止.进程 ID 是 XXXX.进程退出代码是 0x80.有关更多信息,请参阅在 asp">http://go.microsoft.com/fwlink/ev