51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3743|回复: 4
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2012-1-11 14:50:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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_))
复制代码

评分

参与人数 1综合技术指数 +8 收起 理由
jiazurongyu + 8 8,发发,分享好

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

  • TA的每日心情

    2019-12-27 13:32
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]测试营长

    2#
    发表于 2012-1-29 00:14:13 | 只看该作者
    好分享
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3#
    发表于 2012-1-30 08:59:12 | 只看该作者
    其实nmon都能搞定了,不知道能不能写个脚本专门搞定某一些进程资源监控,这个貌似nmon也没这个功能
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4#
    发表于 2012-1-30 11:18:34 | 只看该作者
    好分享
    值得学习
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5#
     楼主| 发表于 2012-1-30 14:42:36 | 只看该作者
    脚本稍微修改就可以监测一堆进程的资源占用了,脚本只是举例利用了部分信息
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-26 14:58 , Processed in 0.071892 second(s), 28 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表