zhuzunwei 发表于 2012-1-11 14:50:36

【附代码】游戏服务器端性能测试-linux系统下自制脚本监测工具

本帖最后由 zhuzunwei 于 2012-1-11 14:52 编辑

本人研究过一段时间linux服务器端性能监测,最初都是用现成的工具TOP,VMSTAT等命令,后来觉得输出信息太多,长时间监控也不利于数据记录,于是想自己写点简单的脚本进行需要的数据记录,于是研究了一下,发现linux下服务器的性能数据监测其实相当好做,/proc/目录大有学问。众多性能监测工具的原始数据来源其实都是源自于/proc/目录。

系统内核对每个进程的各项性能数据在/proc/目录下都有一个直接映射,每个进程独立的PID为目录。比如文件/proc/<;PID>/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 == '':
    pp=os.popen('ps -A | grep "'+PROCESS_NAME+'"')
    aa=pp.read()
    PROCESS_PID = aa.strip().split(' ')
else:
    PROCESS_PID = sys.argv
#print PROCESS_PID
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#

INFORS = []

def readVIRT():
    pp=os.popen("grep 'VmSize' "+'/proc/'+PROCESS_PID+'/status')
    aa=pp.read()
    #print aa
    return aa.strip()[:-3]

def readRSS():
    pp=os.popen("grep 'VmRSS' "+'/proc/'+PROCESS_PID+'/status')
    aa=pp.read()
    #print aa
    return aa.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,ss)

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)+int(pp2)-int(pp1)-int(pp1))/(_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:13

好分享

云层 发表于 2012-1-30 08:59:12

其实nmon都能搞定了,不知道能不能写个脚本专门搞定某一些进程资源监控,这个貌似nmon也没这个功能

gb10555627 发表于 2012-1-30 11:18:34

好分享
值得学习

zhuzunwei 发表于 2012-1-30 14:42:36

脚本稍微修改就可以监测一堆进程的资源占用了,脚本只是举例利用了部分信息
页: [1]
查看完整版本: 【附代码】游戏服务器端性能测试-linux系统下自制脚本监测工具