我正在运行大型ERP系统在以下服务器配置上。该应用程序是使用AngularJS 和 ASP.NET 4.5
Dell PowerEdge R730(四核 2.7 Ghz、32 GB RAM、5 x 500 GB 硬盘、配置 RAID5)软件:主机操作系统是 VMWare ESXi 6.0 两个虚拟机在 VMWare ESXi 上运行,一个是具有 16 GB 内存的 Windows Server 2012 R2分配...其中包含 IIS 8 服务器使用我的应用程序代码 另一台虚拟机也是 Windows Server 2012 R2,配备 SQL Server 2012 和 16 GB 内存已分配....这只包含我的应用程序数据库。
您看,为了实现负载平衡,我将应用程序服务器和数据库服务器分开了。
我的应用程序包含一个注册模块,预计负载会非常高(10 分钟内约有 10,000 名访问者)
为了支持这种数量的请求,我在 IIS 服务器中完成了以下操作 -> 将应用程序池长度中的请求队列增加到 5000 -> 为 aspx 文件启用输出缓存 -> 在 IIS 服务器中启用静态和动态压缩 -> 将每个应用程序池的虚拟内存限制和私有内存限制设置为 0 -> 将每个应用程序池的最大工作进程数增加到 6
然后我用加特林机枪在我的应用程序上运行负载测试。我注入了一次可容纳 500 名用户进入我的注册模块。
然而,我看到我的 RAM 只使用了 40% / 45%。每个工作进程最多只使用 130 MB 左右。
gatling 报告说,我的大约 20% 的请求都出现了 403 错误,而且60% 的 HTTP 请求的响应时间超过 20 秒。
单个用户在大约 3 分钟的时间内发出 380 个 HTTP 请求。单个用户的总数据传输量为 1.5 MB。我曾这样模拟了 500 个用户。
我的服务器调优中是否缺少了什么?我已经调优了应用程序代码,以尽量减少内存泄漏、增加超时时间等等。
答案1
将您的 SQL Server 放在专用主机上。在访问物理资源之前,您有两代客户操作系统在此运行。您有虚拟机管理程序作为基础操作系统,子客户机是 Windows Server 主机,孙操作系统是 SQL Server,它获取磁盘和 RAM 块并使用自己的命名空间进行管理。如果您有专用磁盘和专用网络,您可以缓解其中的一些问题。不要允许 VM 可重新定位。
http://www.tpc.org/tpctc/tpctc2009/tpctc2009-13.pdf
您将对共享资源进行一些仲裁,因为您在两个主机之间分配了 32GB,这为虚拟机管理程序留下了恰好为零的空间,因此虚拟机管理程序将开始仲裁对共享段的访问,同时为自己留下一个块。如果您在同一个操作系统实例中安装两个组件,并使用本地命名管道进行与 SQL Server 的所有通信,那么您实际上会获得更好的性能。就目前情况而言,您正在为虚拟机管理程序物理主机、两个操作系统实例和正在运行的孙操作系统的超额订阅产生大量开销。
“单个用户发出 380 个 HTTP 请求...”
假设这些并非全部都是动态元素,这里还有很多静态元素,如图像、样式表、JavaScript、字体等。在这些静态元素前面放置一个 CDN,这样静态组件的负载就会降至几乎为零。您希望资源和负载专门用于一个动态部分,即表单提交的数据,而不是一般的文件处理。哎呀,我甚至建议您希望客户端的缓存年龄至少与您的构建部署持续时间一样长。每周的周六和午夜进行部署,然后将缓存年龄设置为在周六午夜加上每次构建的一周后到期。这将使您的 CDN 保持良好的种子状态,您可以避免点击、网络负载和服务器负载。