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写的
另外欢迎大家来讨论,这个版块人太少了吧,想找人交流都没有

  1. # -*- coding: cp936 -*-

  2. #通过读取/proc/<pid>/status文件进行性能数据的计算
  3. #通过间隔,可以反映出物理内存及虚拟内存数值的增量
  4. #


  5. import os
  6. import time
  7. import sys

  8. EXCEOUND = 30    ##数据读取间隔

  9. PROCESS_NAME = 'gameserverd_lin'     ##要监测的进程名

  10. #~~~~~~~~~~~~~获取进程ID~~~~~~~~~~~~~~~~~~~~~~~#
  11. if sys.argv[1] == '':
  12.     pp=os.popen('ps -A | grep "'+PROCESS_NAME+'"')
  13.     aa=pp.read()
  14.     PROCESS_PID = aa.strip().split(' ')[0]
  15. else:
  16.     PROCESS_PID = sys.argv[1]
  17. #print PROCESS_PID
  18. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#

  19. INFORS = []

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

  25. def readRSS():
  26.     pp=os.popen("grep 'VmRSS' "+'/proc/'+PROCESS_PID+'/status')
  27.     aa=pp.read()
  28.     #print aa
  29.     return aa[7:].strip()[:-3]

  30. def writeinfos(LIST,filename):
  31.     logfile=file(filename,'ab')
  32.     for mem in LIST:
  33.         logfile.write(mem+'\n')
  34.     logfile.close()

  35. def readcpuinfo():
  36.     filelist=open('/proc/'+PROCESS_PID+'/stat','r')
  37.     aa=filelist.readline()
  38.     ss=aa.split(' ')
  39.     return (ss[13],ss[14])

  40. rss =readRSS()
  41. vm=readVIRT()
  42. zengliangvm=0
  43. zengliangrss=0
  44. while 1:
  45.     VM=readVIRT()
  46.     RSS=readRSS()
  47.     #print VM
  48.     ye,mo,da,ho,mi,se,_,_,_=time.localtime()
  49.     pp1=readcpuinfo()
  50.     _time1_=time.time()
  51.    
  52.     time.sleep(2)
  53.    
  54.     pp2=readcpuinfo()
  55.     _time2_=time.time()

  56.     cpuuse=(int(pp2[0])+int(pp2[1])-int(pp1[0])-int(pp1[1]))/(_time2_-_time1_)

  57.     if RSS != rss:
  58.         zengliangrss = int(RSS)-int(rss)
  59.         rss = RSS

  60.     if VM != vm:
  61.         zengliangvm = int(VM)-int(vm)
  62.         vm = VM

  63.     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))
  64.     zengliangrss=0
  65.     zengliangvm=0
  66.    
  67.     #INFORS.append("%d-%d %d:%d:%d\t"%(mo,da,ho,mi,se)+'VM:'+VM+'\t'+str(cpuuse))
  68.     #print INFORS
  69.     if len(INFORS) >5:
  70.         writeinfos(INFORS,'%d-%d-%d_%s_logfile.txt'%(ye,mo,da,PROCESS_PID))
  71.         print 'Have writed messages'
  72.         INFORS=[]
  73.     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