行人

诸恶莫作 众善奉行

逝者如斯
网志分类
· 所有网志 (13)
· 小东西 (0)
· 偶和兔兔 (8)
· 工作笔记 (3)
· 心情随笔 (1)
· 资料收藏 (0)
· 爆笑时间 (1)
最新评论
搜索本站
友情链接
· 我的歪酷 非非共享界
· skipjack:给我一个工控机,我将掀翻整个安全业 :)
· 蛋蛋和妞妞的家
· IT傻博士

订阅 RSS

0002153

歪酷博客


滚铁环滴猪猪 @ 2009-03-06 18:04

  NO.1 
  一日午夜,睡梦中突然——“铃~~铃”电话暴响。“谁这么晚还打电话?”
  揉揉惺忪睡眼,黑暗中摸起电话。
  ——“喂,谁呀?”
  “大舅,是我。”
  “ 哦,是你呀外甥。”
  “大舅,您身体好吗?”
  “ 挺好的。”
  “我舅妈身体好吗?”
  “都挺好的。”
  “ 咦?大舅,你声音怎么变了?”
  “ 因为你打错电话了,外甥。”
  对方愣了5秒,然后电话中传来“嘟~嘟~”的盲音。

  NO.2 遇到不讲礼貌的打错者,稍加惩罚
  一日,电话响,接起电话,听筒传来一个女孩的声音。
  “喂,给我找下小丽。”——都是《野蛮女友》惹的祸,现在的女孩说话贼冲。
  “啊?”我家里包括宠物再内,没有她找的这个名字。
  “我说——我——找——小——丽——”对方显然有些不耐烦。
  “对不起,我想你是打错了。”——我的脾气很好,对方又是女同志,所以我要保持风度。
  “不可能,你这不是********吗?我没打错呀。”刚要挂电话,听筒里的声音有提高数分贝。
  我直觉得气血上涌,你没打错难道是我接错了?我环顾一周,确定这是自己家里。
  “哦~没错,刚才我没听出来,对不起啊。”我用了最善良的语气。
  “真是的,我就说我不会打错嘛。”她还来劲了。好,我就让你错各够。
  “你是那位?”
  “我是叶子。”
  “啊,叶子呀。”我做恍然大悟状。“小丽出国了。”
  “啊?两个月没见她怎么出国了?”
  “是一个月前的事。她昨天还来电话,说给一个叫叶子的朋友买了一个笔记本电脑不知到地址,没法寄。”
  “是......是吗?我就是叶子,我怎么联系她。”我隐约听见电话那头流口水的声音。
  “你记一下*************”我迅速的翻起《世界知名企业联系名录》在里面随便挑了一个南半球的电话给她。

  NO.3 这样做是不对的
  一日,家中停电,百般无聊中拿起电话,可是朋友家的电话都没人接。放下电话,我无聊的在房间里转圈。就在这时,电话响了。我几乎是蹦着来到电话前的。
  “喂,你好。”我平时接家里电话很少用“你好”的,可见我久旱逢甘雨的心情是多么激动。
  “您好,我这里是中国网通客户服务中心。”一个女孩子甜美的声音。
  “ 啊,好,无所谓啦。”
  “啊?先生您说什么。”
  “呃......没说什么。您有什么事?”显然我激动的有些失态了。
  我是想回访一下您家宽带的使用情况。打扰吗?”
  “不打扰,当然不打扰,太不打扰了。”此时对方一定以为我神经有问题,要不就是xxx服多了。
  “您感觉您家网速快吗?”
  “这个嘛,我说不好什么是快呀。”
  “您可以登陆我们的网站,那里有宽带测试区。有**电影测试”
  “啊,我去过。”那里有五百多部电影可以**在线观看。
  “您感觉怎么样?”
  “片子老点。”我遗憾的说。
  “(对方忍不住笑了一声,很快恢复正常语气)我是说你感觉速度怎么样,有没有停顿。”
  “啊,这个呀,还行吧。就是看《百变星君》的时候停顿过。”
  “是吗,停顿时间长吗?”
  大概三十分钟吧。”
  “啊?不会吧。”她还有点不信。“怎么会停顿这么久,是不是死机了?”
  “没死机,我取消暂停后,就接着放了。”
  “啊?您自己暂停的?”
  是啊,怎么了,我有事出去一下,不能暂停吗?那你们又不早说。”我真的很委屈。
  “......(电话里对方小声向同事要纸巾擦汗)没~没事,可以暂停,只要您愿意。”接着又问“还出现过其他问题吗?”
  “让我想想......对了,那首《我愿意》我怎么下载不了啊,王菲唱的那个。我最喜欢王菲的歌了,特有味道,你喜欢吗?”我真的很喜欢王菲。“你说她怎么就和窦唯离婚了呢。他们俩的歌我都特喜欢。比如.....”我一口气说出三十几首王菲和窦唯的歌,说到兴头,还清唱两句,估计有二十多分钟,对方有点挺不住了。
  “先生,您的歌唱的不错,可是我在工作,不能多听了,很遗憾。”
  “哦,对,你在工作。呵呵,你看我都忘了。你是什么单位的来着?”
  “网......网通客户服务中心。”电话里的声音有点哽咽。
  哦......网通。你给我打电话有啥事?”
  话音刚落,只听电话那边“哐”的一声,接着听见好多人焦急的呼喊着她的名字
  ......

  NO.4 以彼之道还至彼身
  我对网通的话费查询台很有意见,每当你拨通号码后,电脑都会指引你按这个键那个键,往往查询一次话费需要按上十几二十次,最后还经常出现“系统忙,稍后再拨”这样无言的结剧。我决心报复,同时让给我制造这些麻烦的人切身体会一下消费者的苦恼。
  这日,机会来了,来电显示上提示,正在打进来的这个电话是网通公司人工催交话费的号码。
  “您好。我这里是网通话费中心。”
  “你好。这里是**家。”
  “我想通知......”
  “现在启动语音转接系统。”我没有等她说完,继续用机械的声音说。“如果您需要男主人接听,请喊(一)女主人接听请喊,(二)小主人接听请喊(三)小狗嘟嘟接听请喊(汪)如果操作错误,请喊(返回)。”
  话音刚落,只听那边女子兴奋的叫来同事,纷纷议论“这家电话够先进的。”
  “三。”稍后,电话那边传来女话务员怯怯的声音。
  “对不起,您选择的小主人由于未满周岁,所以暂时不能与您交谈,请您留下电话,待小主人学会说话后,会很快回电话给您。”
  “啊?......返回。”又听一便我的介绍后,对方选择了“二”“对不起,女主人不在家,如果您不习惯与小狗嘟嘟交谈的话,请您选择“(一)” 我有点生气,选来选去还选不上我。“一。”对方的语气有些无奈。
  “欢迎您与男主人交谈。公务交谈请喊(一)私人交谈请喊(二)其他请喊(三)操作失误喊(返回)” 三!”对方显然有些不耐烦,声音很大。
  “对不起,厨房锅里传出焦糊的味道,请您挂机,稍后再拨......”

