博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 解析top文件格式
阅读量:6153 次
发布时间:2019-06-21

本文共 22200 字,大约阅读时间需要 74 分钟。

1 top - 16:14:35 up 2 days,  3:04,  7 users,  load average: 2.22, 1.84, 1.77 2 Tasks: 512 total,   2 running, 509 sleeping,   0 stopped,   1 zombie 3 %Cpu0  :  5.0 us,  1.0 sy, 17.0 ni, 77.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st 4 %Cpu1  :  5.9 us,  1.0 sy,  1.0 ni, 92.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st 5 %Cpu2  :  7.0 us,  0.0 sy,  0.0 ni, 93.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st 6 %Cpu3  :  4.0 us,  0.0 sy,  3.0 ni, 93.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st 7 %Cpu4  :  5.8 us,  1.0 sy,  1.9 ni, 91.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st 8 %Cpu5  : 22.0 us,  1.0 sy,  0.0 ni, 77.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st 9 %Cpu6  :  4.0 us,  0.0 sy,  0.0 ni, 96.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st10 %Cpu7  :  4.0 us,  0.0 sy,  0.0 ni, 96.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st11 %Cpu8  :  4.0 us,  0.0 sy,  0.0 ni, 96.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st12 %Cpu9  : 18.6 us,  1.0 sy,  1.0 ni, 79.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st13 %Cpu10 :  3.9 us,  0.0 sy,  0.0 ni, 96.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st14 %Cpu11 :  3.9 us,  0.0 sy,  0.0 ni, 96.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st15 MiB Mem:  32067.54+total, 7194.383 used, 24873.16+free,  750.664 buffers16 MiB Swap: 15258.99+total,    0.000 used, 15258.99+free. 1660.316 cached Mem17 18    PID    VIRT    RES    SHR S  %CPU %MEM COMMAND          nTH  P   SWAP   CODE    DATA nMaj nDRT   USED19 148266 1786.7m 262.3m  65.6m S  46.3  0.8 compiz            17  3   0.0m   0.0m  995.3m  266    0 262.3m20 145203  228.5m  70.3m  40.8m S  25.6  0.2 Xvnc               1  2   0.0m   4.3m   29.7m    0    0  70.3m21   9024   32.1m   4.1m   3.3m S  21.6  0.0 fiberlamp          1  9   0.0m   0.0m    1.0m    0    0   4.1m22   3535  214.9m  68.5m  45.2m S  20.7  0.2 Xvnc               1  4   0.0m   4.3m   23.6m   25    0  68.5m23   7905   31.4m   3.4m   3.1m S   3.9  0.0 fuzzyflakes        1  5   0.0m   0.0m    0.4m    0    0   3.4m24 145581   20.5m   3.0m   2.3m R   2.0  0.0 top                1  1   0.0m   0.1m    1.3m    1    0   3.0m25   1454 12.947g 1.416g  31.9m S   1.0  4.5 java              51  0   0.0m   0.0m 12.809g  168    0 1.416g26   3556  751.9m  66.7m  51.8m S   1.0  0.2 xfdesktop          3 11   0.0m   0.3m  300.4m  277    0  66.7m27   8956   20.5m   2.9m   2.2m R   1.0  0.0 top                1  0   0.0m   0.1m    1.3m    0    0   2.9m

解析代码如下:

