51Testing软件测试论坛
标题:
【附代码】游戏服务器端性能测试-linux系统下自制脚本监测工具
[打印本页]
作者:
zhuzunwei
时间:
2012-1-11 14:50
标题:
【附代码】游戏服务器端性能测试-linux系统下自制脚本监测工具
本帖最后由 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_))
复制代码
作者:
jiazurongyu
时间:
2012-1-29 00:14
好分享
作者:
云层
时间:
2012-1-30 08:59
其实nmon都能搞定了,不知道能不能写个脚本专门搞定某一些进程资源监控,这个貌似nmon也没这个功能
作者:
gb10555627
时间:
2012-1-30 11:18
好分享
值得学习
作者:
zhuzunwei
时间:
2012-1-30 14:42
脚本稍微修改就可以监测一堆进程的资源占用了,脚本只是举例利用了部分信息
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2