我们正在致力于购物车网站与超过1万卢特产品,在流行的电子商务应用程序的顶部 - NopCommerce 2.3版(只是向您介绍NopCommerce - 这是一个最好的&流行的开源电子商务应用程序,电子商务应用程序构建于ASP.net版本4和MVC3之上)。该网站出版了两种语言和单一货币。为什么ASP.net网站只有很少的访问者需要高CPU?
大约80个类别和30-40k产品,它工作得很好。我的意思不是很糟糕。但它也不好。只要添加了更多产品,性能问题就开始出现诸如响应时间长(加载超过40-50秒)和CPU使用率高(利用率90-100%)等仅有10-20个用户的症状。
服务器是四核至强处理器采用16 GB的RAM - 在Windows Server 2008 R2,并且工作正常多一个电子商务网站与50K产品定制开发代码 - 几乎没有服用4-8%的CPU。
我们使用缓存来存储主页特色产品和类别菜单在内存中,以避免数据库调用。它只改进了主页。
后来修复问题,我们分析并发现它是目录列表,这导致很多延迟从数据库中获取数据,这是很好地规范化。 SQL服务器似乎需要80-90%的CPU,w3wp占用了30-40%的cpu,这使得网站上只有少数访问者持续不断地导致100%cpu。我们咨询了一些专家,他们建议我们以二进制格式在磁盘上存储非标准化数据以绕过昂贵的数据库连接。我们做了一些研究,并使用Protobuff将非标准化的序列化对象数据存储到只存储目录 - 产品列表页面所需的那些字段的磁盘上。但是由于维护了我们用来创建3个二进制文件的一些规范功能。一个用于产品对象,另一个用于类别说明对象。这两个文件是每个类别。还有一个用于产品和规格映射的文件 - 占用近5 MB。当请求到达时,它从序列化的二进制文件中读取数据并将数据返回给对象。只有当有人根据规格过滤产品时才会读入映射文件。
因此,现在无论何时对类别产品列表页面发出请求,它都会检查是否为该类别创建了二进制文件,是否使用存储过程生成二进制文件,并将对象保存为二进制文件以备后用。如果文件存在,它直接从二进制文件中读取它。有了这件事,我们在加载这个页面时避免了90%的数据库调用。只有几个用户(约30-40),它就像一个魅力。我们可以将每次页面加载的响应时间缩短到700-800毫秒。如果我们查看加载时间,这是一个很大的改进,但CPU仍然处于较高水平。不同之处在于:现在w3wp使用60-70%cpu与20-30个访问者,sql几乎不使用5-8%。
但随着更多的用户appx达到100-120,服务器开始挂起,并且w3wp持续使用超过100%。请求不再以秒为单位,而是需要超过20-25秒才能加载。然后大多数请求从未被服务。当有多个请求来到网站时,我们注意到了这一点。
我们并不擅长序列化和二进制格式。但是我们认为CPU的高使用率是由文件读取操作引起的,或者可能是由于在每个目录页面负载上执行了反序列化操作。
我们正在研究可能的解决方案来解决高CPU使用率问题。可能是什么问题,我们应该在哪里寻找解决办法。你认为,这是文件读取操作还是反序列化造成的?我们应该在db中存储非规范化对象吗?我们有什么替代方案来解决这个问题?
等待你的专家意见。
在此先感谢。
配置您的代码。没有必要“思考”导致高CPU使用率的原因。找出。 – AakashM 2012-02-10 15:49:04
您应该剖析您的代码(http://stackoverflow.com/questions/3927/what-are-some-good-net-profilers)并找出问题所在。另外,如果你看看NopCommerce论坛,你会发现有很多抱怨性能问题......这些问题没有解决...... – 2012-02-10 15:56:00
它是一个迟到的反应,但我们已经设法解决这个问题。我们通过使用几种优化技术优化nopCommerce并将Apache Solr与它集成来解决了这个问题。我们构建与可用于解决问题的插件相同的插件。更多细节可以在这里找到http://www.nopaccelerate.com/?utm_source=stackoverflow&utm_medium=forum&utm_campaign=reference – Krunal 2013-03-02 13:36:48