hbzhang

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

2013年6月20日

摘要: 一年前,我们开始利用.Net 4.0的TPL(Task Parallel Library)并行计算技术对复杂计算的功能节点进行性能优化,这些复杂计算往往会包含大量对数据库的操作。在应用TPL时我们发现,如果每个Task都开启独立事务(RequireNew)的话,那么一切工作正常。但是,如果每个Task需要与父线程工作于同一个事务中(Required),则多线程并行计算时会经常性地抛出“其他会话正在使用事务的上下文”的错误(Transaction context in use by another session)。 在解决这个问题的过程中,我们惊讶地发现MSDN中所有关于TPL的代码示例,竟然完全没有涉及数据库操作的示例。 阅读全文
posted @ 2013-06-20 00:33 hbzhang 阅读(1448) 评论(0) 推荐(1) 编辑

2012年2月27日

摘要: 问题简述 客户的一台测试服务器出现IIS进程无法启动的现象。Windows事件查看器给出如下信息: 现场已经检查过IIS相关配置信息,没有发现问题。另外,也使用过aspnet_regiis.exe来重新注册,但仍然不能解决问题。 初步分析 仔细检查Windows事件查看器给出的信息,基本都是连续5次警告后,接着一个错误。警告信息如下: 这说明是IIS连续5次都未能为应用程序池”DefaultAppPool”成功创建w3wp进程,于是自动禁用了应用程序池。通过EventID=5022可以检索到更多信息: http://technet.microsoft.com/en-us/library/c.. 阅读全文
posted @ 2012-02-27 23:59 hbzhang 阅读(1740) 评论(3) 推荐(1) 编辑

2012年2月12日

摘要: 缘起 最近在用AQTime分析一个功能节点的性能问题时,注意到AQTime给出的性能数据存疑: BulkCopyTool是程序员写的一个工具类,利用Ado.net的SqlBulkCopy特性来快速... 阅读全文
posted @ 2012-02-12 01:37 hbzhang 阅读(2046) 评论(4) 推荐(0) 编辑

2012年1月15日

摘要: 问题背景 由于性能方面的考虑,我们基于B/S架构的程序要求客户最好使用IE8及以后的版本。由于IE8支持兼容性视图模式,同事写的检查IE版本的代码在工作中发现并不可靠,为此花费时间研究了一下这个问题。本文记录下一些研究心得。 注:约束是在前端使用JS脚本检测,因此忽略掉Asp.net服务端HttpBrowserCapabilities相关内容。 如何限制只检测一次 如果checkIEVersion分布在各个页面的onload事件中(例如通过asp.net的母板),那么访问每个页面都会有一次消耗。合适的方法是只在网站的default.html文件中进行IE版本检查,这样可确保访问网站时只检测一次 阅读全文
posted @ 2012-01-15 21:37 hbzhang 阅读(988) 评论(0) 推荐(0) 编辑

2012年1月6日

摘要: 引言 .Net 4.0重构了StringBuilder的实现,采用了新的数据存储方式,不仅在效率上有大的提高,并且彻底避免了中间处理过程出现临时String对象进入LOH大对象堆的情况。本文对此进行分析。 回顾.Net 2.0的StringBuilder实现 Reflector查看StringBuilder的实现: 其内部数据存储结构为string(对应成员变量m_StringValue)。StringBuilder的构造函数可以依据指定的字符串和容量来初始化,默认为空串(string.Empty),默认容量为16。构造函数使用string的GetStringForStringBuilder. 阅读全文
posted @ 2012-01-06 00:35 hbzhang 阅读(1095) 评论(3) 推荐(5) 编辑

2011年12月15日

摘要: 引言 想升级到.Net 4.0已经很有一段时间了,本来是应该把各个工程文件都升级的,但由于种种原因,一直没有太合适的时机。考虑.Net 4.0可以做到版本想下兼容,因此在近期采用保持dll不变,而仅仅将程序运行环境升级到.Net 4.0的策略进行了一次升级工作。我们的程序为一个Web应用,在升级过程中遇到了两个比较有意思的问题,特予以记录。 主要的升级工作 对于Web应用,主要的升级工作其实就是手工更改web.config文件,主要参考了以下文档: How to: Upgrade an ASP.NET Web Application to ASP.NET 4 另外,为httpRuntime.. 阅读全文
posted @ 2011-12-15 00:26 hbzhang 阅读(872) 评论(1) 推荐(0) 编辑

2011年12月3日

摘要: 引言 以个人的经验,在.Net下所有的OOM问题都是有解的,但有一个唯一的例外,就是GC大对象堆的碎片化问题。.Net的GC程序有一个致命缺陷,就是从来不对大对象堆LOH(Large Object Heap)进行内存整理。随着时间的推移,一个持续运行的程序必然面对LOH碎片化的困境。如果程序足够好,例如只有很少量的大对象或者创建大对象的频率足够低,那么LOH碎片化的几率就会降低,但也仅仅是降低而已。对于一个实际的企业应用程序,由于不可能避免大对象的分配,也就不可能避免LOH的碎片化问题,从而也就无法从根本上避免OOM问题。以后有时间再详细探讨.Net GC程序的各个特性,本文先点到即止。 问题 阅读全文
posted @ 2011-12-03 00:14 hbzhang 阅读(430) 评论(1) 推荐(0) 编辑

2011年11月28日

摘要: 引言 在32位环境下,虚拟内存空间是一种宝贵的计算资源。普通情况下,4G虚拟内存中只有2G可以供应用程序使用。即便打开Windows操作系统的3GB开关,也只有接近3G的虚拟内存可用。许多在32位环境下运行的大型企业应用程序,都会面临OOM(OutOfMemory)问题。以个人的经验,.Net的GC Heap在800M以内时,系统会有较好的性能表现。当GC Heap超过800M时,GC效率即开始大幅下降。若GC Heap达到1.1G ~ 1.3G这个区间,往往就会出现OOM问题。从操作系统分配内存的角度看,OOM的原因只有一个,就是无法在VM中找到可用的连续内存空间,不能满足内存分配需求。造成 阅读全文
posted @ 2011-11-28 14:39 hbzhang 阅读(588) 评论(5) 推荐(1) 编辑

2007年12月20日

摘要: 今天看了朋友blog的一篇文章,也来谈一下ID生成算法。 对于一个大型系统,数据库ID的选择非常重要。以前做的一套系统,选择了GUID类型,导致数据库空间占用很大。记得还专门搞过一次会议讨论优化方案,可惜过于拘泥于分布式数据集中时对唯一性的要求,没有放开思路。 在开发新的系统时,这作为一个基本设计点被首先考虑。其实在编码上做点手脚,long型的ID也可以满足分布式数据ID唯一的要求,方法就是把Si... 阅读全文
posted @ 2007-12-20 20:45 hbzhang 阅读(1510) 评论(0) 推荐(0) 编辑