存档

作者存档

人生的必经之路

2012年1月11日 hashei 1 条评论

今天看了《那些年,我们一起追女孩》,趁着“余音绕梁”,记录一下观后感。

故事梗概不用再复述,剧情其实很简单,就是九把刀的个人自传,但是一个自传能引起观众的共鸣并叫好——至少我是——是因为他拍出了那些年,我们都曾有过的青春岁月。

开头的一段,柯景腾被安排坐在沈佳宜前接受“帮教”,这个情节大陆学生也都经历过。不过因为初中阶段我还算一个好学生,属于被老师安排帮教别人的那部分,所以这一段倒也没有什么大的感触。最初产生共鸣的,是沈佳宜扎了马尾辫走过操场,五个男生都觉得沈佳宜对自己有意思的感叹这一情节。虽然有故意制造喜剧的因素在内,但耳边却响起了这么一段歌词“为什么我总觉得你好像其实在注视着我”,明明自己喜欢别人,却觉得别人的一言一行其实是为你做的,这事儿,有过经历的人怕不难体会。之后接着黄舒骏的一首《恋爱症候群》听的人不由会心一笑。

  • 一般发病後的初期反应会开始改变一些生活习性
  • 洗澡洗得特别乾净 刷牙刷得特别用力 半夜突然爬起来弹钢琴
  • 有人每天站在阳台对路人傻笑 有人突然疯疯癫癫 突然很安静
  • 有人一脸痴呆 对着镜子咬着指甲打喷嚏 有人对着小狗骂三字经
  • 女人突然改变发型 男人开始每天练着哑铃
  • 食欲不振歇斯底里四肢萎缩神经过敏发抖抽筋都出现在这时期
  • 如果在这里结束,两人走在一起的话就是童话般美好的故事了,不过这是一篇自传,就注定不会那么一帆风顺。表白未遂的那一段,我觉得很真实。男生平时大大咧咧,脑袋大条一点多的是,可是在喜欢的人面前总是会很敏感“爱一个人常常很小心,仿佛手中捧着水晶”。所以沈佳宜说出“其实我没你想的那么好,也许你只是喜欢想象的我,你好好想想到底喜不喜欢我,都没有好好考虑就回答”的时候,柯景腾疑惑了,“明明站在你的面前,还是害怕这是一场梦”。在戏外的我们心里都在说好傻,这连考验都算不上,就是个试探,抑或说是欲迎还拒。可是那时候的男生哪知道这时要跟上“我喜欢的不是完美的你,而是在家邋遢、有起床气的真实的你”。

    因为彼此都是第一次,所以他们的感情在第一次遇到矛盾的时候就断了,不是心灰意冷的破灭,而是硬生生的断开了。沈佳宜在雨里哭骂大笨蛋的时候,你我都知道“大笨蛋”指的什么,但是自尊心受到打击的柯景腾那时以为的是比幼稚更重的伤害。第一次恋爱是单纯的,所以过于脆弱,没有经历住风雨。沈佳宜和阿和在奶茶店,看到一对闹矛盾的情侣最终拥抱在一起的时候,脸上露出的笑容有羡慕,也有祝福。而柯景腾当然也不会忘了沈佳宜,所以台湾921大地震,第一个想到的就是打给她,当然这时候两人之间更多的是友谊。

    婚礼上,柯景腾心里说出“看到喜欢的女生有人疼爱,心里会是真正的祝福”,故事在这里结束那也算是一个happy ending。可惜导演要把最残酷的一面放给你们看,“如果柯景腾向我表白,我会很高兴的”,“好,在一起”。这两句话不知道看得多少男生会肝肠寸断,心痛不已。所以在平行的另一个世界中,柯景腾蹲在沈佳宜面前,向她道歉“对不起,是我太幼稚了”,地震的时候沈佳宜也在焦急的搜索信号,婚礼上深情相拥的是他们俩,可惜现实不是。

    历史是由一连串的偶然事件组成,这些偶然最后形成一个结果,像蝴蝶扇动的翅膀,这些无法确定的因素共同导致一个结果。无所谓对错,发生了的都叫做必然。而过程当中,任何一项的改变,都可能形成别样的结局。所以初恋失败的人不必痛苦,因为获得了人生中最纯真的经历。而再次投入感情的男女也不用怀疑对方的体贴,动听的话是不是锻炼出来的花言巧语,这是在体会了失去的痛苦后,为了不失去现在的你而做出的改变。联想起前几天看的《失恋33天》,黄小仙说她知道了,她的任性,嘴如尖刀不饶人破坏了陆涛心中的美好形象,以后再也不会了。这种改变应该就是恋爱所得到的经验吧。

    最后从我个人的角度说一下柯景腾那场格斗比赛的意义。从进化心理学的角度分析,一场战斗,是男性的本能,竞争、追求层级。好莱坞的电影中,有多少是关于拳击的?《愤怒的公牛》、《洛奇》、《搏击俱乐部》,女生也许对这项运动无感,但男生肯定是热血沸腾的。从文艺的角度分析,这场战斗是柯景腾实现自己从小的梦想,在心爱的人面前把纸上的李小龙真真切切付诸现实,是一场宣告男孩进化成男人的仪式。所以他说这是对于他十分重要的东西,不过可惜的是仅仅对于他而言。

    分类: 生活感想 标签: ,

    tuxedo11g MP 模式配置

    2011年12月4日 hashei 2 条评论

    随着一些项目对实时交易处理量和响应时间的要求较高,最近两月接触了交易中间件的安装配置。上一会写了CICS的相关内容,这次整理一下oracle tuxedo的内容。tuxedo 11g在系统架构和基础配置文件上和之前的版本没什么区别。下文内容为整理而得,较中文网络其它的文章,多了多域间网关对的配置,这一点在MP模式下还是较为有用的。

    Tuxedo架构图

    tuxedo架构图

    说明:域(DOMAIN)

    域是具有相同功能或结构的应用系统的集合。应用系统可以有多台服务器组成。Tuxedo的域特性把客户/服务器模型扩展到多个独立自治的应用系统。一个域既可以是一组Tuxedo的应用程序,也可以是一组运行在另一个非Tuxedo环境中的应用程序。Tuxedo的每个域独立完成域内的操作,域间操作由域网关完成。

    比较重要的进程为

    1、BBL(Bulletin Board Liaison),主要对公告板等进行管理,包含了一个公告牌的本地拷贝和本地服务器上应用的状态。

    Bulletin Board(BB,公告板):Tuxedo把系统的配置信息保存在一个共享内存中,该共享内存称为公告板。

    2、DBBL(Distinguished Bulletin Board Liaison),TUXEDO用于多服务器配置各个服务器之间的协调工作,只有当TUXEDO配置为MP方式时才需要用到DBBL。DBBL与BBL协同,保证所有的公告牌内容的一致性。

    3、WSL:WorkStation Listener,Tuxedo系统自带的一个Server,它侦听一个指定的端口,WSC最初与该Server建立连接。

    4、WSH:WorkStation Handler Server ,Tuxedo系统自带的一个Server,由它处理WSC与Tuxedo Server之间的通信。

    5、BRIDGE,不同的服务器之间通过BRIDGE进程进行通讯,该BRIDGE的侦听IP地址及端口 在NADDR中指定。如果是在UNIX下要指定该BRIDGE所用的网络设备,如果是在NT下则不要。

    6、DMADM,域间通信的进程:管理域的server,在运行时管理BDMCONFIG,对已登记的gateway group提供支持,在tuxedo系统中,只能有一个DMADM进程,且不能对它采用MSSQ,不能有REPLYQ

    7、GWADM,管理DOMAIN的域网关进程(在/DOMAIN中是GWTDOMAIN)的SERVER,在运行时可以对某一组域网关(Domain Gateway Group)进行管理。主要从DMADM那里取得域的配置信息,并对域网管进程及跨越域的全局事务的LOG文件进行管理

    8、GWTDOMAIN,处理DOMAIN之间的互操作,使本地域和调用远程域可以互相调用彼此的service,其中GMADM和GWTDOMAIN必须在一个组中,一个tuxedo应用可以有多个GWADM,GWTDOMAIN对,一个组只能有一个GMADM,GWTDOMAIN对,但一个tuxedo应用只能有一个DMADM, DMADM可以在任何一个组中,一个本地域可以和多个远程域实现互操作。

    9、tlisten,是TUXEDO自带的管理程序,在MP模式下,完成主机之间的初始化通讯,如非MASTER机从MASTER机中下载tuxconfig配置文件。

    tlisten的启动办法:tlisten –l //NLSADDR

    以上几点概念清楚后,就可以尝试配置一个简单的tuxedo环境了。

    阅读全文…

    分类: tuxedo 标签:

    理智与情感(一)

    2011年11月14日 hashei 1 条评论

    这个月更新的文章还不少,不过第一篇是10年,这两篇是11年,希望下一篇不要是在方舟上更新的。

    我标题写《理智与情感》,当然不是要向Jane Austen叫板,而是最近几年的人生经历让我感悟到:我们人生所有的烦恼乃至痛苦,都来自于一种矛盾——在需要理智的时候感性,而在需要情感的时候却理性过度。

    首先澄清一点,本人85年生,写人生感悟并不是因为老气横秋,而是因为直到暮年才有自己的心得或许对得起子孙,却断然对不住自己。而他人只能给一些客套的赞美与廉价的鼓励,与大多数困难障碍相比,它们都更加凶险。所以我要在年轻的时候给自己定一个准则,哪怕选了一条充满荆棘的路,也好过原地兜圈子。

    在做一些影响久远的决策前,我们总是显得轻率。我在之前的一篇博客里提到过,我们选择专业、选择职业,很大程度上受当时社会潮流的影响,为了“从这5年后,当你看到你的朋友买车买房时不会诅咒自己。”。可是拉长到几十年来看,一时的潮流犹如昙花一现。上世纪六七十年代工人最光荣,哪想九十年代成了需要哪里跌倒哪里站起的一批人。八十年代改革春风带起的个体户、乡镇经济,九十年代在港商台商和私营经济的冲击之下,每况愈下,纷纷破产。而那时风光的私营企业,如今不得不面对日益沉重的税收和垄断国企的咄咄逼进。现在毕业生挤破头都想进去的公务员,我小时候看的《故事会》里,总要面对工资打白条的窘境。如果说之前的时代是因为缺乏选择,所以一辈人不得不荣辱与共,那么现在这个选择多元化的日子里,选择一个适合自己的工作就很必要了。而这个需要理智思考的过程,却退位让给了感性选择。

    当今年轻人,除了工作,关心的话题之一必然有房产。无房不成家也好,有房只不过是七十年的租期也罢,你不想关心这个话题,父母、朋友、新闻会把你硬拽进来,最近因为房价下跌而砸开发商售楼部的报道可谓一场悲喜剧。不过这个问题,经历过大风大浪的美国人早就总结给你了——房产买好了是资产,买遭了是负债。就近的香港市场来说,也已历经三次大起大落。所以除非你富二代,除非你是颜回能居陋巷而不改其乐,用房产让自己财富增长是个跨越不过去的难题。可是有多少姻缘因为房产的原因而拆散,又有多少夫妻在坚硬的钢筋水泥的城市里扎不下根来?这是理性让位感性的第二个例子。

    第三个例子,是父母一辈时常叮嘱的“莫谈国事”,可是梁漱溟老生前曾说“中国人是公事没人管,私事人人都来管。只有不知自己自由的人,才会不知道尊重别人的自由;只有不知自己的自由也不知别人自由的人,才会完全冷漠于公干,热衷于私涉。大多数人都懂得并珍视自己的自由时,一个社会才会有宪政制度,有民主政治,有自由与共和精神。”现在网上种种恶性事件,你不去关心,将来总会落到你身边,丧钟是为你我而鸣。但是如何关心又是个大问题,是像《乌合之众》里描写的大众的非理性幻想和群众性癫狂那样,还是独立于大众之外,基于批判性思维来理解和分析?“思想因浅薄而确定,确定导致了专制;思想因深刻而怀疑,怀疑导致了民主”,可惜我也时常因为冲动而放弃了怀疑精神,以致事后看来像个大傻瓜。

    说到冲动,那我时常又嫌自己做的不够,总是差一点不反顾的勇气,让我始终做不成想做的那个自己。面对生活和感情,总是用过于理智的声音来为自己的不作为而开脱。诚然感情不是一帆风顺的,但是担心未曾发生的事不得不令人怀疑是性格悲观还是缺乏自信了。这是感性让位理性的例子。

    如上种种的左右大脑错位,导致了生活中的迷茫、困惑,又进而衍生出了不安全感。所谓不安全感,在我看来就是缺乏确定性。我们在一个陌生的地点,不知道这是哪里、举目无亲、不知道怎么回到自己熟悉的地方,会十分害怕。同理在人生的道路上,不知道过去的日子是怎么过去的,不知道现在在做什么,不清楚将来会怎么样,就产生了极大的不安全感。

    以上唠叨了那么多是为什么要写《理智与情感》,对这些问题的解答其实很简单,要找到自己的准则,也就是形成自己的人生观、价值观。你肯定想这不是说了等于没说么?我们成长过程中确实是会灌很多心灵鸡汤,学校、家庭也灌输了很多,但是这些都没有经过自己的思考,有些还是互相矛盾的,有些知道不错但做起来十分痛苦。所以唯有坦然的面对自己,和心灵对话,找到适合自己的,逻辑自洽的三观。

    这个话题会是一个长篇,接下来几篇会详细写写我总结的思考。这篇的最后附上雨果的一段话,也是我所希望达到的境界:生活,就是理解。生活,就是面对现实微笑,就是越过障碍注视将来。生活,就是自身有一架天平,在那上面衡量善恶。生活,就是有正义感,有真理,有理智,就是忠矢不渝、诚实不欺、表里如一、心智纯正、并对权利义务同等重视。生活,就是知道自己的价值、自己所能做到的与自己应该做到的。

    分类: 生活感想 标签:

    CICS7.1安装与配置步骤

    2011年11月13日 hashei 1 条评论

    今年国庆扬州之行在AIX6上安装CICS7.1,耗费一周精力仍旧错误百出,最后依靠这篇步骤完成成功。贴出来让有需要的人也少走弯路吧

    1. 安装环境

    主机:

    操作系统:AIX6100-06-01-1043,使用异步IO(无需设定,系统自动)

    数据库:Oracle11.2.0.2(单机版本),安装constant client 32bit(复制为lib32目录)

    编译器:XLC10.1

    2. 创建cics、cicsterm和cicssm组,创建cics用户和cicssm用户添加至cics(primary group)、cicsterm和cicssm组,采用本地认证,Soft FILE size核soft CORE file size的参数值设置-1(unlimited)。

    3. 如果数据库是Oracle10.2.0.1,则执行这个步骤:将root用户和cics用户添加到dba组。Oracle10.2.0.1安装完成后安装目录下的子目录的属性大都为750,库文件属性为640,导致cics用户无法访问Oracle的库文件。并且这些目录文件的属性和用户的umask设置没有关系。

    4. 创建/var/cics_servers、/var/cics_regions文件系统并且mount,修改属性为cics:cics。

    5. 将root添加至cics与cicsterm组并且是组的管理员,并将环境变量加入其profile文件(程序安装时自动添加到/etc/profile文件)。

    export LANG=en_US

    export PATH=$PATH:/usr/lpp/cics/bin:/usr/lpp/cicssm/bin

    export LIBPATH=$LIBPATH:/usr/lpp/cics/lib:/usr/lpp/cicssm/lib

    export NLSPATH=/usr/lpp/cics/msg/%L/%N:/usr/lpp/cics/msg/C/%N:/usr/lpp/cicssm/msg/en_US/%N:/usr/lib/nls/msg/%L/%N

    6. 安装gsk(在CICS光盘的/gskit/gskta.rte)

    7. 安装CICS,执行./TXSeriesV71-AIX.bin -i console

    ü 选择安装时的语言环境

    ü “产品简介”

    ü 如果已经安装了6.X版本,确认升级到7.1版本

    ü 接受软件协议,开始安装。确认/usr文件系统有足够的空间

    ü 安装完成后可以选择察看“安装选择摘要”,确认安装

    ü 安装完成后,可以选择察看readme文件以及安装日志(install_location/logs)。如果安装失败,在/tmp中创建日志文件

    ü 不创建缺省的CICS region以及SFS server

    8. 安装CICS7.1.0.2升级补丁,方法和安装CICS7.1类似。

    9. 创建SFS_SERV用户,并添加至cics、cicsterm和cicssm组。这个用户名称是系统保留的SFS服务器的short name,SFS服务器根据short name名称定位使用的SFS存储。

    10. 创建sfs_SFS_SERV与log_SFS_SERV逻辑卷(注:SFS服务器数据卷与日志卷名的格式为sfs_sfsUserName、log_ sfsUserName,其中sfsUserName为前面步骤创建的用户名),并输入chown SFS_SERV:cics /dev/*sfs_SFS_SERV /dev/*log_SFS_SERV命令更改其属主。sfs_sfsUserName和log_ sfsUserName大小为1G。

    11. 输入/usr/lpp/cics/bin/cicsdefaultservers命令自动创建缺省的SFS服务器资源定义文件。

    12. 输入cicssfscreate -v /.:/cics/sfs/sfsServerName,并将前面步骤创建的SFS_SERV用户的Home目录更改为/var/cics_servers/SSD/cics/sfs/sfsServerName,其中sfsServerName为本步中所创建的SFS服务器名。

    13. 输入/usr/lpp/cics/bin/cicssfs –v /.:/cics/sfs/sfsServerName StartType=cold命令冷启动SFS Server,并输入/usr/lpp/cics/bin/sfsadmin list lvols -server /.:/cics/sfs/sfsServerName命令来验证SFS Server是否已正确启动。如果SFS Server正常运行,那么命令输出将显示为SFS创建的数据卷的名称。如果要重建SFS Server,先停止原来的服务再删除。冷启动SFS会消除在SFS数据逻辑卷上的文件。

    14. 通过cicsdefault -r cicsRegionName命令创建CICS Region。如果是重建的话,首先通过ps –ef | grep cics找到所有的遗留进程,杀死这些遗留进程后再执行。

    15. 输入/usr/lpp/cics/bin/cicsupdate -c rd -r cicsRegionName DefaultFileServer=/.:/cics/sfs/sfsServerName命令,将CICS Region的 DefaultFileServer 属性更改为 SFS Server的全限定名。

    16. 输入cicsadd –c ld –r cicsRegionName LDName TCPService=’serviceNa命令添加配置一个新的LD,并在/etc/services文件中增加相应servieName的设置,只要增加TCP端口,缺省为1435。

    17. 创建Switch Load File,配置XAD,连接数据库。

    ü 保证已安装支持版本的C编译器

    ü 保证已安装Oracle客户端与proc编译器

    ü 保证操作系统中已设置ORACLE_HOME(对应于本地客户端软件)环境变量的值,并已完成TNS的配置,可通过sqlplus连接至Oracle数据库;

    ü 将/usr/lpp/cics/examples/RM_support/Oracle下的oracle1pc.pc与oracle1pc.mk文件复制至/var/cics_regions/cicsRegionName/bin目录下;

    ü 在该目录下根据Oracle版本通过make –f oracle1pc.mk oracleversion命令生成和数据库的链接程序(Swith Load File)——oracle1pc。

    ü 输入cicsadd –c xad –r cicsRegionName XADName SwitchLoadFile=’fileName’ XAOpen=’Oracle_XA+Acc=P/oracleUserName/oracleUserPassword+SqlNet=oracleTNSName+SesTm=35+LogDir=/tmp+DbgFl=1’命令添加配置一个新的XAD。

    ü 赋予用户权限,grant select on dba_pending_transactions to oracleUserName;

    18. 在/var/cics_regions/cicsRegionName/environment文件中,根据数据库的配置情况设置ORACLE_SID(对应于目标数据库)、ORACLE_HOME(对应于本地客户端软件)、NLS_LANG环境变量的值,也可以设置CICS_XP_RECV_TIMEOUT的值。

    19. 通过/usr/lpp/cics/bin/cicscp –v start region cicsRegionName StartType=cold命令冷启动Region,并通过/usr/lpp/cics/bin/cicstail –r cicsRegionName命令来验证CICS是否已成功启动。

    20. 一些命令

    mkgroup -’A’ id=’400′ cics

    mkgroup -’A’ id=’401′ cicsterm

    mkgroup -’A’ id=’402′ cicssm

    mkuser id=’400′ pgrp=’cics’ groups=’cicsterm,cicssm’ cics

    mkuser id=’401′ pgrp=’cics’ groups=’cicsterm,cicssm’ cicssm

    chuser fsize=’-1′ core=’-1′ cics

    chuser fsize=’-1′ core=’-1′ cicssm

    chgroup users=’oracle,root,cics’ dba

    mklv -t jfs2 -y lvcicssfs -c 2 rootvg 8

    mklv -t jfs2 -y lvcicsreg -c 2 rootvg 8

    crfs -v jfs2 -d’lvcicssfs’ -m’/var/cics_servers’ -A yes -p rw -a agblksize=’4096′

    crfs -v jfs2 -d’lvcicsreg’ -m’/var/cics_regions’ -A yes -p rw -a agblksize=’4096′

    mount /var/cics_servers

    mount /var/cics_regions

    df -k

    chown cics:cics /var/cics_servers

    chown cics:cics /var/cics_regions

    chgroup users=’cics,cicssm,root’ cics

    chgroup users=’cics,cicssm,root’ cicsterm

    export LANG=en_US

    export PATH=$PATH:/usr/lpp/cics/bin:/usr/lpp/cicssm/bin

    export LIBPATH=$LIBPATH:/usr/lpp/cics/lib:/usr/lpp/cicssm/lib

    export NLSPATH=/usr/lpp/cics/msg/%L/%N:/usr/lpp/cics/msg/C/%N:/usr/lpp/cicssm/msg/en_US/%N:/usr/lib/nls/msg/%L/%N

    export PATH=$PATH:/usr/vac/bin:/usr/vacpp/bin

    mkuser id=’402′ pgrp=’cics’ groups=’cicsterm,cicssm’ SFS_SERV

    mklv -t raw -y sfs_SFS_SERV -c 2 rootvg 8

    mklv -t raw -y log_SFS_SERV -c 2 rootvg 8

    chown SFS_SERV:cics /dev/*sfs_SFS_SERV /dev/*log_SFS_SERV

    /usr/lpp/cics/bin/cicsdefaultservers

    cicssfscreate -v /.:/cics/sfs/sfsServerName

    chuser home=’/var/cics_servers/SSD/cics/sfs/sfsServerName‘ SFS_SERV

    chown SFS_SERV:cics /var/cics_servers/SSD/cics/sfs/sfsServerName

    /usr/lpp/cics/bin/cicssfs -v /.:/cics/sfs/sfsServerName StartType=cold

    /usr/lpp/encina/bin/sfsadmin list lvols -server /.:/cics/sfs/sfsServerName

    cicsdefault -r test

    cicsupdate -c rd -r test DefaultFileServer=/.:/cics/sfs/sfsServerName

    cicsadd -c ld -r test ldtest TCPService=’ldtest’

    分类: CICS 标签:

    Stay hungry,Stay foolish

    2010年7月18日 hashei 4 条评论

    好久没有更新,离上一篇日志已经2月了,头一个月在专注于复习在职研究生的期末考试,后一月则出差外加偷懒。对留言里提问题的、请求帮忙的朋友说声抱歉了,看来人一旦没有了压力,大脑里的懒惰小人就一定会占到上风。就连写这篇文章,也夹杂着看了《海贼王》第十部剧场版、《lie to me》第15级、常去的博客逛了一圈、开心网转了N个帖子。

    到7月22日,我工作就将整三年。刚工作的时候,都是和Windows AD域、DNS、Exchange、WSUS打交道,感觉熟悉了MCSE的内容,就能解决工作中80%的问题,所以常常不思长进。后来转而学习中间件,用了大半年的时间知道了安装、部署、调优和troubleshooting,每天不紧不慢的看看红皮书、逛逛论坛、做做实验,日子也没什么紧迫感。直到在google reader上订阅了许多牛人的博客,才知道日子混的太多了。

    比如回忆未来——张宴,和我同龄,经济与贸易专业,却已是金山的系统架构师技术——支持部平台组组长,并出了一本《实战Nginx:取代Apache的高性能Web服务器》,一篇Nginx+ PHP(FastCGI)搭建胜过Apache十倍的Web服务器成为各大linux论坛都转载的文章。

    天分高?未必,《我是一只IT小小鸟》里没有一个天才的故事,都是我们可以“复制”的经历。唯一的区别,就是他们做到了。豆瓣上的这篇书评我深表赞同。

          这些优秀的人的一些共同特质:

    1) <读书> 他们都是在学生时代读了很多优秀的书,不管是囫囵吞枣型,还是精读的,大量的读书才有了后来质的飞跃。
    2) <兴趣> 兴趣是最好的老师,这句话深有体会,真是兴趣的驱使,才能发挥一个人最大的潜能。
    3) <专注> 有了兴趣这一强大的推动力,在加上专注这颗金刚钻,再难的瓷器活都可以做到至善至美。
    4) <思考> 他们不论是思考技术问题,还是在人生的方向的把握的思考,都独具深度。
    5) <积累> 他们注重知识很经验的积累,量变导致质变。
    6) <交流> 如果说读书是自我学习实现腾飞的一只翅膀,那么与优秀的人的交流是提升自我的另外一只翅膀。
    7) <分享> 分享是一种突破,没有有效的积淀,就不容易产生有价值的分享。当在前期从周围的环境、资源中不断获取之后提升了自己,这时候就是你该分享你的经验,回报这个环境的时候了。

    于是接下来的日子一直在慢慢督促自己学习这些人。其实我是很幸运的,从事的工作一是适合自己,二也是充满挑战性的,学习的空间很大,而不会是可悲的“虽说有5年工作经验,其实是1年的工作经验然后重复5次”。

    自从接触中间件,然后又做系统验收前的压力测试,不得不学习linux/unix下性能监控和调优的技术,于是看了《linux服务器性能调整》。压力测试结果不满意,于是看了《构建高性能Web站点》,通过动静分离,至少从前端的角度,尽可能的提升页面展示速度。公网上部署应用,也就有了安全的需求,selinux的原理与配置、log日志的审查,渗透与反渗透的技术也就不得不掌握。运营之后的报告,也提出了监控服务器、分析应用日志的要求,shell编程、sed和awk也不得不提上学习日程。

    做售后工作之余,有时还会接触一些售前上的问题,比如设备的选型,那就牵涉到容量规划,《web容量规划的艺术》使我受益良多,《大话存储-网络存储系统原理精解与最佳实践》是我下一本要看的书,虽然一本书离精通存储产品还很遥远,但至少要从整体上避免整个系统中的短板。

    如此种种衍生出去的学习,正好也印证了about me中的那段话“一点服务器技术、一点操作系统知识、一点数据库概念、一点中间件结构、一点编程能力、一点网络基础、一点存储原理,还要一点IT素质和经验积累。”这些是对系统工程师的要求,但没有人来教你这么多“一点”。如果自己不要求自己,将来面试工作的时候被告知lack of sth的时候一定不好受。

    上面提到的成功特质中,1、2、3、6如果还算基本的话,4、5、7对我来说是难点,也应该是很多人的难点,因为网络上多的是零零碎碎的、重复的知识,系统的全面的极少。而那些写的深入的人,无一不是那个领域的专家。其实现在成为一个专家也并非难事,只要“一万个小时”就可以了,但事实是我们往往都知道自己的弱点和需要改进的地方,可当没有旁人督促的时候,总是缺乏动力去行动。

    所以如果你看到这篇文章,并且赞同我的内容,又有写博客的习惯,不如交换一下友情链接,互相支持一下,既交个朋友、又多个读者。

    最后用那句著名的“Stay hungry, Stay foolish“自勉。

    分类: 生活感想 标签:

    为JVM启用大页面支持

    2010年5月22日 hashei 1 条评论

    最近在看《Linux服务器性能调整》,书中第九章-Linux虚存的性能问题中提到了当代计算机体系结构都支持多种页面大小。大型页面可以改善高性能计算及内存密集型应用的性能。回想起之前看IBM developmentworks上介绍websphere调优和oracle weblogic中tuning都提到了这一点,于是想记下一笔,不过网上正好看到ken Wu已经就此总结过了,于是转贴在此。红色部分为我添加的。

    转自 Ken Wu`s Blog

    原文链接 JVM优化之调整大内存分页(LargePage)

    本文将从内存分页的原理,如何调整分页大小两节内容,向你阐述LargePage对JVM的性能有何提升作用,并在文末点明了大内分页的副作用。OK,让我们开始吧!

    内存分页大小对性能的提升原理

    首先,我们需要回顾一小部分计算机组成原理,这对理解大内存分页至于JVM性能的提升是有好处的。

    什么是内存分页?
    我们知道,CPU是通过寻址来访问内存的。32位CPU的寻址宽度是 0~0xFFFFFFFF ,计算后得到的大小是4G,也就是说可支持的物理内存最大是4G。

    但在实践过程中,碰到了这样的问题,程序需要使用4G内存,而可用物理内存小于4G,导致程序不得不降低内存占用。
    为了解决此类问题,现代CPU引入了 MMU(Memory Management Unit 内存管理单元)。

    MMU 的核心思想是利用虚拟地址替代物理地址,即CPU寻址时使用虚址,由 MMU 负责将虚址映射为物理地址。
    MMU的引入,解决了对物理内存的限制,对程序来说,就像自己在使用4G内存一样。

    内存分页(Paging)是在使用MMU的基础上,提出的一种内存管理机制。它将虚拟地址和物理地址按固定大小(4K)分割成页(page)和页帧(page frame),并保证页与页帧的大小相同。

    这种机制,从数据结构上,保证了访问内存的高效,并使OS能支持非连续性的内存分配。
    在程序内存不够用时,还可以将不常用的物理内存页转移到其他存储设备上,比如磁盘,这就是大家耳熟能详的虚拟内存。

    在上文中提到,虚拟地址与物理地址需要通过映射,才能使CPU正常工作。
    而映射就需要存储映射表。在现代CPU架构中,映射关系通常被存储在物理内存上一个被称之为页表(page table)的地方。
    如下图:

    28728a1e-693e-4790-ac60-98d883472ec3

    从这张图中,可以清晰地看到CPU与页表,物理内存之间的交互关系。

    图中的page table在现代操作系统中由全局目录(PGD)-中间目录(PMD)-页表项(PTE)三层树构成,有时候不同书上图不一样但意思一样,只是画多画少。

    进一步优化,引入TLB(Translation lookaside buffer,页表寄存器缓冲)
    由上一节可知,页表是被存储在内存中的。我们知道CPU通过总线访问内存,肯定慢于直接访问寄存器的。
    为了进一步优化性能,现代CPU架构引入了TLB,用来缓存一部分经常访问的页表内容。
    如下图:

    1381be32-3fea-460c-a310-04fcb15f99e3

    对比 9.6 那张图,在中间加入了TLB。

    为什么要支持大内存分页?
    TLB是有限的,这点毫无疑问。当超出TLB的存储极限时,就会发生 TLB miss,之后,OS就会命令CPU去访问内存上的页表。如果频繁的出现TLB miss,程序的性能会下降地很快。

    为了让TLB可以存储更多的页地址映射关系,我们的做法是调大内存分页大小。

    如果一个页4M,对比一个页4K,前者可以让TLB多存储1000个页地址映射关系,性能的提升是比较可观的。

    调整OS和JVM内存分页

    在Linux和windows下要启用大内存页,有一些限制和设置步骤。

    Linux:
    限制:需要2.6内核以上或2.4内核已打大内存页补丁。
    确认是否支持,请在终端敲如下命令:

    # cat /proc/meminfo | grep Huge
    HugePages_Total: 0
    HugePages_Free: 0
    Hugepagesize: 2048 kB

    如果有HugePage字样的输出内容,说明你的OS是支持大内存分页的。Hugepagesize就是默认的大内存页size。
    接下来,为了让JVM可以调整大内存页size,需要设置下OS 共享内存段最大值 和 大内存页数量。

    共享内存段最大值
    建议这个值大于Java Heap size,这个例子里设置了4G内存。

    # echo 4294967295 > /proc/sys/kernel/shmmax

    注意在32位操作系统上这个值不能超过4GB

    大内存页数量

    # echo 154 > /proc/sys/vm/nr_hugepages

    这个值一般是 Java进程占用最大内存/单个页的大小 ,比如java设置 1.5G,单个页 10M,那么数量为  1536/10 = 154。
    注意:因为proc是内存FS,为了不让你的设置在重启后被冲掉,建议写个脚本放到 init 阶段(rc.local)。

    更简便的方法是

    echo "vm.nr_hugepages=154" >> /etc/sysctl.conf

    通过下述命令来验证设置是否生效

    grep HugePages_Total /proc/meminfo

    结果应该是你之前设置的数值154

     

    Windows:

    限制:仅支持 windows server 2003 以上server版本

    操作步骤:

    1. Control Panel -> Administrative Tools -> Local Security Policy
    2. Local Policies -> User Rights Assignment
    3. 双击 “Lock pages in memory”, 添加用户和组
    4. 重启电脑

    注意: 需要管理员操作。

    单个页大小调整

    JVM启用时加参数 -XX:LargePageSizeInBytes=10m

    如果JDK是在1.5 update5以前的,还需要手动加 -XX:+UseLargePages,作用是启用大内存页支持。

    ——————————————————————

    其实除了JVM可以使用大页面提高性能,还有一种应用更符合内存密集型的场景,那就是数据库。数据库的调优中很早就有了这部分的建议。详见

    Tuning and Optimizing Red Hat Enterprise Linux for Oracle 9i and 10g Databases

    当中提到

    In order that an Oracle database can use Huge Pages in RHEL 4, you also need to increase the ulimit parameter "memlock" for the oracle user in/etc/security/limits.conf if "max locked memory" is not unlimited or too small, see ulimit -a or ulimit -l. For example:

    oracle           soft    memlock         1048576
    oracle           hard    memlock         1048576

    The memlock parameter specifies how much memory the oracle user can lock into its address space. Note that Huge Pages are locked in physical memory. The memlock setting is specified in KB and must match the memory size of the number of Huge Pages that Oracle should be able to allocate. So if the Oracle database should be able to use 512 Huge Pages, then memlock must be set to at least 512 * Hugepagesize, which is on my system 1048576 KB (512*1024*2). If memlock is too small, then no single Huge Page will be allocated when the Oracle database starts.

    如果limits文件中有相应设置的话,需要检查一下,避免系统没有留出足够的内存(被cache、buffer占用了)

    不过作者也提到了

    我们生产环境大部分java应用都没调过large page。性能瓶颈也不是在jvm上。

    文章里提到的优化,仅仅是实验性质的。

    优化对我们来说,是一个循序渐进的过程。我们追求的是效果明显的优化方案,而不是什么都调优一把。

    按我的经验,这些一般只是锦上添花而已