红俊's profile蝈蝈俊的共享空间PhotosBlogListsMore ![]() | Help |
|
March 30 Html标签嵌套对展示性能的影响一个简单问题:如下2种Html写法,那个加载速度快? <!-- 写法1 --> <div> <div>内容代码2</div> <div>内容代码3</div> <div>内容代码4</div> <div>内容代码5</div> <div>内容代码6</div> <div>内容代码7</div> <div>内容代码8</div> <div>内容代码9</div> <div>内容代码10</div> </div> <!-- 写法2 --> <div>内容代码2</div> <div>内容代码3</div> <div>内容代码4</div> <div>内容代码5</div> <div>内容代码6</div> <div>内容代码7</div> <div>内容代码8</div> <div>内容代码9</div> <div>内容代码10</div> 我的答案,写法2。当然,如果只是上面的写法,实际上这两种写法对性能的差别,可以忽略不计。 但是如果,上图的内容代码区域如果嵌入了一些不可控的因素,比如:外站的一些脚本出现在<div>内容代码7</div>中。写法1需要所有都加载完成才可以正常显示,写法2的内容2-6 不受这个影响。
更具体的来说:浏览器解析Html的规则必然是:
再回到最初的问题: 一般美工在作页面时,会喜欢写法1的嵌套Html。如果一个夏姆,对用户体验要求高,同时预测到可能会在一些地方嵌入广告脚本会影响到页面显示,我会要求美工用方法2的方式来书写源文件,以保证用户体验。页面的设计,减少嵌套的层次,对页面的加载会好处多多的。 最后,我家儿子刚过一周岁,文章的最后祝福一下我家小宝贝。
参考资料: <div>嵌套<div>后的显示速度问题
关于DIV和表格的速度评论
把所有东西都放在一个大DIV里,显示速度问题。
整个网页面用一个DIV包含起来好不好
March 19 NLB是如何做负载分流计算的网络负载平衡采用一种完全分布式的算法,根据传入客户端的 IP 地址和端口,以统计方式将其映射到群集主机。此进程的发生不需要主机间进行任何通信。当发现到达的数据包时,所有主机同时执行这种映射,以快速确定哪个主机应当处理这个程序包。这种映射一直保持不变,直到群集主机数发生更改时为止。与集中式负载平衡应用程序相比,网络负载平衡筛选算法处理数据包的效率更高,因为前者必须修改和重新传送数据包。 如下图:
这个统计算法在 Wlbs.sys 组件中实现。 有关这个算法细节可以搜索关键字:“Load Balancing Algorithm” 下面是一些相关文章链接: How Network Load Balancing Algorithm works internally
为了协调其操作,网络负载平衡主机在群集内周期性地交换检测信号。IP 多播允许主机监控群集状态。当群集状态更改时(例如当主机发生故障、离开或加入群集时),网络负载平衡将调用称作“聚合”的过程,在该过程中,主机交换数量有限的消息,以确定群集的新的一致状态,并为主机指定最高主机优先级,即作为新的默认主机。当所有群集主机在正确的新群集状态下取得一致后,它们将在 Windows 事件日志中记录聚合的完成。完成这个过程一般用不了 10 秒种。 在聚合过程中,其余主机继续处理传入的网络通信。对工作主机的客户端请求不受影响。完成聚合后,将以故障主机为目标的通信重新分发给仍在工作的主机。经过负载平衡后的通信将在仍在工作的主机间得到重新划分,以便尽可能好地实现特定 TCP 或 UDP 端口的新的负载平衡。 如果向群集添加了一个主机,则聚合允许该主机接收自己那份经过负载平衡的通信。群集的扩展不影响正在进行的群集操作,而且其实现过程对 Internet 客户端和服务器应用程序都是透明的。但是,当选择了“客户端相似性”时,它可能影响跨多个 TCP 连接的客户端会话,因为可能会将客户端重映射到连接间的不同群集主机。有关相似性的详细信息,请参阅网络负载平衡和状态可控的连接。 网络负载平衡假定,主机在群集内正常工作的时间与它同其他群集主机交换检测信号的时间一样长。如果在多次检测信号交换中,其他主机都没有接收到来自任何成员的响应,则它们将启动聚合,重新分发本来应由失败主机处理的负载。 对于消息交换时段以及启动聚合所需的丢失的消息数,您都可以进行控制。默认值设置分别为 1000 毫秒(1 秒)和 5 个丢失的消息交换时段。由于一般都不修改这些参数,所以无法通过“网络负载平衡属性”对话框配置它们。必要时,可以在注册表中手动调整它们。调整聚合参数对完成此操作的过程进行了描述。 如下图所示发生群机主机变更时的处理。
聚集前的NLB集群 聚集后的NLB集群
参考资料: How Network Load Balancing Technology Works Appendix B - Network Load Balancing Technical Overview
网络负载平衡的工作原理 March 18 ASP.net2.0的machineKeymachineKey的作用在于下述场景:
ASP.net 1.0 以及 ASP.net 1.1, 我们都可以在下面地址的文件中找到machineKey的配置信息: %Windir%\Microsoft.NET\Framework\<version>\config\machine.config 不同的是 ASP.net 1.0 找到的是如下的配置信息 <machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="SHA1" /> ASP.net 1.1 找到的是如下信息: <machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="SHA1" /> 但是 ASP.net 2.0 , .net Framework 3.0 ,.net Framework 3.5 这些版本中,我们在 %Windir%\Microsoft.NET\Framework\<version>\config\ 目录的 machine.config 和 web.config 中找不到machineKey的设置。 这是因为, ASP.net 2.0 中,machineKey 的默认设置没有写在配置文件中。 ASP.net 2.0 中,machineKey 的默认设置如下: <machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="SHA1" decryption="Auto" /> 我们如果要修改machineKey的默认设置,就需要在必要的地方新加machineKey的配置节点。 产生一个可用的 machineKey 配置信息可以使用下面地址提供的工具:
参考资料: How To: Configure MachineKey in ASP.NET 2.0
machineKey 元素(ASP.NET 设置架构)
March 17 ASP.net 的工作线程与请求队列ASP.net工作线程池当 ASP.NET 接收针对页的请求时,它从线程池中提取一个线程并将请求分配给该线程。 一个普通的(或同步的)页在该请求期间保留线程,从而防止该线程用于处理其他请求。如果一个同步请求成为 I/O bound(例如,如果它调用一个远程 Web 服务或查询一个远程数据库,并等待调用返回),那么分配给该请求的线程在调用返回之前处于挂起状态。 这影响了可伸缩性,原因是线程池的可用线程是有限的。 这个数字的设置是在 machine.config 的 下述节点的 maxWorkerThreads 属性 <system.web> <processModel requestQueueLimit="num|Infinite" maxWorkerThreads="num" /> </system.web> maxWorkerThreads
ASP.net请求队列上述设置中,还有一个队列设置,如下:
默认情况下,这个可用分线程数为1000。下图为IIS6和IIS7中这个参数的设置地方。 IIS 7 的可用线程数设置
IIS 6 的可用线程数设置
如果所有请求处理线程全部阻塞以等待 I/O 操作完成,则其他请求排入队列等待线程释放。 最好的情况是吞吐量减少,因为请求等待较长的时间才能得到处理。 最坏的情况则是该队列填满,并且 ASP.NET 因 503“Server Unavailable”错误使后续请求失败。
参考资料: 在服务器端 Web 代码中使用线程和生成异步处理程序
ASP.NET 2.0 中的异步页
IIS 6.0 架构
IIS 7.0 架构
了解ASP.NET底层架构
网络负载平衡(Network Load Balancing)的工作原理最近正在研究如何把CSDN的论坛WEB服务器实现负载平衡(NLB)。下面就是我整理资料笔记: NLB 的工作原理NLB算法的特点:
要确保上面算法的特点,单播(Unicast ),多播(Multicast)实现NLB就会有以下的特点: NLB中的单播(Unicast)在单播模式下,NLB重新对每个NLB节点中启用NLB的网络适配器分配MAC地址(此MAC地址称为群集MAC地址),并且所有的NLB节点均使用相同的MAC地址(均使用群集MAC地址),同时NLB修改所有发送的数据包中的源MAC地址,确保使交换机不能将此群集MAC地址绑定在某个端口上。 工作在单播模式下的NLB可以在所有网络环境下正常运行,但是由于它的工作特性,具有以下两个限制:
单播模式的优点也很明显:它可以无缝地与大多数路由器和交换机协同工作。 如下图所示: 单播的其他注意项:
参考: 单播模式下的单个网络适配器
NLB中的多播(Multicast)在多播模式下,NLB不会修改NLB节点启用NLB的网络适配器的MAC地址,而是为它再分配一个二层多播MAC地址专用于NLB的通讯(此MAC地址称为群集MAC地址),这样NLB节点之间可以通过自己原有的专用IP地址进行通讯。 但是在多播模式中,NLB节点发送的针对群集IP地址MAC地址ARP(Address Resolution Protocol,地址解析协议)请求的ARP回复会将群集IP地址映射到多播MAC地址,而许多路由器或者交换机(包括CISCO的产品)会拒绝这一行为。当出现这种情况时,你必须在路由器和交换机上手动添加静态映射,将群集IP地址映射到群集的多播MAC地址。 这种模式的优点是可以通过在交换机的“内容可寻址存储器”(CAM) 表中创建静态项,从而使得入站流量仅到达群集中的主机。 还有一个缺点就是很多路由器不会自动将单播 IP 地址(群集的虚拟 IP 地址)与多播 MAC 地址关联起来。如果进行静态配置的话,一些路由器可以存在这种关联。若我们在NLB创建时选择多播的模式,在“群集IP配置”中的“网络地址”是以“03 -BF”开头,后面紧跟IP地址的十六进制表示。 如下图所示:
IGMP Multicast(IGMP多播)NLB算法需要NLB群集中的所有主机都能看到发往群集的每一个数据包。NLB不允许交换机将群集的MAC地址关联到交换机的某个特定端口,从而实现了这个目的。但是,这种做法也会带来不想要的副作用,就是发往NLB群集的所有数据包会在交换机上的所有端口上造成数据“洪水”。这不仅非常麻烦,而且必将会造成网络资源的浪费。 为了解决这个问题,一个被称作IGMP支持的新特性被引入到了Windows Server 2003之中。该特性有助于将数据“洪水”限制到交换机上与NLB计算机相连接的端口上。通过这种方式,非NLB的计算机不会看到发往NLB群集的数据,而与此同时,所有的NLB计算机都可以看到发往群集的数据,因此满足了NBL算法的要求。但是,应该指出的是:IGMP支持只有在NLB被配置多播(multicast)模式时才能启用。 在选择多播模式时,后面还有个复选项“IGMP Multicast(IGMP多播)”,若复选此项,就像多播操作模式一样,NLB 保留原厂 MAC 地址不变,但是向网络适配器中增加了一个 IGMP 多播地址。此外,NLB 主机会发出这个组的 IGMP 加入消息。如果交换机探测到这些消息,它可以使用所需的多播地址来填充自己的 CAM 表,这样入站流量就不会扩散到 VLAN 上的所有端口。这是这种群集模式的主要优点。缺点是有一些交换机不支持 IGMP 探测。除此之外,路由器仍然支持单播 IP 地址到多播 MAC 地址的转换。在IGMP多播模式下,将采用“01 – 00 - 5E”开头的MAC地址。在多播的模式下,实体主机之间可以互相通信。 如下图所示:
NLB对路由器的要求当群集已配置为在多播模式下工作时,如果网络负载平衡客户端正在通过路由器访问一个群集,请确保路由器满足以下要求:
单播模式对路由器没有要求。
参考: 多播模式下的单个网络适配器 多播模式下的多个网络适配器
附:单播(Unicast),多播(Multicast),广播(Broadcast) 的区别: 单播: 主机之间“一对一”的通讯模式,网络中的交换机和路由器对数据只进行转发不进行复制。如果10个客户机需要相同的数据,则服务器需要逐一传送,重复10次相同的工作。但由于其能够针对每个客户的及时响应,所以现在的网页浏览全部都是采用IP单播协议。网络中的路由器和交换机根据其目标地址选择传输路径,将IP单播数据传送到其指定的目的地。 多播(组播): 主机之间“一对一组”的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据,网络中的交换机和路由器只向有需求者复制并转发其所需数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择的复制并传输数据,即只将组内数据传输给那些加入组的主机。这样既能一次将数据传输给多个有需要(加入组)的主机,又能保证不影响其他不需要(未加入组)的主机的其他通讯。 广播: 主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。有线电视网就是典型的广播型网络,我们的电视机实际上是接受到所有频道的信号,但只将一个频道的信号还原成画面。在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。 参考资料: Load Balancing and ASP.NET Web Farming with the Network Load Balancing Service in Windows Server 2003 网络负载平衡算法 Works 内部怎样 WEB farm - Load Balancing in Asp.net How to test web load balance 将asp.net迁移到Load Balance和NAS上的步骤 微软知识库中的关于负载均衡的HowTo文章汇总 TechNet 关于 网络负载平衡群集 的内容 下面文章中间谈到了负载均衡的工作原理 NLB配置中单播与多播区别 NLB群集 Using NLB with ISA Server Part 2: Layer 2 Fun with Unicast and Multicast Modes
IP多播概述 TCP/IP学习笔记之九 --- 广播和多播
网络负载平衡关键特性 Network Load Balancing Network Load Balancing Technical Overview March 13 information_schema.routines与sysobjects在建立存储过程前,我习惯于先检查存储过程是否存在,如果存在就建立,然后再创建。 这个检查的过程,现在有2种习惯写法,如下: if exists ( select * from information_schema.routines where specific_name = 'WorkOrdersForBlade' and specific_schema = 'dbo') begin drop procedure dbo.workordersforblade end go 或者 if exists ( select * from sysobjects where type = 'p' and name = 'WorkOrdersForBlade') begin drop procedure dbo.workordersforblade end go information_schema.routines 是SQL Server 2000开始新加的系统视图,它是以 sysobjects 和 syscolumns 系统表为基础建立的系统视图。它的字段更具备可读性。 用上面那个写法都没有问题。 在SQL Server 2005 以及 2008 的默认模板中,使用的是第一种写法。 显然,我们最好用经过整合后,更具备可读性的视图 information_schema.routines 。 参考资料: SQL Server 2008 联机丛书 对routines 视图的介绍
数据库中User和Schema的关系
ROUTINES
March 12 EditPlus 多行合并的方法March 11 VS2008的DataBase Project的项目模板目录公司正在统一存储过程的编写规范,为了更宜用,我们就修改了SQL Server Management Studio 和 Microsoft Visual Studio 2008 的模板文件。 SQL Server Management Studio 的模板文件所在的目录请参看我之前的博客: 改变 SQL Server Management Studio的模板 Visual Studio 2008 的DataBase Project(如下这个数据库项目)的模板则在 C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\Templates\Database Project Items 这个目录下。 注意:这跟其他类型项目的模板不是一个目录。 我这里要修改的模板就是下面方式建立的存储过程的模板。
额外多说一句,我是通过下面这个工具找到这个目录的。 Process Monitor 参考资料: |
|
|