应用程序托管在IIS 8.5的专用服务器上,配置双xeon E5 2620 v2,64 GB Ram,1 TB HDD。
Server Technolgy: Web api 2,Angular js,Entity framework 6.0,SQL server 2014。 客户端:带有angularjs的web浏览器和使用http请求调用web api方法的android移动应用程序。 额外工具:Autofac 3.5,Automapper,newtonsoft json, 在引用一些帖子之后,我们从连续调用方法中删除了automapper。
每当 100用户将在线cpu消耗几乎 100%。我已经尝试了这么多调试器应用程序,性能监视器,并尝试获得解决方案,但没有运气,我已经生成一些功能couse问题的报告。根据一些调试工具,我得到了以下结果,plz见下图。
但仍未发现问题,
我们已经托管了app并看到了这个问题,我们认为它有些编码问题和优化。所以我们已经开始优化应用程序并在服务器中更新它,并再次看到使用情况,但没有任何更好的性能。
根据用户请求,每个用户将获得每秒2个请求和一个未继续的输入操作。可能是它的分钟或更长时间。
100位用户启动以上操作后 cpu达到99%至100%,当用户增加应用程序变慢时,当有100位用户时,一个请求完成大约 500ms到800ms 。在200个用户到达后,它将在 2秒到4秒内完成,并且变得越来越慢。根据一个frnd也有相同的应用程序,相同的用户请求,他们已经在VPS上发布了,他们是2000用户正在工作的时候仍然没有关闭,因为与他们相比,我有专用的服务器没有资源分配给任何人。所以我想我的性能会比我的frnd
更好根据一些专家的建议,它阻止了一些请求,可能是EF或iis。 但是如何以及为什么。所有代码都像往常一样。
我希望我能尽快得到解决方案,现在这对我来说是个问题。
提前致谢。
答案 0 :(得分:0)
您有很多工具不断监控服务器影响吞吐量。尝试从生产环境中卸载它们。理想情况下,不建议在实时环境中使用此类工具,但可以在测试环境中安装。
另请提及您如何测试100或200个请求?,您使用哪些工具发送100-200个请求?
答案 1 :(得分:-1)
毫无疑问,您的硬件和堆栈可以处理数千个活跃用户。删除Automapper并不是您应该首先考虑的一项举措。
对于上面提到的堆栈,最明显的问题通常是使用ORM而不考虑底层数据库。延迟加载,SELECT N + 1问题等经典列表。解决此类问题的最佳方法是使用一些分析工具。从SQL Server Profiler开始,查看您有多少数据库请求。您可能希望使用EFProf来确定每个会话是否有太多数据库请求,通常您应该只有一个或两个,无论您的API调用返回多少元素。如果最终发现一个会话中的数据库调用数与API调用返回的元素数相关,则为SELECT N+1。
如果您发现每个会话的数据库查询数量很少且不变,那么您可以开始查看数据库本身,分析执行计划并添加索引。
正如您从我的回答中可以理解的那样,我怀疑数据库可能是一个问题。但是,不要进入“让我们改变数据库”的陷阱,因为虽然我不是一个大的SQL Server粉丝,但我知道这个数据库能够做很多事情并且能够快速完成。一百个用户是启动SQL Server的有趣负载。所以很可能你的代码如何使用它,如果你不开始查看你自己的代码并且不再责备你的堆栈,它将与任何其他数据库完全相同。
您还可以尝试通过将Web服务器和SQL Server拆分为两台不同的计算机来隔离问题。