我们在Tomcat8.5中运行了一个基于Ajax的Java /Hibernate应用程序。该应用程序的性能是可以接受的,但不是闪电般的速度。一个典型的插入记录需要3-4秒。
05 Nov 2019 14:55:41,686 INFO Insert Start
...
05 Nov 2019 14:55:45,766 INFO Insert End我们有所有标准的东西,比如DB索引等等。它们都在工作。
没有人抱怨,但它不是像StackOverflow.com这样的超级流畅的网络应用程序。StackOverflow速度如此之快,所有操作都需要不到2秒的时间。
哪些硬件改进可以将Web应用程序提升到更高的水平?
我现在了解的另一件事是Hibernate (和类似的ORMs)对于执行程序来说是个坏主意。它们很受欢迎,但如果没有它们,应用程序会有更多的性能提升。
发布于 2019-11-05 21:10:02
在将性能问题归咎于Hibernate之前,您应该分析应用程序。通过分析给定的请求(如果整个应用程序感觉缓慢,只需接受任何请求),您就可以更准确地了解什么是慢的。根据您的发现,改进性能的解决方案将完全不同。下面是一些例子:
这些只是少数几个例子,可能会发生在罩下。同样,在尝试优化之前,您必须精确地找出导致缓慢的原因,特别是如果您唯一的优化想法是切换到另一种技术或要求更昂贵的硬件。一旦您找到了瓶颈,您可能会找到解决它的方法。这可能是代码或配置中的简单更改。也许你需要更昂贵的硬件。
还有几个项目中的一些轶事:
发布于 2019-11-05 20:33:08
你可能不会喜欢这个答案,但是.从4秒到2秒可能需要一次架构大修。本质上,这可能和在Tomcat8.5中运行的Java /Hibernate应用程序的速度一样快。
IIS应用程序在ASP.NET和Server上运行:每页4至7秒。
在IIS和Server上运行的相同的应用程序(就像堆栈溢出一样):每页1到3秒。
发布于 2019-11-05 22:02:12
调试性能问题的第一步是了解体系结构中的瓶颈。在单块应用程序(即传统的n层开发)中,您有几个潜在的瓶颈:
如果您的应用程序需要花4秒时间来响应请求,那么请查看这三件事情,找出什么是最大的。每个项目可能有不同的原因:
如果所有这些都没有达到最大值,而且仍然存在性能问题,那么很有可能您会受到资源锁定的影响。如果一个人正在更新一个表,而另一个人正在查询该表,则有可能更新记录(S)会导致另一个人等待。如果您能够处理脏读取,则可以减少数据库中的锁定开销。
在一个单一的环境中,你将不可避免地遇到更大的硬件所能达到的极限。在这一点上,你真的需要考虑扩大规模。堆栈溢出可以使系统扩展并保持性能。您可以选择一个完整的微服务路线,或者只在多台服务器上托管您的单块应用程序。
您必须努力实现扩展的主要目的是完全避免服务器端会话。在“无共享”环境中,没有理由有服务器会话。进入会话变量的信息要么进入数据库,要么存储在浏览器的前端代码中。
您会想要开始使用集群。具有多个集群节点的数据库可以将工作分散到每个节点,以平滑负载。这组应用服务器可以简单地承载应用程序的额外副本,并在前面使用一个负载均衡器。不需要任何会话亲和力,您可以使用简单的循环平衡,这是快速的。
接下来,您将需要查看缓存服务器,如Redis或其他类似的服务器。如果您的资源需要时间整合,但不要经常更改,这是使响应时间非常快的最后一块拼图。
如果你想到网络上的任何快速响应站点,我保证他们已经投入了大量的资金来扩大规模,而不是扩大规模。他们这样做的程度与每个环境都有很大的不同。例如,Stack能够在其核心上使用混合单块体系结构做很多事情,但是它们在9种不同的web服务器(参考文献)上托管。
底线是,当您投资于扩展所需的更改类型时,它会花费大量的精力,而您的日常托管成本也会增加。
https://softwareengineering.stackexchange.com/questions/400617
复制相似问题