|
本帖最后由 zhuzunwei 于 2012-1-11 14:52 编辑
本人研究过一段时间linux服务器端性能监测,最初都是用现成的工具TOP,VMSTAT等命令,后来觉得输出信息太多,长时间监控也不利于数据记录,于是想自己写点简单的脚本进行需要的数据记录,于是研究了一下,发现linux下服务器的性能数据监测其实相当好做,/proc/目录大有学问。众多性能监测工具的原始数据来源其实都是源自于/proc/目录。
系统内核对每个进程的各项性能数据在/proc/目录下都有一个直接映射,每个进程独立的PID为目录。比如文件/proc/<ID>/stat里面有一长串以空格分开的数据,每次读取他都会发现的数值在不停变化。查阅下资料,其实这里面都是该进程的CPU、磁盘IO、内存量等数据。大家找度娘问一下就知道了,我就不列举了。
伸手挡福音,共享一个自己写的监测内存和CPU的脚本,主要监测虚拟内存、物理内存、虚拟内存增量和物理内存增量以及CPU占用率,脚本用PYTHON写的
另外欢迎大家来讨论,这个版块人太少了吧,想找人交流都没有
- # -*- coding: cp936 -*-
- #通过读取/proc/<pid>/status文件进行性能数据的计算
- #通过间隔,可以反映出物理内存及虚拟内存数值的增量
- #
- import os
- import time
- import sys
- EXCEOUND = 30 ##数据读取间隔
- PROCESS_NAME = 'gameserverd_lin' ##要监测的进程名
- #~~~~~~~~~~~~~获取进程ID~~~~~~~~~~~~~~~~~~~~~~~#
- if sys.argv[1] == '':
- pp=os.popen('ps -A | grep "'+PROCESS_NAME+'"')
- aa=pp.read()
- PROCESS_PID = aa.strip().split(' ')[0]
- else:
- PROCESS_PID = sys.argv[1]
- #print PROCESS_PID
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
- INFORS = []
- def readVIRT():
- pp=os.popen("grep 'VmSize' "+'/proc/'+PROCESS_PID+'/status')
- aa=pp.read()
- #print aa
- return aa[7:].strip()[:-3]
- def readRSS():
- pp=os.popen("grep 'VmRSS' "+'/proc/'+PROCESS_PID+'/status')
- aa=pp.read()
- #print aa
- return aa[7:].strip()[:-3]
- def writeinfos(LIST,filename):
- logfile=file(filename,'ab')
- for mem in LIST:
- logfile.write(mem+'\n')
- logfile.close()
- def readcpuinfo():
- filelist=open('/proc/'+PROCESS_PID+'/stat','r')
- aa=filelist.readline()
- ss=aa.split(' ')
- return (ss[13],ss[14])
- rss =readRSS()
- vm=readVIRT()
- zengliangvm=0
- zengliangrss=0
- while 1:
- VM=readVIRT()
- RSS=readRSS()
- #print VM
- ye,mo,da,ho,mi,se,_,_,_=time.localtime()
- pp1=readcpuinfo()
- _time1_=time.time()
-
- time.sleep(2)
-
- pp2=readcpuinfo()
- _time2_=time.time()
- cpuuse=(int(pp2[0])+int(pp2[1])-int(pp1[0])-int(pp1[1]))/(_time2_-_time1_)
- if RSS != rss:
- zengliangrss = int(RSS)-int(rss)
- rss = RSS
- if VM != vm:
- zengliangvm = int(VM)-int(vm)
- vm = VM
- INFORS.append("%d-%d %d:%d:%d\t"%(mo,da,ho,mi,se)+'VM:'+VM+'\tVMOffset:'+str(zengliangvm)+'\tRSS:'+RSS+'\tRSSOffset:'+str(zengliangrss)+'\tCPU%:'+str(cpuuse))
- zengliangrss=0
- zengliangvm=0
-
- #INFORS.append("%d-%d %d:%d:%d\t"%(mo,da,ho,mi,se)+'VM:'+VM+'\t'+str(cpuuse))
- #print INFORS
- if len(INFORS) >5:
- writeinfos(INFORS,'%d-%d-%d_%s_logfile.txt'%(ye,mo,da,PROCESS_PID))
- print 'Have writed messages'
- INFORS=[]
- time.sleep(EXCEOUND-(_time2_-_time1_))
复制代码 |
评分
-
查看全部评分
|