原贴链接(http://www.xfansh.cn/article/Laughing/246.htm



 
滚铁环滴猪猪 @ 2008-05-02 07:06

    终于开始偶们滴上海生活了,工作需要,也许要在这儿呆N年,呼呼。
    在一个城市呆久了,换个陌生环境也不错,不过如果可以选择,偶更愿意呆在北京。
    工作压力大了,难免会照顾不到兔兔,辛苦她了,从儿子出生以来这七个月,都是她一个人照顾宝宝。希望以后有更多的时间陪她和宝宝玩。
    今天先去租房子,上头(就是兔兔了)交待了,要环境好、带电梯、周边方便(超市、菜市、交通、医院)的,在外高桥这个旮旯里可还真不好找。



 
滚铁环滴猪猪 @ 2008-04-26 21:47

转载自IT168 作者:IT168特约撰稿 Piner.Chen

(上)

    存储是目前IT产业发展的一大热点,而RAID技术是构造高性能、海量存储的基础技术,也是构建网络存储的基础技术。专家认为,磁盘阵列的性能优势得益于磁盘运行的并行性,提高设备运行并行度可以提高磁盘的性能和数据安全性。

    20年来,RAID 推出了一系列级别,包括RAID 0、RAID 1、RAID 2、RAID 3、RAID4、RAID 5,以及各种组合如 RAID 0+1 等。其中最广泛的包括RAID5与RAID10。但是一直以来,关于RAID5与RAID10的性能优劣的争端还是非常多的,甚至很多人包括很多公司都那拿出了测试数据。而这些测试数据复杂难懂相互矛盾,更加让用户感到迷惑,不知道如何选择。

    在这里,我将就这两种RAID的内部运行原理来分析一下,看看我们在什么情况下应当适合选哪一种RAID方式。根据我的经验与分析:象小io的数据库类型操作,如ERP等等应用,建议采用RAID10,而大型文件存储,数据仓库,如医疗PACS系统、视频编辑系统则从空间利用的角度,建议采用RAID5。下面请看详细的性能对比:

    本文分为上下两篇,上文侧重分析两种RAID的内部运行原理,下文将根据不同的影响磁盘性能的因素来分析,RAID方案对磁盘系统的影响,参考下篇。

    为了方便对比,我这里拿同样多驱动器的磁盘来做对比,RAID5选择3D+1P的RAID方案,RAID10选择2D+2D的Raid方案,分别如图:
 


    那么,我们分析如下三个过程:读,连续写,随机写,但是,在介绍这三个过程之前,我需要介绍另外一个磁盘阵列中的重要概念:cache。

磁盘读写速度的关键之一:Cache

    cache技术最近几年,在磁盘存储技术上,发展的非常迅速,作为高端存储,cache已经是整个存储的核心所在,就是中低端存储,也有很大的cache存在,包括最简单的RAID卡,一般都包含有几十,甚至几百兆的RAID cache。

    cache的主要作用是什么呢?作为缓存,cache的作用具体体现在读与写两个不同的方面:作为写,一般存储阵列只要求数据写到cache就算完成了写操作,当写cache的数据积累到一定程度,阵列才把数据刷到磁盘,可以实现批量的写入。所以,阵列的写是非常快速的。至于cache数据的保护,一般都依赖于镜相与电池(或者是UPS)。

    cache在读数据方面的作用一样不可忽视,因为如果所需要读取的数据能在cache中命中的话,将大大减少磁盘寻道所需要的时间。因为磁盘从开始寻道到找到数据,一般都在6ms以上,而这个时间,对于那些密集型I/O的应用可能不是太理想。但是,如果能在cache保存的数据中命中,一般响应时间则可以缩短在1ms以内。

    不要迷信存储厂商的IOPS(每秒的io数)数据,他们可能全部在cache命中的基础上做到的,但是实际上,你的cache命中率可能只有10%。

    介绍完cache,我们就可以解释RAID5与RAID10在不同的模式下,工作效率问题了,那么我们来分别分析读操作、连续写和离散写三方面的问题。

读操作方面的性能差异

    如我上文的介绍,磁盘阵列读操作的关键更多的体现在cache的命中率上。所以,RAID5和RAID10在读数据上面,他们基本是没有差别的,除非是读的数据能影响cache命中率,导致命中率不一样。

连续写方面的性能差异

    连续写的过程,一般表示写入连续的大批量的数据,如媒体数据流,很大的文件等等。连续写操作大多数产生于医疗PACS系统、高教图书馆系统、视频编辑系统等等应用环境下。

    根据我本人的经验,在连续写操作过程,如果有写cache存在,并且算法没有问题的话,RAID5比RAID10甚至会更好一些,虽然也许并没有太大的差别。(这里要假定存储有一定大小足够的写cache,而且计算校验的cpu不会出现瓶颈)。

    因为这个时候的RAID校验是在cache中完成,如4块盘的RAID5,可以先在内存中计算好校验,同时写入3个数据+1个校验。而RAID10只能同时写入2个数据+2个镜相。

    如上图所示,4块盘的RAID5可以在同时间写入1、2、3到cache,并且在cache计算好校验之后,我这里假定是6(实际的校验计算并不是这样的,我这里仅仅是假设),同时把三个数据写到磁盘。而4块盘的RAID10不管cache是否存在,写的时候,都是同时写2个数据与2个镜相。

    根据我前面对缓存原理的介绍,写cache是可以缓存写操作的,等到缓存写数据积累到一定时期再写到磁盘。但是,写到磁盘阵列的过程是迟早也要发生的,所以RAID5与RAID10在连续写的情况下,从缓存到磁盘的写操作速度会有较小的区别。不过,如果不是连续性的强连续写,只要不达到磁盘的写极限,差别并不是太大。

离散写方面的性能差异
    这里可能会较难理解,但是,这一部分也是最重要的部分。企业中的绝大部分数据库应用,如ERP系统等等在数据写入的时候其实都是离散写。

    例如oracle 数据库每次写一个数据块的数据,如8K;由于每次写入的量不是很大,而且写入的次数非常频繁,因此联机日志看起来会像是连续写。但是因为不保证能够添满RAID5的一个条带(保证每张盘都能写入),所以很多时候更加偏向于离散写入。


    我们从上图看一下离散写的时候,RAID5与RAID10工作方式有什么不同。如上图:我们假定要把一个数字2变成数字4,那么对于RAID5,实际发生了4次io:
    先读出2与校验6,可能发生读命中
    然后在cache中计算新的校验
    写入新的数字4与新的校验8

    如上图我们可以看到:对于RAID10,同样的单个操作,最终RAID10只需要2个io,而RAID5需要4个io。

    这里我忽略了RAID5在那两个读操作的时候,可能会发生读命中操作的情况。也就是说,如果需要读取的数据已经在cache中,可能是不需要4个io的。这也证明了cache对RAID5 的重要性,不仅仅是计算校验需要,而且对性能的提升尤为重要。我本人曾经测试过,在RAID5的阵列中,如果关闭写cache,RAID5的性能将差很多倍。

    当然,我并不是说cache对RAID10就不重要了,因为写缓冲,读命中等,都是提高速度的关键所在,不过的是,RAID10对cache的依赖性没有RAID5那么明显而已。

    到这里,大家应当也大致明白了RAID5与RAID10的原理与差别了,一般来说,象小io的数据库类型操作,建议采用RAID10,而大型文件存储,数据仓库,则从空间利用的角度,可以采用RAID5。

    在本文下篇,我们将进一步分析影响磁盘性能的不同因素,并分析不同的RAID方案对磁盘系统的影响。

 

    上篇主要从磁盘系统的内部运行细节分析了RAID5与RAID10的异同,以及各自适用的范围。本文将接续上篇,继续从RAID原理来分析存储系统的瓶颈。

    我们知道,在存储系统的采购过程中,厂商往往能够提供漂亮的性能参数,但实际运行中,该系统的实际性能表现并不能达到我们所期望的状态,那么在运行环境中存储系统的实际性能究竟受哪些环节和瓶颈的影响呢?

    之所以要和大家来讨论这个问题,是因为在本人的工作中曾遇到一个实际的Case,在这个case中,一个恢复压力很大的standby(这里主要是写,而且是小io的写),采用了RAID5的方案,发现性能很差,后来改造成了RAID10,就很好的避免了性能的问题。

    建议在阅读本文前,首先阅读本文上篇,因为性能瓶颈的出现,本身与RAID方式还是有很大关系,同时本文性能讨论的基础,本身建立在上文的一些结论之上。

    阵列的瓶颈主要体现在2个方面,带宽与IOPS(单位时间传输的数据量,和单位时间完成的I/O数)。

影响带宽的主要因素

    存储系统的带宽主要取决于阵列的构架,光纤通道的大小(我们今天讨论的阵列一般都是光纤阵列, SCSI这样的SSA阵列,暂时不在讨论范围之列)以及硬盘的个数。

    所谓阵列构架影响存储系统带宽,指的是存储系统内部架构会存在一些内部带宽,类似于PC的系统总线,尽管阵列的构架因不同厂商不同型号的产品而各有不同,不过一般情况下,内部带宽都设计的很充足,不会是瓶颈的所在。

    光纤通道对带宽的影响还是比较大的,例如数据仓库环境中,对数据的流量要求很大,而一块2Gb的光纤卡,所能支撑的最大流量应当是2GB/8=250Mb/s的实际流量,必须配备4块光纤卡才能达到1Gb/s的实际流量,所以对于数据仓库的环境来说,升级到光纤4Gb并非是厂商过于超前的产品更新,在大流量的数据环境下绝对有必要考虑更换4GB的光纤卡。

    但是对于存储系统的带宽来说,硬盘接口的带宽限制是最重要的。当前面的瓶颈不再存在的时候,带宽就完全取决于硬盘的个数了,我下面列一下不同规格的硬盘所能支撑的流量大小,数据取自硬盘厂商的标准参数:

    如果我们假定一个阵列有120块15K rpm转速的光纤硬盘,那么硬盘上最大的可以支撑的数据流量为120*13=1560Mb/s,当前端接口不成为瓶颈的时候,1560Mb/s就是理论上的最大数据流量。

    而如果要实现上述的最大带宽,如果前端采用2GB的光纤卡,可能需要配置6块才能够,而4GB的光纤卡,配置3-4块就够了。因此我们可以知道,前端的光纤接口必须与后端磁盘个数相匹配。

    但是否考虑到这些因素就足够了呢,存储系统的整体性能还受到多方面因素的影响,下面我们将分析存储系统的另外一个重要的性能指标:IOPS。

影响IOPS的主要因素

    我们前面已经说过了,厂商所提供的IOPS值是在理想状态下测试出来的,对实际的运行性能的参考并不大,所以我们有必要通过以下几个方面来衡量该系统的实际IOPS的可能表现。

    决定IOPS的主要因素取决于阵列的算法,cache命中率,以及磁盘个数。

    阵列的算法也因为不同厂商不同型号的产品而不同,如我们最近遇到在HDS USP上面,可能因为ldev(lun)存在队列或者资源限制,而单个ldev的IOPS就上不去。所以,决定采购某型号的存储之前,有必要了解这个存储的一些算法规则与限制。

    cache命中率对实际IOPS有决定性的影响,Cache命中率取决于数据的分布,cache size的大小,数据访问的规则,以及cache的算法,如果完整的讨论下来,这里将变得很复杂,可以有一天来慢慢讨论。

    我们这里把这些内部原理都省略掉,只强调:对于一个存储阵列来说,读cache的命中率越高,一般就表示它可以支持更多的IOPS,为什么这么说呢?这个就与我们下面要讨论的硬盘IOPS有关系了。

    每个物理硬盘能处理的IOPS是有限制的,如

    同样,如果一个阵列有120块15K rpm转速的光纤硬盘,那么,它能支撑的最大IOPS为120*150=18000,这个为硬件限制的理论值,如果超过这个值,硬盘的响应可能会变的非常缓慢而不能正常提供业务。较高的读cache命中率,能降低硬盘的IOPS负荷,让硬盘在较小的压力下良好工作。

不同RAID对IOPS性能的影响

    在我们的上篇中曾经讨论过,在RAID5与RAID10的不同机制上,读数据时,IOPS性能其实没有差别。但是,相同的业务,在写入数据时,采用不同的RAID机制最终落在磁盘上的IOPS是有差别的,我们评估的正是磁盘的整体IOPS,如果达到了磁盘的限制,性能肯定是上不去了。

    那我们假定一个case,业务应用的IOPS是10000,读cache命中率是30%,读IOPS为60%,写IOPS为40%,磁盘个数为120,那么分别计算在RAID5与RAID10的情况下,每个磁盘的IOPS为多少。

    RAID5:
    1. 单块盘的IOPS = (10000*(1-0.3)*0.6 + 4 * (10000*0.4))/120
    2.              = (4200 + 16000)/120
    3.              = 168

    这里的10000*(1-0.3)*0.6表示是读的IOPS,比例是0.6,除掉cache命中,实际只有4200个读IOPS。

    而4 * (10000*0.4) 表示写的IOPS,因为每一个写,在RAID5中,实际发生了4个io,所以写的IOPS为16000个。

    为了考虑RAID5在写操作的时候,那2个读操作也可能发生命中,所以更精确的计算应该为:
    1. 单块盘的IOPS = (10000*(1-0.3)*0.6 + 2 * (10000*0.4)*(1-0.3) + 2 * (10000*0.4))/120
    2.              = (4200 + 5600 + 8000)/120
    3.              = 148

    这样我们计算出来单个盘的IOPS为148个,基本达到磁盘IOPS极限,在这种情况下,磁盘的工作状态是非常不理想的。

    RAID10对IOPS性能的影响
    1. 单块盘的IOPS = (10000*(1-0.3)*0.6 + 2 * (10000*0.4))/120
    2.              = (4200 + 8000)/120
    3.              = 102

    可以看到,因为RAID10对于一个写操作,只发生2次io,所以,同样的压力,同样的磁盘,每个盘的IOPS只有102个,还远远低于磁盘的极限IOPS。

    这里回到我们先前讨论的case上来,在我们先前采用RAID5的时候,通过分析,每个磁盘的IOPS在高峰时期,快达到200了,导致响应速度巨慢无比。改造成RAID10,每个磁盘的IOPS降到100左右,很好的避免了这个性能问题。

    因此,综合本文的上篇,我们可以得出结论:

    影响读数据的关键因素是cache命中率,在读数据的情况下,RAID5与RAID10性能本身没有太大差别。但是对于写数据的一些应用,尤其是小I/O频繁写入的一些应用,如企业ERP生产系统等等,RAID10相比RAID5可能产生较大的性能差异。而大型文件存储,数据仓库,如医疗PACS系统、视频编辑系统则从空间利用的角度,建议采用RAID5。

(下)



 
滚铁环滴猪猪 @ 2008-04-26 17:08

摘自《The Guru's Guide to SQL Server Architecture and Internals》

Introduction
在这篇专栏里,我们将从开发者的角度来探讨SQL Server内存管理内幕。就是说,我们将讨论SQL Server使用API和操作系统功能管理内存的方式及其工作原理。通过这种方式探讨一个产品,将有助于我们理解产品开发者的思路,以及他们所设计的使用方法。理解一个产品的工作原理和它的设计用途,是掌握这个产品的关键。

我们将从一些基础的Windows 内存管理基本原理介绍开始。和所有的32位Windows应用程序一样,SQL Server使用Windows内存管理功能分配、释放、管理内存资源。正如所有其它的Windows应用程序,SQL Server调用Win32内存管理API函数,与操作系统提供的内存资源进行交互。

由于SQL Server中几乎所有的内存分配都使用虚拟内存(不是内存堆),因此绝大部分内存分配代码最终都是通过调用Win32的VirtualAlloc或者是 VirtualFree函数完成。SQL Server调用VirtualAlloc保留、提交分配的虚拟内存,调用VirtualFree释放虚拟内存。

Virtual Memory vs Physical Memory

在x86 系列处理器上,Windows为所有进程提供一个4GB虚拟内存工作空间。用"虚拟"这个词,意思是这个内存并不是通常意义上的内存,它只是一个地址范围,并没有和物理存储单元关联在一起。当进程请求内存分配时,这些地址空间才被使用,和具体的物理存储单元关联起来。然而这些物理存储单元并不一定是物理内存,它通常可能会是磁盘空间,确切的说,是操作系统的分页文件(System Paging Files)。这就是为什么多个应用程序可以同时运行在一个128M内存的系统上,每个应用程序都有一个4GB的虚拟内存地址空间--它不是真正的内存,但对应用程序来说可以理解为内存。Windows透明的处理paging files的数据拷贝,以使应用程序能够使用的内存可以超过机器的实际物理内存,并使应用程序能够公平的存取机器的物理内存。

这个4GB的地址空间被分成两部分:user mode部分和kernal mode部分。默认情况下,每个部分的大小为2GB,在Windows NT系列的操作系统上,可以通过BOOT.INI中的开关来改变这个默认设置(Windows NT, Windows 2000, Windows XP和Windows Server 2003属于Windows NT系列,Windows 9x和Windows ME不属于)。

图1:Windows将进程的虚拟地址空间分成user mode(应用程序)和kernal mode(操作系统)两个部分

每个应用程序拥有自己的虚拟内存地址空间,但操作系统和设备驱动程序共享同一个私有地址空间。每一个虚拟内存页(memory page)都和特定的处理器模式(processor mode)相关联,为了存取某个虚拟内存页,处理器必须工作在要求的模式下。这意味着应用程序不能直接存取kernal mode的虚拟内存,系统必须切换到kernal mode才能存取kernal mode的内存空间。

Application Memory Tuning

3GB启动选项(Windows 2000的Advanced Server和DataCenter及后续Windows版本中可用)允许改变这两个地址空间部分的默认大小。它允许将进程的user mode地址空间从2GB扩展到3GB,相应的代价是kernal mode的地址空间从2GB减小到1GB。用Windows的说法,这个功能叫做Application Memory Tuning或者是4GB Tuning(4GT)。你可以通过在BOOT.INI文件的[Operating Systems]部分添加/3GB开关启用应用Application Memory Tuning。通常情况下,人们通过设置BOOT.INI文件的[Operating Systems]部分,将系统配置为可以使用3GB或者不使用3GB启动,以使在系统启动时可以进行选择。

警告:你也可以在Windows 2000 Professional和Windows 2000 Server上使用/3GB开关,这样做的负面结果是,将kernal mode的空间减小到了1GB,但并不会增加user mode的空间。换句话说,你减小了kernal mode的空间但并没有获得任何好处。

注意:Windows XP和Windows Server 2003引入了一个新的启动选项/USERVA,和/3GB一起使用,比单独使用/3GB能够更好的控制。你在BOOT.INI中添加/3GB的时候可以同时添加/USERVA,/USERVA比单独使用/3GB的优点是它允许你指定一个准确的地址空间大小值供user mode存取。例如,/USERVA=2560为user mdoe配置2.5G的空间,剩余的1.5G用于kernal mode。上面的警告信息在使用/USERVA选项时同样适用。

Large-Address-Aware Executables

在/3GB 支持加入Windows之前,应用程序无法使用指针的最高位,User mode的应用程序只能够对32位指针的前31位表示的地址空间进行存取。对于剩下的1位,一些聪明的开发者不希望浪费进程空间里的这1个位,把它用于了其它的目的,例如用于标识那些应用程序特定的地址分配类型的指针。这在引入/3GB后带来一个难题,因为这种类型的应用程序无法区分引用2GB以上内存的指针,和那些引用2GB以下内存但是最高位由于其它原因而被设置的指针。基本上,使用/3GB启动机器,会使这样的应用程序崩溃。为了解决这个问题,微软在Win32 PE文件格式(定义Windows下可执行文件Exe和Dll结构的格式)的Characteristics字段加入一个新标识位的支持,用于指示应用程序是否支持大的寻址能力。设置可执行文件头中Characteristics字段的第32位启用 IMAGE_FILE_LARGE_ADDRESS_AWARE标识位。通过设置应用程序头的这个标识位,表明应用程序能够处理那些最高位被设置的指针,不会由于这个位带来任何多意性。当设置了这个标识位,在正确的Windows版本上使用/3GB选项启动,系统将为进程提供一个私有的扩展user mode地址空间。你可以使用DumPBin、ImageCfg等可以分析可执行文件头的工具,查看应用程序是否启用了这个标识位。Visual C++通过/LARGEADDRESSAWARE连接开关提供对IMAGE_FILE_LARGE_ADDRESS_AWARE的支持。SQL Server启用了这个标识位,因此当你在正确的Windows版本上使用/3GB开关启动,系统将扩展SQL Server的user mode地址空间。

注意:Windows在进程启动时检查IMAGE_FILE_LARGE_ADDRESS_AWARE标识,忽略Dll的标识。对那些最高位被设置的指针,dll代码必须能够正确处理。

Physical Address Extension

从Pentium Pro开始,Intel处理器提供一种叫做Physical Address Extension(PAE)的内存映射模式。PAE支持高达64GB的物理内存存取。PAE模式下,内存管理单元(Memory Management Unit - MMU)仍然实现了页目录条目(Page Directory Entries - PDEs)和页表条目(Page Table Entries - PTEs),但是在这个之上有一个新的层级:页目录指针表(Page Directory Pointer Table)。PAE模式下系统能够寻址更大的内存,因为PDEs和PTEs为64位宽,是之前标准宽度的两倍,而并不是通过PAE模式下的页目录指针表实现。页目录指针表把这些高存储容量的表和索引管理起来。使用PAE模式需要一个特殊版本的Windows内核,在Windows 2000及后续版本中均有提供,单处理器机器上位于Ntkrnlpa.exe中,多处理器机器上位于Ntkrnlpamp中。和/3GB、/USERVA 一样,在BOOT.INI文件中添加/PAE启用PAE模式。

Address Windowing Extensions

Widnows中的Address Windowing Extensiongs功能允许应用程序存取超过4GB的物理内存。32位的指针是一个整型,只能够存储小于等于0xFFFFFFFF的值,因此只能够引用一个4GB的线性内存地址空间。AWE使应用程序可以突破这个限制,存取所有操作系统支持的内存。

在概念上,AWE并不是一个新的东西,实际上,从计算机诞生开始,操作系统和应用程序就围绕指针限制开始使用类似的机制来处理。例如回到DOS时代,32位扩展(象Phar Lap、Plinks及其它的一些)就普遍运用于16位应用程序,以存取正常地址空间之外的内存。用于扩展内存特殊用途的管理器、API非常普遍。也许你还记得象Quarterdeck QEMM-386这样的产品,在那个时代普遍的用于这类用途中。在这些允许指针存取超过本身表达范围的内存的机制中,具有代表性的方式,是在指针可直接存取的地址空间中提供一个窗口或者是区域,用于和指针无法直接存取的内存区域的转换。这正是AWE的工作原理:在进程地址空间中提供一个区域,或者说一个窗口,用作和user mode的代码无法直接存取的内存区域进行内存存取交换的中专站。

为了使用AWE,应用程序必须:(译者注:下面讲的"需要存取的物理内存"指那些user mode进程在自己的地址空间中无法直接访问到的内存)

1. 使用Win32的AllocateUsERPhisycalPages API函数分配要存取的物理内存。该函数需要调用者具有将内存页锁定的权限。

2. 使用VirtualAlloc API函数在进程的地址空间中创建一个区域,作为与需要存取的物理内存进行映射的一个窗口。

3. 使用MapUserPhysicalPages或者MapUserPhysicalPagesScatter API函数,将需要存取的物理内存映射到这个虚拟内存窗口中。

Windows 2000及后续版本支持AWE,尽管可以在低于2G物理内存的机器上使用AWE,但一般只是在2G或者超过2G内存的机器上使用,因为AWE是32位进程存取超过 3GB内存的唯一方法。如果你在低于3GB物理内存的系统上,在SQL Server中启用AWE支持,系统会忽略这个选项并使用正常的虚拟内存管理方法。AWE内存一个比较有意思的特性是它不会使用磁盘,你将注意到AWE相关的API函数只对物理内存进行存取,这就是说AWE内存就是物理内存,不会与系统分页文件发生交换。

用于AWE提供的物理内存缓存的虚拟内存窗口,需要具有读、写存取权限,因此当你设置这个虚拟窗口时,传给VirtualAlloc的保护属性只能是 PAGE_READWRITE。这也意味着你无法使用VirtualProtect保护这个区域中的内存页,来防止被修改或存取。

注意:你常用的一些检测应用程序内存使用的工具,例如任务管理器、Perfmon/Sysmon等,都无法显示各个进程AWE内存的使用量。并没有什么可以指示各个进程AWE内存的使用量,也就没有什么可以报告给定进程工作区中AWE内存的大小。

/3GB vs AWE

在Windows 的内存管理功能中,Application Memory Tuning(/3GB)可以给私有进程增加50%的地址空间,使用方便,因此成为一种常用方法,但AWE功能更具有弹性和扩展性。前面提到,当你为私有进程地址空间增加1GB,这1GB来自kernal mode的地址空间,kernal mode地址空间也由2GB被压缩到1GB。对于kernal mode代码,完整2GB的工作空间已经显得狭窄,压缩这部分空间意味着某些内部核心结构也必须要压缩。这些结构中主要有机器上用于管理内存的表窗口(table Windows)。当你将kernal mode部分压缩到1GB后,这个表最大就只能管理16GB的物理内存了。例如你在一台具有64GB物理内存的机器上运行Windows 2000 DataCenter,启动时使用了/3GB选项,你就只能够存取这台机器25%的内存,剩余的48BG将无法被操作系统和应用程序使用。AWE允许你访问超过3GB的内存,而通过/3GB,你仅仅为私有进程空间获得额外的1GB。Large Address Aware自动透明的使得这个额外空间对应用程序可用,但它被限制在1GB之内。理论上,AWE通过Win32 AWE API函数,使得所有对操作系统可用的物理内存对应用程序可用。尽管AWE更难于使用和存取,但它更具弹性和扩展。

并不是说任何情况下AWE都比/3GB好,只是通常状况下是这样。比如说当你需要很多空间以分配内存,而又不能放在AWE内存中(例如象线程栈Thread Stacks、锁内存Lock Memory、存储过程计划Procedure Plans等),你也许会发现/3GB更合适。

Memory Regions

SQL Server将分配的内存组织成两个独立的区域:BPool和MemToLeave。实际上如果你使用AWE模式,还有另外一个区域:在Windows AWE支持下可以存取的3GB以上的物理内存。

BPool在这三个区域中是比较突出的一个,它是SQL Server主要的分配池,主要用于数据和索引页的缓存,也用于小于8K的内存分配。MemToLeave包含user mode地址空间中BPool没有使用的那部分虚拟内存空间。3GB之上的AWE内存作为BPool的扩展,为数据和索引页缓存提供额外的空间。

当你启动SQL Server的时候,SQL Server基于机器的物理内存和user mode地址空间的大小计算BPool的上限。在计算出这个值后,MemToLeave区域被保留,这有利于防止BPool随后的预留造成内存碎片。接下来,BPool被保留,它可以分成多达32个独立预留块,用于满足在BPool保留时SQL Server进程中那些正在请求虚拟地址空间的dll及其它分配请求。在保留BPool区域之后,MemToLeave区域被释放。MemToLeave 用于SQL Server内部超过8KB的连续空间分配请求,以及象OLEDB Provider、进程内COM对象等外部客户(指SQL Server主要引擎之外,驻留在SQL Server进程中的那些内存请求者)分配请求。

因此,一旦SQL Server启动,BPool就被保留,但未被提交,MemToLeave基本就是进程的虚拟内存地址空间中的空闲部分。如果你在SQL Server启动之后查看SQL Server进程的Virtual Bytes Perfmon计数器,你将发现它反映的是BPool的预留。我曾经看到人们因为这个数字经常很高而惊慌,毕竟,它通常是机器总的物理内存或者是最大 user mode地址空间,减去MemToLeave区域大小。这没什么担心的,因为它仅仅是保留但没有提交的空间。之前提到过,保留的空间仅仅是一个地址空间,直到被提交时才会真正的和物理存储单元关联。在这些之后,被提交到BPool中的内存将会增加,直到达到SQL Server启动时计算出的BPool上限值。

Monitoring SQL Server Virtual Memory Use

你可以通过SQL Server:Buffer Manager"Target Pages Perfmon计数器跟踪计算出的BPool最大值。SQL Server不同部分需要内存时,BPool提交一开始就被保留的8KB大小的页直到达到计算的上限值,你可以通过SQL Server:Buffer Manager"Total Pages Perfmon计数器跟踪BPool中被提交的虚拟内存的使用状况。另外你可以通过Private Bytes计数器跟踪SQL Server进程中所有被提交的虚拟内存的使用状况。

因为SQL Server中绝大部分虚拟内存的使用都来自BPool,因此通常情况下,这两个计数器将一前一后的增加或平稳下来(记住,当启用AWE支持后, Private Bytes计数器不会反映SQL Server全部的内存使用)。如果Total Pages计数器平稳下来,而Private Bytes持续增加,这通常表明MemToLeave区域中连续的内存分配。这种内存分配可能比较常见,例如可能是SQL Server创建额外的工作线程时和线程栈相关的内存分配,或者是进程内COM对象、扩展存储过程等外部请求者的内存泄漏等。如果由于内存泄漏或者内存使用过大,导致MemToLeave区域耗尽,使SQL Server进程用完了虚拟内存地址空间的内存(或者是MemToLeave区域中的最大空闲块低于0.5M的默认进程栈大小),就算是并没有达到使用 sp_configure配置的最大工作进程数,SQL Server将无法创建新的工作进程。这种情况下,如果SQL Server需要创建一个新的工作进程来执行一个工作请求,例如处理SQL Server新的连接请求等,那么这个工作请求将被延迟,知道服务器有足够的资源创建工作进程,或者是其它工作进程被释放出来。这可能会导致用户无法连接到服务器,因为在从MemToLeave中获得足够的空闲空间或者是其它工作进程被释放能够处理当前工作请求之前,连接可能会超时。

Allocations

SQL Server中的内存请求者在初始化内存请求时,先创建一个内存对象管理当前的请求,当内存对象执行请求时,它调用SQL Server中相应的内存管理器从BPool或者是MemToLeave区域获取内存。请求小于8KB时,通常从BPool中获取内存;当请求8KB或者更大的连续空间时,通常从MemToLeave区域中获取。因为一个内存对象可能会产生多个分配请求,因此有可能会从MemToLeave区域中分配小于 8KB的分配请求。向SQL Server进程空间请求内存一般情况下都是内部请求者,就是说SQL Server的内部对象需要内存以执行某个任务,当然不是绝对的,象上面提到过的也有可能是外部请求者。通常,这些外部请求者使用Win32内存API函数分配和管理内存,因此是从MemToLeave区域中分配,因为(对于操作系统而言,译者注)SQL Server进程中只有MemToLeave区域可用(BPool区域被SQL Server保留,译者注)。但对于扩展存储过程是个特殊情况,扩展存储过程调用ODS的srv_alloc API函数实现,这使得它同SQL Server内部请求者被同等的处理,通常srv_alloc请求小于8KB的内存时从BPool中分配,大的内存分配则来自MemToLeave区域。

The Memory Manager

服务器运行时,内存管理器进行检查,以确保为服务器预留了一定数量的可用物理内存,使Windows和服务器上其它应用程序能够继续平稳的运行。这个数量从 4M到10M左右(Windows Server 2003上接近10M),基于系统负载和BPool中内存页生命期得出。如果服务器上可用物理内存开始低于这个极限值,服务器释放BPool中的部分内存页,以收缩BPool的内存使用量(假设SQL Server的动态内存配置被启用)。内存管理器也确保任何时候保留了一定数量的空闲内存页,以使新的分配请求到达时,不必等待内存分配。这里的空闲,意思是指这些内存页被提交了,但是未使用。被提交但未被使用的BPool内存页通过一个空闲列表跟踪,当列表中的页被使用时,内存管理器从BPool的预留中分配更多的内存页,直到整个BPool预留被提交。你将看到Process:Private Bytes Perfmon计数器由于这个行为而逐渐的增长(通常是线性增长)。

系统中对应每一个CPU都有一个单独的空闲列表,当需要使用空闲页用于满足一个分配请求时,先检查和当前分配请求CPU相关的空闲列表,然后再检查系统中其它CPU相关的列表。这在多处理器系统上,有利于各个处理器更好的使用本地缓存,提高扩展性。你可以使用SQL Server:Buffer Partition Perfmon计数器监控特定的BPool分区,通过SQL Server:Buffer Manager"Free Pages Perfmon计数器监控所有分区的空闲列表。

整个运行过程中,SQL Server内存管理器进程(可能运行在内存管理器线程或其它服务器线程中)监控系统内存状态,为系统其它应用程序保留合理数量的空闲物理内存,为新的内存分配请求预留一个安全数量的内存页。当在服务器上使用AWE时,其中的某些方面必须改变。在使用AWE时,BPool一开始就获取并锁定机器的物理内存,锁定的内存数量根据是否设置了maximum server memory确定。如果设置了,BPool尝试锁定由maximum server memory确定的数量;如果没有设置,BPool只留出大致128M,供其它进程使用,锁定机器上其余的全部物理内存。然后,BPool使用3GB之上的内存(AWE内存)作为数据和索引的分页文件(paging files),它将这些区域(3GB之上)的物理内存页映射到适当的虚拟内存地址空间中,使32位指针能够引用到。

作为一个丈夫和父亲的Ken Henderson,居住在德克萨斯州的达拉斯郊区。他是8本不同技术主题书籍的作者,包括最近发行的《The Guru's Guide to SQL Server Architecture and Internals》。Ken Henderson是达拉斯小牛队的球迷,业余时间喜欢看着他的孩子们玩闹,喜欢体育运动、园艺。




 
滚铁环滴猪猪 @ 2008-04-26 15:11

要使 SQL Server 2000 支持 2G 以上的大内存,可作以下操作:

1、开启操作系统的 PAE 模式
Boot.ini 文件中增加 /PAE:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Windows Server 2000" /fastdetect
/PAE
参考:
Windows Server 2003 和 Windows 2000 提供大内存支持

2、开启 SQLSERVER 的 AWE 模式并设定最大使用 6G 内存
sp_configure 'show advanced options', 1
RECONFIGURE
GO
sp_configure 'awe enabled', 1
RECONFIGURE
GO
sp_configure 'max server memory',
6144
RECONFIGURE
GO
参考:
如何配置 SQL Server 以便使用 2 GB 以上的物理内存

3、设置内存中锁定页
a. 在任务栏上,单击“开始”,然后单击“程序”。
b. 单击“管理工具”,然后选择“本地安全策略”。
c. 依次展开“安全设置”、“本地策略”,然后单击“用户权限分配”。
d. 在右侧屏幕中,右键单击“内存中锁定页”,然后单击“安全”。
e. 在“本地安全策略设置”对话框中,单击“添加”。
f. 单击以选中运行 MSSQLSERVER 服务的帐户(一般是 Administrator)。
g. 单击“确定”。
说明:如果不执行本步骤,就算打开了 AWE,SQL Server 仍只能使用 2G 内存。
参考:
SQL Server only uses 2 GB of memory even though the AWE option is enabled

4、如果是 SQL Server 2000 SP4,需要安装下面的补丁,否则最大只能使用物理内存的 50%。
参考:FIX:在运行 32 位版本的 SQL Server 2000 SP4 的计算机上启用 AWE 时有些内存不可用
补丁:
Fix: Not All Memory is Available When AWE is Enabled on a Computer Running 32-bit Version of SQL Server 2000 SP4 (899761)

5、重启机器。

注:打开 AWE 后,在任务管理器中无法看到 SQL Server 实例所分配内存的真实大小。可在性能监视器中,
使用 SQL Server: Memory Manager 对象的 Total Server Memory (KB) 计数器确定在 AWE 模式下运行的 SQL Server 实例所分配的内存大小。

如果打开 PAE 及 AWE 后,出现蓝屏或无响应的问题,参考:You may notice unpredictable behavior on a multiprocessor computer that is running SQL Server 2000 and has the Physical Addressing Extensions (PAE) specification enabled




 
滚铁环滴猪猪 @ 2007-09-25 22:52

  “江叔叔出书啦”
  一大早,兔兔就流着口水对我说。
  彼时她还没完全睡醒,闭着眼睛,口齿不清。
  当然,这只是她的希奇古怪的梦之一。
  对于她做梦的能力,偶实在要表示一下惊讶先。用她自己的话说,就算是打一小盹,也是在做梦。她就不明白,偶一觉到天亮啥梦也不做,那睡觉的时候到底在干啥。
  话说这次的梦,搞笑之极,梦见江叔出版了一本书,叫《女孩,别追忆似水年华》(看看,书名都还记得一清二楚,这可是要真本事的),而且是免费大派送。
  书是采用回忆录的形式,忠告MM们别沉迷于那些有经历的Man,虽然这些Man看上去真的很Man。
  里面还有江叔去法国、越南等地拍的照片。江叔那叫一个帅,侧脸看跟一老外似的。
  在回程的船上,江叔很潇洒的靠在船舷,把一路上的照片拿出来,对周围一圈各色MM说:我只留这两张。抽出两张,一张是出发前的,一张是返回前的,其余的全随手撒向海里,随波而去。MM们均以无比仰慕的眼神看着他。
  然后。。。 然后就醒了。。。 没拿到免费派送的书真是很遗憾,是不是该找江小雪要一本呢? 


 
滚铁环滴猪猪 @ 2007-08-26 21:53

前几天,偶妹江小雪来家里玩,兔兔说让她摸小家伙练胎拳道,可是她的手放在兔兔肚肚上的时候,小家伙就是不配合,一下都不动。
兔兔:看嘛,TA不喜欢和你玩。TA最喜欢TA爸爸了,你让你猪GG给TA唱歌听,TA就会动滴。
江小雪睁大了眼睛:真的哇?
兔兔:真的,你让他唱歌嘛。
偶很不好意思,但是看着江小雪期待的眼神,又没办法,于是偶清清嗓子,对TA很温情滴说。。。
“乖乖~~~~



江小雪已经走了~~”
两个人笑翻。
结果,江小雪再把手放兔兔肚肚上的时候,TA真的就开始玩起来了
真是个爱憎分明的小东西。
这点随TA妈妈,偶从来都是宾语。


 
滚铁环滴猪猪 @ 2007-08-26 21:30

兔兔一直宣称上辈子被面条绊倒过,要么就是前世是包子,和面条打过架。
因此,在猪GG吃面条的日子里,兔兔虽然经常抽着鼻子对猪GG呼噜猛吃的面条嚷嚷:好香哦~~可是坚决不肯吃一口,哪怕饿肚子也不成。
这让对食物很博爱的猪GG感到困惑,作为一个北方人,恨一碗面条可以十年、五十年甚至五百年这样恨下去,为什么仇恨可以大到这种地步呢?
于是,猪GG想出了一个课题:让偶们的张一诺(兔兔说管TA小名叫诺儿)以后学习心理学,好好研究一下TA妈妈的这种心理,毕竟TA在妈妈肚肚里呆了好几个月,最有发言权的非TA莫属。搞不好整个“诺贝儿心理学奖”哦