1 # -*- coding: utf-8 -*-  2   3 import sqlite3  4 import os  5 import time  6   7 def create_load_info_table(cursor):  8     create_sql = '''  9         CREATE TABLE IF NOT EXISTS load_info( 10         min1_load            REAL, 11         min5_load            REAL, 12         min15_load            REAL, 13         record_time            TEXT, 14         time_stamp            TEXT 15         ) 16     ''' 17     cursor.execute(create_sql) 18      19 def create_task_info_table(cursor): 20     create_sql = ''' 21         CREATE TABLE IF NOT EXISTS task_info( 22         total                INTEGER, 23         running                INTEGER, 24         sleeping            INTEGER, 25         stopped                INTEGER, 26         zombie                INTEGER, 27         record_time            TEXT, 28         time_stamp            TEXT 29         ) 30     ''' 31     cursor.execute(create_sql) 32      33 def create_cpu_info_table(cursor): 34     create_sql = ''' 35         CREATE TABLE IF NOT EXISTS cpu_info( 36         cpu_name            TEXT, 37         us                    REAL, 38         sy                    REAL, 39         ni                    REAL, 40         id                    REAL, 41         wa                    REAL, 42         hi                    REAL, 43         si                    REAL, 44         st                    REAL, 45         record_time            TEXT, 46         time_stamp            TEXT 47         ) 48     ''' 49     cursor.execute(create_sql) 50      51 def create_mem_info_table(cursor): 52     create_sql = ''' 53         CREATE TABLE IF NOT EXISTS mem_info( 54         total                REAL, 55         used                REAL, 56         free                REAL, 57         buffers                REAL, 58         record_time            TEXT, 59         time_stamp            TEXT 60         ) 61     ''' 62     cursor.execute(create_sql) 63      64 def create_swap_info_table(cursor): 65     create_sql = ''' 66         CREATE TABLE IF NOT EXISTS swap_info( 67         total                REAL, 68         used                REAL, 69         free                REAL, 70         cached                REAL, 71         record_time            TEXT, 72         time_stamp            TEXT 73         ) 74     ''' 75     cursor.execute(create_sql) 76      77 def create_process_info_table(cursor): 78     create_sql = ''' 79         CREATE TABLE IF NOT EXISTS process_info( 80         PID                    INTEGER, 81         VIRT                REAL, 82         RES                    REAL, 83         SHR                    REAL, 84         S                    TEXT, 85         CPU                    REAL, 86         MEM                    REAL, 87         COMMAND                TEXT, 88         nTH                    INTEGER, 89         P                    INTEGER, 90         SWAP                REAL, 91         CODE                REAL, 92         DATA                REAL, 93         nMaj                INTEGER, 94         nDRT                INTEGER, 95         USED                REAL, 96         record_time            TEXT, 97         time_stamp            TEXT 98         ) 99     '''100     cursor.execute(create_sql)101 102 cur_dir = os.getcwd()103 db_name = 'top_info.db'104 top_log_name = 'top_cpu.txt'105     106 conn = sqlite3.connect(db_name)107 cursor = conn.cursor()108 get_all_table = "SELECT tbl_name FROM sqlite_master where type = 'table'"109 cursor.execute(get_all_table)110 all_table_list = cursor.fetchall()111 all_table_name_list = []112 113 for table_name in all_table_list:114     all_table_name_list.append(table_name[0])115     delete_sql = "DELETE FROM %s" % (table_name[0])    #删除原来的记录116     cursor.execute(delete_sql)117     118 cursor.execute("VACUUM")    # VACUUM 命令清除未使用的空间119 conn.commit()120 121 topfile = open(top_log_name, 'r')122 123 try:124     lines = topfile.readlines()125     cur_time_stamp = ''126     cur_record_time = ''127     128     for line in lines:129         line = line.strip()130         cur_time_stamp = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())131         132         if len(line) == 0:133             continue134         elif line[:3] == 'top':135             if 'load_info' not in all_table_name_list:136                 create_load_info_table(cursor)137             138             #['top - 08:14:17 up 2 days', ' 15:36', ' 15 users', '    load average: 5.46', ' 5.29', ' 5.18']139             load_list = line.split(',')140             #['top', '-', '08:14:17', 'up', '2', 'days']141             cur_time_list = load_list[0].split()142             cur_time = cur_time_list[2]143             cur_record_time = cur_time144             #['load average', ' 5.46']145             min1_load_list = load_list[3].strip().split(':')146             min1_load = float(min1_load_list[1])147             min5_load = float(load_list[4])148             min15_load = float(load_list[5])149             150             insert_sql = "INSERT INTO load_info VALUES (%0.2f, %0.2f, %0.2f, '%s', '%s')" % (min1_load, min5_load, min15_load, cur_record_time, cur_time_stamp)151             cursor.execute(insert_sql)152             #conn.commit()153         elif line[:5] == 'Tasks':#Threads154             if 'task_info' not in all_table_name_list:155                 create_task_info_table(cursor)156             157             #'Tasks: 898 total,      5 running, 890 sleeping,     0 stopped,      3 zombie'158             task_list = line.split(',')159             #['Tasks: 898 total', '      5 running', ' 890 sleeping', '   0 stopped', '   3 zombie']160             sum_task_count = int(task_list[0].strip().split(':')[1].split()[0])161             running_task_count = int(task_list[1].strip().split()[0])162             sleeping_task_count = int(task_list[2].strip().split()[0])163             stopped_task_count = int(task_list[3].strip().split()[0])164             zombia_task_count = int(task_list[4].strip().split()[0])165             166             insert_sql = "INSERT INTO task_info VALUES (%d, %d, %d, %d, %d, '%s', '%s')" % (sum_task_count, running_task_count, sleeping_task_count, stopped_task_count, zombia_task_count, cur_record_time, cur_time_stamp)167             cursor.execute(insert_sql)168             #conn.commit()169         elif line[:4] == '%Cpu':#%Cpu0170             if 'cpu_info' not in all_table_name_list:171                 create_cpu_info_table(cursor)172             173             cpu_name = line[:line.index(':')].strip()174             175             #'%Cpu0     : 19.6 us,     2.0 sy,  5.8 ni, 72.6 id,    0.0 wa,     0.0 hi,  0.0 si,  0.0 st'176             cpu_list = line.split(':')[1].strip().split(',')177             #['19.6 us', '    2.0 sy', '    5.8 ni', ' 72.6 id', '    0.0 wa', '    0.0 hi', '    0.0 si', '    0.0 st']178             us_percent = float(cpu_list[0].strip().split()[0])179             #time running un-niced user processes180             sy_percent = float(cpu_list[1].strip().split()[0])181             #time running kernel processes182             ni_percent = float(cpu_list[2].strip().split()[0])183             #time running niced user processes184             id_percent = float(cpu_list[3].strip().split()[0])185             #time spent in the kernel idle handler186             wa_percent = float(cpu_list[4].strip().split()[0])187             #time waiting for I/O completion188             hi_percent = float(cpu_list[5].strip().split()[0])189             #time spent serving hardware interrupts190             si_percent = float(cpu_list[6].strip().split()[0])191             #time spent serving software interrupts192             st_percent = float(cpu_list[7].strip().split()[0])193             #time stolen from this vm by the hypervisor194             195             insert_sql = "INSERT INTO cpu_info VALUES ('%s', %0.2f, %0.2f, %0.2f, %0.2f, %0.2f, %0.2f, %0.2f, %0.2f, '%s', '%s')" % (cpu_name, us_percent, sy_percent, ni_percent, id_percent, wa_percent, hi_percent, si_percent, st_percent, cur_record_time, cur_time_stamp)196             cursor.execute(insert_sql)197             #conn.commit()198         elif line[:7] == 'KiB Mem':#KiB Mem,主要用的交互选项E设置的单位199             if 'mem_info' not in all_table_name_list:200                 create_mem_info_table(cursor)201             202             #'KiB Mem:    32837164 total, 10604512 used, 22232652 free,  1117824 buffers'203             Men_list = line.split(':')[1].strip().split(',')204             #['32837164 total', ' 10604512 used', ' 22232652 free', '  1117824 buffers']205             total_mem = float(Men_list[0].strip().split()[0]) / 1024206             used_men = float(Men_list[1].strip().split()[0]) / 1024207             free_men = float(Men_list[2].strip().split()[0]) / 1024208             buffer_men = float(Men_list[3].strip().split()[0]) / 1024209             210             insert_sql = "INSERT INTO mem_info VALUES (%0.2f, %0.2f, %0.2f, %0.2f, '%s', '%s')" % (total_mem, used_men, free_men, buffer_men, cur_record_time, cur_time_stamp)211             cursor.execute(insert_sql)212             #conn.commit()213         elif line[:7] == 'MiB Mem':#MiB Mem214             if 'mem_info' not in all_table_name_list:215                 create_mem_info_table(cursor)216             217             #MiB Mem:  32067.54+total, 5090.746 used, 26976.79+free,  624.168 buffers218             Men_list = line.split(':')[1].strip().split(',')219             220             total_mem = 0.0221             if '+' in Men_list[0]:222                 total_mem = float(Men_list[0].strip().split('+')[0])223             else:224                 total_mem = float(Men_list[0].strip().split()[0])225             226             used_men = 0.0227             if '+' in Men_list[1]:228                 used_men = float(Men_list[1].strip().split('+')[0])229             else:230                 used_men = float(Men_list[1].strip().split()[0])231                 232             free_men = 0.0233             if '+' in Men_list[2]:234                 free_men = float(Men_list[2].strip().split('+')[0])235             else:236                 free_men = float(Men_list[2].strip().split()[0])237                 238             buffer_men = 0.0239             if '+' in Men_list[3]:240                 buffer_men = float(Men_list[3].strip().split('+')[0])241             else:242                 buffer_men = float(Men_list[3].strip().split()[0])243                 244             insert_sql = "INSERT INTO mem_info VALUES (%0.2f, %0.2f, %0.2f, %0.2f, '%s', '%s')" % (total_mem, used_men, free_men, buffer_men, cur_record_time, cur_time_stamp)245             cursor.execute(insert_sql)246             #conn.commit()247         elif line[:8] == 'KiB Swap':    #主要用的交互选项E设置的单位248             if 'swap_info' not in all_table_name_list:249                 create_swap_info_table(cursor)250             251             #'KiB Swap: 15625212 total,           0 used, 15625212 free.  3900452 cached Mem'252             Swap_list = line.split(':')[1].strip().split(',')253             #['15625212 total', '         0 used', ' 15625212 free.    3900452 cached Mem']254             total_swap = float(Swap_list[0].strip().split()[0]) / 1024255             used_swap = float(Swap_list[1].strip().split()[0]) / 1024256             257             free_cache_list = Swap_list[2].strip().split('.')258             259             free_swap = float(free_cache_list[0].strip().split()[0]) / 1024260             cache_swap = float(free_cache_list[1].strip().split()[0]) / 1024261             262             insert_sql = "INSERT INTO swap_info VALUES (%0.2f, %0.2f, %0.2f, %0.2f, '%s', '%s')" % (total_swap, used_swap, free_swap, cache_swap, cur_record_time, cur_time_stamp)263             cursor.execute(insert_sql)264             #conn.commit()265         elif line[:8] == 'MiB Swap':266             if 'swap_info' not in all_table_name_list:267                 create_swap_info_table(cursor)268             269             #MiB Swap: 15258.99+total,    0.000 used, 15258.99+free. 1475.379 cached Mem270             Swap_list = line.split(':')[1].strip().split(',')271             272             total_swap = 0.0273             if '+' in Swap_list[0]:274                 total_swap = float(Swap_list[0].strip().split('+')[0])275             else:276                 total_swap = float(Swap_list[0].strip().split()[0])277                 278             used_swap = 0.0279             if '+' in Swap_list[1]:280                 used_swap = float(Swap_list[1].strip().split('+')[0])281             else:282                 used_swap = float(Swap_list[1].strip().split()[0])283                 284             free_cache_list = Swap_list[2].strip().split('.')285 286             free_swap = 0.0287             if '+' in free_cache_list[0]:288                 free_swap = float(free_cache_list[0].strip().split('+')[0])289             else:290                 free_swap = float(free_cache_list[0].strip().split()[0])291                 292             cache_swap = 0.0293             if '+' in free_cache_list[1]:294                 cache_swap = float(free_cache_list[1].strip().split('+')[0])295             else:296                 cache_swap = float(free_cache_list[1].strip().split()[0])297                 298             insert_sql = "INSERT INTO swap_info VALUES (%0.2f, %0.2f, %0.2f, %0.2f, '%s', '%s')" % (total_swap, used_swap, free_swap, cache_swap, cur_record_time, cur_time_stamp)299             cursor.execute(insert_sql)300             #conn.commit()301         elif line[:3] == 'PID':302             continue303         else:304             if 'process_info' not in all_table_name_list:305                 create_process_info_table(cursor)306             307             #PID    VIRT    RES       SHR S  %CPU %MEM COMMAND       nTH    P    SWAP   CODE       DATA nMaj nDRT    USED308             #'157271  459.9m 256.8m     13.6m R  92.3    0.8 bundle         2    0    0.0m   0.0m     251.6m       0    0 256.8m'309             process_list = line.split()310             PID = int(process_list[0])311             #Process Id312             313             VIRT = 0.0314             if 'm' in process_list[1]:    #这里的显示单位交互模式下用的是小写的e作为设置315                 VIRT = float(process_list[1][:-1])316             elif 'g' in process_list[1]:317                 VIRT = float(process_list[1][:-1]) * 1024318             else:319                 VIRT = float(process_list[1]) / 1024320             #Virtual Memory Size321             #The total amount of virtual memory used by the task. It includes all code, data and shared libraries322             #plus pages that have been swapped out and pages that have been mapped but not used.323             324             RES = 0.0325             if 'm' in process_list[2]:326                 RES = float(process_list[2][:-1])327             elif 'g' in process_list[2]:328                 RES = float(process_list[2][:-1]) * 1024329             else:330                 RES = float(process_list[2]) / 1024331             332             #Resident Memory Size333             #A subset of the virtual address space(VIRT) representing the non-swapped physical memory a task is 334             #currently using.335             336             SHR = 0.0337             if 'm' in process_list[3]:338                 SHR = float(process_list[3][:-1])339             elif 'g' in process_list[3]:340                 SHR = float(process_list[3][:-1]) * 1024341             else:342                 SHR = float(process_list[3]) / 1024343             344             #Shared Memory Size345             #A subset of resident memory(RES) that may be used by other processes.346             process_status = process_list[4]347             #D = uninterruptible sleeping348             #R = running349             #S = sleeping350             #T = stopped by job control signal351             #t = stopped by debugger during trace352             #Z = zombia353             cpu_usage = float(process_list[5])    #百分比对应的是单个cpu还是cpu之和使用的是交互选项I设置的354             mem_usage = float(process_list[6])355             command_name = process_list[7]356             thread_count = int(process_list[8])357             use_cpu_index = int(process_list[9])358             359             SWAP = 0.0360             if 'm' in process_list[10]:361                 SWAP = float(process_list[10][:-1])362             elif 'g' in process_list[10]:363                 SWAP = float(process_list[10][:-1]) * 1024364             else:365                 SWAP = float(process_list[10]) / 1024366             367             #The formerly resident portion of a task's address space written to the swap file when physical memory368             #becomes over committed.369             370             CODE = 0.0371             if 'm' in process_list[11]:372                 CODE = float(process_list[11][:-1])373             elif 'g' in process_list[11]:374                 CODE = float(process_list[11][:-1]) * 1024375             else:376                 CODE = float(process_list[11]) / 1024377             #Code Size378             #The amount of physical memory currently devoted to executable code, also know as the Text Resident Set or TRS379             380             DATA = 0.0381             if 'm' in process_list[12]:382                 DATA = float(process_list[12][:-1])383             elif 'g' in process_list[12]:384                 DATA = float(process_list[12][:-1]) * 1024385             else:386                 DATA = float(process_list[12]) / 1024387             388             #Data + Stack Size389             #The amount of private memory reserved by a process. It is also known as the Data Resident Set or DRS.390             #Such memory may not yet be mapped to physical memory(RES) but will always be included in the 391             #virtual memory (VIRT) amount.392             nMaj = int(process_list[13])393             #Major Page Fault Count394             #The number of major page faults that have occurred for a task. A page fault occurs when a process attempts395             #to read from or write to a virtual page that is not currently present in its address.396             #A major page fault is when auxiliary storage access is invloved in making that page available.397             nDRT = int(process_list[14])398             #Dirty Pages Count399             #The number of pages that have been modified since they were last written to auxiliary storage. Dirty pages400             #must be written to auxiliary storage before the corresponding physical memory location can be used for401             #some other virtual page.402             403             USED = 0.0404             if 'm' in process_list[15]:405                 USED = float(process_list[15][:-1])406             elif 'g' in process_list[15]:407                 USED = float(process_list[15][:-1]) * 1024408             else:409                 USED = float(process_list[15]) / 1024410             411             #Memory in Use412             #This field represents the non-swapped physical memory a task is using (RES) plus the swapped out portion413             #of its address space (SWAP).414             415             #8943  397.8m 218.4m  12.7m R  95.9  0.7 bundle             2  9   0.0m   0.0m  216.3m    0    0 218.4m416             insert_sql = "INSERT INTO process_info VALUES (%d, %0.2f, %0.2f, %0.2f, '%s', %0.2f, %0.2f, '%s', %d, %d, %0.2f, %0.2f, %0.2f, %d, %d, %0.2f, '%s', '%s')" % (PID, VIRT, RES, SHR, process_status, cpu_usage, mem_usage, command_name, thread_count, use_cpu_index, SWAP, CODE, DATA, nMaj, nDRT, USED, cur_record_time, cur_time_stamp)417             cursor.execute(insert_sql)418             #conn.commit()419 finally:420     topfile.close()421     cursor.close()422     conn.commit()423     conn.close()

 

转载地址:http://zuwfa.baihongyu.com/

你可能感兴趣的文章
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
淘宝的几个架构图
查看>>
Android扩展 - 拍照篇(Camera)
查看>>
数据加密插件
查看>>
linux后台运行程序
查看>>
win7 vs2012/2013 编译boost 1.55
查看>>
Tar打包、压缩与解压缩到指定目录的方法
查看>>
配置spring上下文
查看>>
Python异步IO --- 轻松管理10k+并发连接
查看>>
Oracle中drop user和drop user cascade的区别
查看>>
登记申请汇总
查看>>
Android Jni调用浅述
查看>>
CodeCombat森林关卡Python代码
查看>>
第一个应用程序HelloWorld
查看>>
(二)Spring Boot 起步入门(翻译自Spring Boot官方教程文档)1.5.9.RELEASE
查看>>
Java并发编程73道面试题及答案
查看>>
企业级负载平衡简介(转)
查看>>
ICCV2017 论文浏览记录
查看>>
科技巨头的交通争夺战
查看>>
Shell基础之-正则表达式
查看>>