设为首页 收藏本站
查看: 824|回复: 0

[经验分享] 一个很简单测试oracle压力方法(有更新)

[复制链接]

尚未签到

发表于 2016-8-4 08:26:46 | 显示全部楼层 |阅读模式
今天做了一个简单的测试数据库压力,把东西分享了一下。
  服务器情况:
  

操作系统版本:CentOS 5.6 -64
cpu:Intel(R) Xeon(R) CPU X5660 @ 2.80GHz * 24
内存:Mem: 16425876
Swap: 32764556
数据库版本:oracle10gR2
  节点个数:2

  

测试方法如下:通过awr找出测试系统里面消耗比较多sql(可以是IO或者是执行时间)
使用python写了如下脚本

  
#! /usr/bin/python#coding=UTF-8import cx_Oracleimport timedef hello():'''Hello cx_Oracle示例:1)打印数据库版本信息.2)查询表数据.'''conn = cx_Oracle.connect("jscn/jscn@192.168.100.199:1521/jscn")cur = conn.cursor()try:print "Oracle Version:%s" % conn.versionprint "Table SUB_POLICY rows:"interger = 1while interger <= 30000000:sql="select * from product PRODUCT_ID= '0lea940'"sql1="select * from productcategory  where CATEGORY_ID='xhn6238'"cur.execute(sql)for row in cur:print rowtime.sleep(1)cur.execute(sql1)for row in cur:print rowtime.sleep(10)                interger = interger + 1finally:cur.close()conn.close()hello()
  
这里要首先安装好python和cx_Oracle,关于如何安装这两个软件,可以自己百度,过几天我把我的安装方法写上去。
让我么简单看看这个python脚本,如果童鞋们要用这个脚本,只要修改连接串和sql部分就可以了,在这个脚本里面,首先执行"sql",然后休息1秒钟,再执行"sql1"部分,再休息10,这个就是一个循环,一共循环30000000次。
友情提醒一下python对空格特别敏感,复制的时候要小心了。
如果只是简单执行这一个脚本,那叫什么压力测试呢,这个时候要请其他童鞋协助了,在dos下执行如下命令,win7下面最好使用管理员用户执行。

--切换到脚本所在的目录,执行以下命令for /L %i in (1,1,50) do start "test %i" python test.py
这个脚本是把这个test.py执行开50个窗口执行。
如果想停止,可以执行以下命令
taskkill /im python.exe
现在让我们来看一下数据库的性能,
1、查看节点的连接数,到两个节点上面分别查看数据库的连接数
登录到第一个节点,查看python连接数
SQL> select count(*) from v$session where program='python.exe' ;

COUNT(*)
----------
24
登录到第二个节点,查看python连接数
SQL> select count(*) from v$session where program='python.exe' ;

COUNT(*)
----------
26
查看总的连接数
SQL> select count(*) from gv$session where program='python.exe' ;

COUNT(*)
----------
50

2、查看每个用户的pga分配大小
Select spid ,Value / 1024 / 1024 MbFrom V$session s, V$sesstat St, V$statname Sn, V$process pWhere St.Sid = s.SidAnd St.Statistic# = Sn.Statistic#And Sn.Name Like 'session pga memory'And p.Addr = s.Paddr and s.program='python.exe'  Order By Value Desc;
SPID MB
------------ ----------
1936 0.73026275
1906 0.73026275
1955 0.73026275
1940 0.73026275
1953 0.73026275
1946 0.73026275
1934 0.73026275
1942 0.73026275
1972 0.73026275
1959 0.73026275
1900 0.73026275
1961 0.73026275
1970 0.73026275
1968 0.73026275
1957 0.73026275
1902 0.73026275
1904 0.73026275
1919 0.73026275
1938 0.73026275
1923 0.73026275

SPID MB
------------ ----------
1921 0.73026275
1925 0.73026275
1917 0.73026275
1910 0.73026275
1908 0.73026275
1927 0.73026275
这里0.73026275*用户数<pga的大小。

3、查看数据库服务器每个spid对应的内存使用情况(下面举例说明)
[oracle@rac2 ~]$ top -p 1936,1906,1955,1940
top - 19:30:49 up 11 days, 9:24, 1 user, load average: 0.08, 0.08, 0.03
Tasks: 4 total, 0 running, 4 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3%us, 0.1%sy, 0.0%ni, 99.6%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16425876k total, 6192932k used, 10232944k free, 422484k buffers
Swap: 32764556k total, 344k used, 32764212k free, 3581576k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1936 oracle 15 0 1681m 26m 22m S 0.0 0.2 0:00.13 oracle
1906 oracle 15 0 1681m 26m 22m S 0.0 0.2 0:00.14 oracle
1955 oracle 15 0 1681m 26m 22m S 0.0 0.2 0:00.12 oracle
1940 oracle 15 0 1681m 26m 22m S 0.0 0.2 0:00.15 oracle

这里 RES的值*个数<总内存。

  呵呵,结束了,简单吧。
  

  新的补充

  今天把python脚本补充一下,之前一个进程一个连接,那我要测1000个连接,不是要启动1000进程吗?这样太恐怖了,是不要要多线程呢?当然要了,我们在更新一个python代码
  #! /usr/bin/python#coding=UTF-8import cx_Oracleimport timeimport sysimport loggingimport logging.configimport threadingfrom optparse import OptionParserdef hello():'''Hello cx_Oracle示例:1)打印数据库版本信息.2)查询表数据.'''conn = cx_Oracle.connect("jscn/jscn@192.168.100.199:1521/jscn")cur = conn.cursor()try:print "Oracle Version:%s" % conn.versionprint "Table SUB_POLICY rows:"interger = 1while interger <= 30000000:sql="select * from product PRODUCT_ID= '0lea940'"sql1="select * from productcategory  where CATEGORY_ID='xhn6238'"cur.execute(sql)for row in cur:print rowtime.sleep(1)cur.execute(sql1)for row in cur:print rowtime.sleep(10)                interger = interger + 1finally:cur.close()conn.close()def _handleCmdLine(args):parser = OptionParser()parser.add_option("--threadnum", dest="threadnum",action="store",  type="int", default=10,help="thread num")(options, args) = parser.parse_args(args)return (options,args)class TestThread(threading.Thread):def run(self):while True:hello()def main():options,args=_handleCmdLine(sys.argv)threads=[]for i in range(options.threadnum):th=TestThread()threads.append(th)th.setDaemon(True)th.start()for t in threads:t.join()if __name__ == '__main__':#logging.exception("main except")try:main()except Exception:logging.exception("main except")


如何执行呢?比如我们把脚本叫test.py  
  在dos界面输入:
  
C:\Users\jscn-xw\Desktop>python test.py -hUsage: test.py [options]Options:-h, --help            show this help message and exit--threadnum=THREADNUMthread num
比如我们要输入进程为300个  
  C:\Users\jscn-xw\Desktop>python test.py --threadnum=300
  现在已经进程就可以跑300个连接了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-252499-1-1.html 上篇帖子: 实战经验Oracle数据库基本操作步步详解 下篇帖子: 理解Oracle数据库的启动和关闭
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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