我们到达江垭小学的时候,是上午的10点多,从青山到江垭,接近1个多小时的盘山车程,公路在整修,在不太宽的公路上,司机以40迈的速度,小心的避过一些障碍,偶尔一脚刹车,考验我们的心脏承受能力。路边的风景不错,青山绿水,雾气升腾。山如斧劈,坠落而下,山脚春水环绕,镜面一般,倒影着灰黄的山壁,苍翠的山头。
江垭学校挺好,以至于到达的时候,怀疑是不是来错了地方。有一幢比较新的教学楼,有一幢比较旧的教学楼。穷的永远不是地方,穷的是个体。校长和我们说,后面的楼是香港的一个基金会捐的。校长看上去很干练,实际上也是。他已经做了2次信息筛选,筛选出来了17名学生,比较贫困。把给孩子们带的文具送到孩子们的手中,和他们一起合影,然后开始家访,分南北方向,有两辆小面包车。校长的安排很妥当,我们一行4人,分2组,一组会有一名副校长,一名教职工相陪。我和苗苗走访了6个家庭。
穷人的孩子早当家。他们每天自己走着山路到公路,然后坐车上学,一走就是十几里。甚至来说,他们的笑容带着成人的忧伤。早熟的让人觉得可怕。
穷人的孩子很难改变命运,因为穷,不管多好的成绩,总是很难接受到高等教育,然后出门打工,打工的时候认识一个差不多命运的女子或男子,然后结婚,生小孩,小孩放在老家,每个月寄一些钱回来,让自己的父母,孩子的爷爷奶奶把孩子带大,然后孩子继续重复着长辈的生活,周而复始。没有比填饱肚子更重要的事情,就算是九年义务教育也一样。如果上述的环节任意一个节点发生故障,这个孩子将面临着灭顶之灾。
走访的第一个孩子是乐乐,和爷爷奶奶一起,爷爷奶奶还要养大伯的孩子,另外一个堂兄弟。父母离异,父亲牢狱之灾。大伯母懒惰,打麻将度日,自己的孩子不管,交给爷爷奶奶。呵,就算是只畜生也会教子女谋生的本身,不是么?原谅我用这么尖锐的词语,或者真是这样,畜生一直是畜生,人有时候不是人。爷爷说着孩子他爸的牢狱之灾,哭了。听说我们能帮助乐乐完成学业,激动的要磕头。我吓的不轻,所幸搀扶住,不然我需要磕头磕回去。我想,父亲在动手和别人打架的时候,肯定想到了孩子的,只是红了眼睛后,就忘记了。
东坡家没有通电,住在一个由土砖和木头搭建起来的棚子里。屋子没有窗户,揭掉几块瓦片,用透明的塑料膜罩着,就能采光了。东坡有个姐姐在长沙上大学。父母辛勤劳作,供养一位大学生。东坡会做很多手工,会说,嗯,我觉得还行,特别淡定。会在我们进屋的时候招呼老爸说,拿橘子出来给客人吃。辛苦劳作的夫妻俩,供一个大学生负债累累,我们一直说接轨,嗯,物价接轨了,教育收费接轨了,这叫学习国际上的先进经验,待遇不接轨,教育质量不接轨,他们管这个叫国情。在贵国活了快30年,只能说,贵国的事情,我是不明白的,估计也闹不明白了。
小闯刚出生时,应该是家境还不错的,爷爷是村支书。后来母亲重病,借了很多钱也没有治好,最后西去,父亲5年前出门打工,从此杳无音信。以万恶的阴谋论分析,父亲从小挺有点官二代的感觉,大肆借贷后,还不上,只能离开家,出门打工,应该也没挣到钱,所以杳无音信。看爷爷的一脸从容的样子,嗯,老爷子挺坚强,小闯可以依靠。
美军的父亲是爷爷的养子,美军家离公路边上十几里。我问他的时候,他浅笑着说十几里。好像我们说着十几米一样。一幢没有完工的楼房,没有门,没有顶。一个木板搭建的窝棚,爷爷和奶奶年纪大了,靠每个月的120元低保生活。爷爷的床为了保温,用雨布给挡着,里面完全没有光线。父母都出门打工,杳无音信。外面的世界精彩么?孩子他爸妈,记住啊,还有一个孩子是你们带到这个世界,你们也要让他有机会,能站在外面的世界,堂堂正正的有一份工作,才能养老送终。
励晴和妈妈住在一个遭遇了山体滑坡的危房里,墙上最大的裂缝有10公分。姐姐在上高中。还是那个问题,贵国的事情,我是弄不懂了。我只好自己去适应。我在想,物价上涨的速度远远高于农民工的待遇上涨速度。怎么连普通家庭都贫困成这样了?那只要想改变命运的农村的娃就必须经过这一劫,那信奉读书改变命运跳出农门的农村子弟,是不是就差陈胜吴广了?让一部分人先富起来,然后让那些农村的娃自生自灭,用计划生育和变态的婚嫁观念让他们在100年内消亡殆尽。最后实现了共同富裕。嗯,这个解释比较合理。
小方华家住在谷底,很深,因为父母身体不好,而梯田均在谷底,为了看护庄稼方便,于是把房子建在谷底,父亲胳膊受伤,母亲腿脚不好,小方华回家了第一件事就是写作业。我没有什么好评价的,因为现实就是这样,努力学习,不是为了中华崛起,只是为了把房子搬到高一点的地方,然后有一个宽敞明亮的屋子,让父母生活了的好一点,只是如此。
家访后我更新了一条微博:我们来做这些事情,不是为了收获感激,他人的敬佩。我们只是想在适当的时候,做一些适当的事情,而这些事情很凑巧的帮助孩子们解决了一些问题,那些被帮助的孩子能把这个好传统传承下去,这样就挺好。想想吧,不到1w就能帮助一个小孩子从小学到初中毕业,持续九年。 而对一些人来说,半个包包而已。或者这就是所谓的城乡区别?我们很难想象,一家人靠着一百多块就能过一个月,会怎么过下去。那些外出打工,杳无音信的父母们,那些打麻将度日的父母们,那些父母官们,他们能想象吗?或者就是他们忘记了吧。
我们来解2个字:
责,上青头,做青春解,做岁月解;下贝,做钱解,做贵重物品解。青头说,需要付出青春,贝说,需要付出钱,当然,时间也是自己的宝贵物品。
任,人旁,壬体,壬是任的初文,甲骨文字形,壬即担荷的担子的竖立形。本义:挑担;荷;肩负,即为承担。从人旁,做担子,行李解。
社会应该承担的责任,他承担了么?是什么造就了留守的孩子,单亲的孩子,和父母俱在身边的孩子会有明显的差别?
不是为了批评什么,因为批评不能改变任何一点现状。只是忘记责任,逃避责任的父母,还有我们的父母官,是孩子们的灾难。
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聊天,上次来北京的网友见面。呵,那时候说,希望有机会能尽快合作。没想到就是这么快。
我喜欢爽快的年轻人。开着狮跑,小心谨慎;和客户沟通的时候,方寸有度,琢磨着客户每一个发问的深层含义。嗯,想想在上个部门的时候,还真是差距很大。您说现在,呵,那差距更大了。
--自我挑战--
和大领导们中午电话会议,给出我们的结论。
后来调整了数据库的引擎个数,客户的平台性能翻番。心里忍不住嘀咕,反正哥们搬石头砸自己也不是第一回了,本着王八蛋的态度,在调整后的数据库上再次测试,还好,这次我没有砸住自己。
可能就要砸到其他的哥们啦。
--客户--
客户是一个很有意思的群体。
如果他们耍王八蛋,也不能讲那六个零的笑话不是?改天找个销售同学学习下。能让耍王八蛋的人变成王牛蛋,该怎么做才能有效果。
如此。
--全责心--
这几天我一直在考虑这个报告要不要出的问题。
出了报告,白纸黑字,红口白牙,肯定说不清楚的。而这报告是我出的。那么问题出来了,你要负责的把这件事情搞定,已经不可能了。客户说了,我们就这环境,你能怎么着?
那剩下的事情,就是把能做好的事情做好,这谁都能说。而如果这次测试失败,公司内部,不了解情况的,一定归罪于我,而我也自责的不行。
这就是矛盾。
是要适当的放弃一些东西才好。