Sybase自身调优
所有的数据库设备均使用direct IO。
锁级别
更改锁级别为 行锁。
alter table dbo.WFWorkItem lock datarows;
见数据库目录 表锁类型.sql。
注意,如果执行失败,可以通过更改数据库的属性来解决。
其他调优
见数据库 优化集合.sql
sp_configure "default network packet size", 10240 --默认网络包
sp_configure "max network packet size", 10240 --最大网络包
sp_configure "max memory",0,"6553M" --(设置为共享内存的75%,重启生效)
sp_configure "allocate max shared mem",1 --(启动的时候自动分配max memory指定的最大内存)
sp_cacheconfig "default data cache","3200m" --(设置数据缓存为max memory的一半)
sp_cacheconfig "default data cache","cache_partition=2" --(在SMP的环境中还有一个问题就是螺旋锁的竞争,当用sp_sysmon观察到资源缓存螺旋锁争夺超过10%时就需要分区。)
sp_poolconfig "default data cache","128m","16k" --(增加一个16K I/O缓存池,解决排序等大IO操作,需要在长期观察后才能使用性能最佳化.)
sp_configure "procedure cache size",102400 --(过程高速缓存,通常是Max mem20%,这里是200M)
sp_cacheconfig 'tempdb_cache','200m','mixed' --(创建一个200M命名高速缓存tempdb_cache给temdpb使用)
sp_bindcache 'tempdb_cache',tempdb --(将tempdb_cache绑定到tempdb)
--2、CPU(默认值为1)
--当服务器的CPU个数多于一个时,可以考虑多CPU进行并行处理。(并行查询、并行dbcc、并行建立索引、并行bcp)
--可根据实际CPU数来修改,若CPU>1时,一般设置为N-1。实际上OS会自动调度。
sp_configure "max online engines",8
sp_configure "number of engines at startup",8
sp_configure "number of worker processes",200 --(并行度*并发连接数*1.5倍)
sp_configure "max parallel degree",1 --(允许CPU并行)
--3、连接数(默认数为25,可根据应用需要来修改,连接数不宜太多
sp_configure "number of user connections",600
--4、锁
sp_configure "number of locks",100000
--5、索引对像
--数据库空闲状态下运行:sp_countmetadata "open indexes"
--正常运行时运行:sp_monitorconfig "open indexes"
--来确定一个最佳值,增加10%左右。
sp_configure "number of open indexes",20000
sp_configure "number of open objects",20000
sp_configure "number of open partitions",15000
--锁升级大小
sp_configure "page lock promotion HWM",10000
sp_configure "page lock promotion LWM",5000
sp_configure "row lock promotion HWM",10000
sp_configure "row lock promotion LWM",5000
库表调优
索引删除
删除无用索引:
在目前的用例中:
'WF_IDX_ACTINST_ACTDEFID'
'WF_IDX_ACTINST_PROCID'
'WF_IDX_H_ACTINST_ADEFID'
'WF_IDX_H_ACTINST_PROCID'
'WF_IDX_H_TRANC_PROCID'
'WF_IDX_H_TRANS_PROCID'
'WF_IDX_H_WI_ACTID'
'WF_IDX_H_WI_PROCID'
'WF_IDX_PART_GLOBALID'
'WF_IDX_PROCINST_PRODEFID'
'WF_IDX_TRANC_PROCID'
'WF_IDX_TRANS_PROCID'
'WF_IDX_WI_ACTID'
'WF_IDX_WI_PROCID'
'IDX_WFHWI_PARTIC'
'IDX_WFWI_PARTICI'
'PK_WF_H_WIParticipant'
使用最多的索引:
ObjectName,LogicalReads,PagesRead,UsedCount
'IDX_WFWI_4ABC',3018890,2000,201048
'WF_IDX_ACTINST_ACTDEFID',2562953,1010,0
'PK_WFACTIVITYINST',2543354,4,553495
'PK_WFWORKITEM',2519425,4,503057
'WF_IDX_WI_ACTID',2417832,4,0
'WF_IDX_WI_PROCID',2414082,4,0
'WF_IDX_ACTINST_PROCID',2324417,3,0
'PK_WFWIPARTICIPANT',1902591,3,301572
'IDX_WFWIPART_WIID',1714977,3,251310
'IDX_WFWI_PARTICI',1609752,457,0
其他的索引,基本可以删除,相机而删。
绑定缓存
sp_bindcache 'default data cache','bps','WFWorkItem'
sp_bindcache 'default data cache','bps','WFActivityInst'
sp_bindcache 'default data cache','bps','WFProcessInst'
sp_bindcache 'default data cache','bps','WFTransCtrl'
sp_bindcache 'default data cache','bps','ABC_LOAN_APPLY'
绑定default data cache 到 bps。这一部操作需要在master库中进行。
然后把default data cache 绑定到 对应的表。
增加索引
给wfworkItem增加索引:
USE bps
go
CREATE NONCLUSTERED INDEX IDX_LOAN_APPLY
ON dbo.ABC_LOAN_APPLY(APPLY_ID)
go
IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('dbo.ABC_LOAN_APPLY') AND name='IDX_LOAN_APPLY')
PRINT '<<< CREATED INDEX dbo.ABC_LOAN_APPLY.IDX_LOAN_APPLY >>>'
ELSE
PRINT '<<< FAILED CREATING INDEX dbo.ABC_LOAN_APPLY.IDX_LOAN_APPLY >>>'
Go
此索引为查询待办使用。
以下操作在公司内部可以在控制台安装数据库时已经ok,所以没有使用。
把temp从master中剥离出来:
tempdb数据和日志分离:
USE master
Go
DISK INIT name = 'tempdbdev01', physname = '/opt/sybase/data/tempdbdev01.dat' , size = '1G',dsync = 'false'
Go
DISK INIT name = 'tempdblogdev01', physname = '/opt/sybase/data/tempdblogdev01.dat', size = '1G',dsync = 'false'
Go
ALTER DATABASE tempdb ON tempdbdev01 = '1G' LOG ON tempdblogdev01 = '1G'
Go
USE tempdb
Go
删除tempdb上使用的master段:
EXEC sp_dropsegment 'logsegment', 'tempdb', 'master'
go
EXEC sp_dropsegment 'system', 'tempdb', 'master'
go
EXEC sp_dropsegment 'default', 'tempdb', 'master'
Go
如果已针对 tempdb 建立了设备,则只需禁用 dsyncio,但需要重新启动 Adaptive Server:
EXEC sp_deviceattr 'tempdbdev01', 'dsync', 'false'
Go
EXEC sp_deviceattr 'tempdblogdev01', 'dsync','false'
Go
上周二上午11点左右,衣风在msn上,string,有个事情需要你帮忙。我说好啊,没问题。
下午2点20,衣风同学说,回家收拾一下,晚上到北京。
于是,我在上周二晚11点20,成功的在帝都机场落地,进行了为期一周的,艰苦卓绝的斗争,和产品,和客户,和自己的斗争。最终更深入的了解了产品,挑战了客户,也挑战了自己。嗯,这种感觉挺好。
--产品--
公司的产品有没有问题,我算是比较清楚的,主要的几个开发人员,我都还算熟。并且他们给我留下了深刻的牛人的光辉形象。毕竟,出去的报告,产品第一版本的性能测试,还是走我手的。
这次没有悬念的没有挑战成功,产品本身可能有这样那样的功能性问题,性能,他还真没问题。当然,这是在硬件环境比较OK的情况下。
某次和一产品线经理喝酒,他端着杯酒,说,哥们,我需要你告诉我的是在什么情况下,我们PK必输。我当时说出了一个条件,他喝了那杯酒。看样子,我可能又找到了一个能让他再喝一杯的方法。
--性能测试--
虽然我的工作重心不是性能测试,而是通过性能测试这种手段来找到产品中的瓶颈。于是我经常这样麻醉我自己,觉得自己全方位的性能测试做的不好是可以原谅的,loadrunner这种工具不会充分使用是能理解的。
大爷的,发现自己骗自己真是容易。
此次来京测试,办公室有一个很有风度的哥们。在第一天性能测试还未开始之前,鄙人大放阕词,说本次测试的一些要求,环境的准备,我们做什么。嘿嘿,那哥们一声不吭的坐在一边。
后来当本人基本属于抓瞎的状态的时候,他的及时出手拯救了半场测试,而后来告诉我,他们一直用loadrunner8的原因,深以为然。
哥们这次回去,就去更新自己的版本,每台机器上装2个版本的loadrunner。原来loadrunner是可以监控WAS的,监控weblogic的,可以监控oracle的,可以监控sybase的,它的强大,可能超出自己的想象。
说起来,除了自己的摸索,经验的积累,让牛人始终有显摆的机会,才能学习到更多。
应该和某同学交涉下,如果他始终不教我上树的本事,以后凡是有老鼠,他还是要亲自来抓。
此次收获着实不小。
--sybase15.3--
这玩意其实挺破的,最难受的,这玩意的最新的驱动还没发布,还是局方内部的哥们拿出来的,2010年9月份编译的版本,比较抓狂的说。
不过也算知道怎么调整sybase的性能了,经验,可能就是这么磕磕碰碰出来的。
比如要把数据库文件和日志文件分开,比如对应多少内核的CPU,要启动多少数据库引擎,再比如说调整页大小,设定表的锁级别。不一而足。
--路盲--
可能在方向感上,还不如一些小P孩。但是我相信大部分方向感很好的人,都去过不少地方。
就像定位问题一样,经验决定一切。
本次的问题定位,从开始的数据库驱动,隔离级别,到数据库索引,锁级别,再到tracert查看网络跳转,到拷贝共享文件确定网络带宽,到应用服务器,http接入服务器,到loadrunner的脚本设置,结果集的分析,到性能瓶颈的定位,但回过头来看看这个故事的发展,可能其他人来做这个事情,就是比你优秀,这是为什么?
难道自己就真的不能再想的深入一点么?
开始怀疑的网络带宽问题,没有深究,导致后面测试工作的被动,还做了很多无用功。
说到底,还是没有细想产品对网络的要求,对应cpu的要求,对于内存的要求,对于磁盘的要求。
走的远了,就不会迷路了;只在一个小范围兜圈子,嗯,有鬼打墙的嫌疑,心中的鬼啊,需要自己去突破。
--岳昆--
和这哥们挺有缘分的,当时查找我们公司找到我BLOG,然后msn聊天,上次来北京的网友见面。呵,那时候说,希望有机会能尽快合作。没想到就是这么快。
我喜欢爽快的年轻人。开着狮跑,小心谨慎;和客户沟通的时候,方寸有度,琢磨着客户每一个发问的深层含义。嗯,想想在上个部门的时候,还真是差距很大。您说现在,呵,那差距更大了。
--自我挑战--
和大领导们中午电话会议,给出我们的结论。
后来调整了数据库的引擎个数,客户的平台性能翻番。心里忍不住嘀咕,反正哥们搬石头砸自己也不是第一回了,本着王八蛋的态度,在调整后的数据库上再次测试,还好,这次我没有砸住自己。
可能就要砸到其他的哥们啦。
--客户--
客户是一个很有意思的群体。
如果他们耍王八蛋,也不能讲那六个零的笑话不是?改天找个销售同学学习下。能让耍王八蛋的人变成王牛蛋,该怎么做才能有效果。
如此。
--全责心--
这几天我一直在考虑这个报告要不要出的问题。
出了报告,白纸黑字,红口白牙,肯定说不清楚的。而这报告是我出的。那么问题出来了,你要负责的把这件事情搞定,已经不可能了。客户说了,我们就这环境,你能怎么着?
那剩下的事情,就是把能做好的事情做好,这谁都能说。而如果这次测试失败,公司内部,不了解情况的,一定归罪于我,而我也自责的不行。
这就是矛盾。
是要适当的放弃一些东西才好。
梦到小学时候的班主任,咄咄逼人的问我,胖子为什么不欺负别人。我回答不出来。给吓醒,然后躺在床上,大脑一片空白。
梦到大学时候的高数老师,说,只要我带这门课,你就别打算及格。别上课了,准备重修吧。后来看到一比我更不像话的哥们给他拎了一袋东西,然后他以60.5的高分通过考试。
咄咄逼人的质问和利用手上仅有的权力给自己谋福利在我不算成熟的心中留下了深深的一笔。
上上周末kevin婚礼,在崇明。
本以为会有很多大学的同学前往,细问之,原来就邀请了我们一起患难的几个兄弟。细数下来,在易趣的Juan,在youku的aiter,在sap的willimas和区区在下。
aiter远在北京,10月在京小聚时,说可能会过来,在自我催眠的学习中,学习到的,当在自己的意识中告诉自己,我可能要去做什么事情,一般这个事情到最后就扯淡了,不会有行动。因为总有推辞,比如忙,没时间,比如时间太短了,来回的钱和呆的时间不核算。
willimas说,我知道消息太迟了,那天晚上买好了怒放的演唱会门票,要不你给我报销一半我就去参加kevin的婚礼了。大家还差不多在一起混的时候,我一直就没太懂他的思维模式,分开了一些时间,发现,差距更远了。
鄙视下自己,价值观还停留在《亮剑》的魏和尚的高度,和尚说,啥都没有情分重要。干!情分现在值几个钱,能比演唱会的门票贵么?
上周末宿舍老大生日,和applelew,liuyw去老大他家。
这厮住在装修很不错的三室两厅的房子,string,applelew都携夫人前往,liuyw目前单身。然后一坨人在那里打游戏,聊天。火锅的时候,老大给每人上了一杯酒,不再续。呵呵,这里又要开始想当年了,04年,我们一个宿舍4个人,喝了其他好几个宿舍,喝倒了好几个。我一直认为,这是我们没有机心,单纯的活着的最好表示。那如果按照我的认为,现在表示着什么?
总是各有各忙,和applelew多年弟兄,02年到现在,算下来也8年了。从09年我回上海,邀请一起打台球,总是很忙。4次能有一次应约。这也算是江总努力练习台球的原因。到后来,江总已经能在大比分上获胜了,我也觉得打的挺好,算起来,这多年的弟兄不常联系,是不是就慢慢淡了?
--------------------------------------------------------------------------------------
叔打电话过来抱怨,我堂弟不给他电话,说这个人像人间蒸发一样。我说,这个不是他一个人的问题,你们俩都有问题。就算现在,我弟就比我小两岁,我叔在他面前,也是没几句好话,全是在骂他。
一直在听翟鸿声的讲座,何为孝:犬马皆能有养,不敬,何有别乎;我在想,何为教:犬马皆能有养,不文,何有别乎?吃饱穿暖,野蛮生长的孩子啊,他们懂孝顺么?知道怎么孝顺么?
给老妈打电话着实的恭维了一把她的家教有方。想想,3岁看80,没有3岁之前老妈的那些故事,我可能都不能像我现在这样,虽然也是惨淡经营,但是如果没有那些故事,我就连惨淡经营都不够格。我很感激。
--------------------------------------------------------------------------------------
一直离一个优秀的工程师差很远,执行很难。
努力。