我目前正在使用 AWS 基础设施来托管我的移动 Web 应用程序。我使用 Apache Web 服务器 mod_jk 将请求传递给 Tomcat,后者使用连接池进一步与 MySQL DB 通信。最近,服务器响应缓慢。原因之一是所有使用该应用程序的用户以 15 分钟的间隔随机触发一个请求(LocationUpdate)。我认为这就是服务器速度变慢的原因。另一个原因是我们也有很多用户。我想知道如何对此进行负载平衡。
- 我不确定 Apache 是否无法处理这么多的网络请求。
- 或者是 Tomcat 无法处理它们。
所以不确定我该如何处理。要确认哪些配置设置。我确实在互联网上搜索过,但不确定如何解决。我应该增加 Tomcat 堆大小吗?
答案1
首先,您需要重新考虑,您的应用是否真的需要每 15 分钟“打电话回家”一次!这不仅会给您的服务器带来负担,还会给移动网络、人们的手机和他们的数据账单带来负担。特别是,如果这是位置更新,如果 GPS 坐标与上次传输更新相比的变化很小,则应用可能会被编程为不发送位置更新。
其次,您必须调试导致 Web 服务器负载增加的原因。使用top
显示负载详细信息。特别值得关注的行如下所示:
Cpu(s): 3.0%us, 6.0%sy, 1.6%ni, 85.9%id, 0.4%wa, 0.0%hi, 3.0%si, 0.0%st
这是来自一个负载较轻的服务器,空闲率为 86% - 所以在我的示例中一切正常。对于您来说,它可能看起来像以下内容:
Cpu(s): 3.0%us, 6.0%sy, 1.6%ni, 4.9%id, 81.4%wa, 0.0%hi, 3.0%si, 0.0%st
过度的“等待”意味着您的作业正在等待磁盘完成读取或写入数据。如果您遇到此问题,请尝试减少不必要的磁盘写入(请谷歌搜索以noatime
了解更多信息),并尝试降低数据库的写入安全级别,以确保安全。例如,如果在发生电源故障时位置更新未正确写入磁盘,则对您的服务的影响可能很小,因为在修复故障组件后恢复电源时,位置信息无论如何都会过时。另一方面,如果有新用户注册,您希望将这些写入主帐户数据的操作保持同步,这样您就不会因电源或服务器故障而丢失帐户。
如果即使在这些更改之后,等待时间仍然很长,请考虑更快的磁盘:具有两个甚至三个磁盘或 SSD 的 RAID 1,然后再考虑负载平衡。
如果您的负载线如下所示:
Cpu(s): 43.0%us, 42.0%sy, 1.6%ni, 4.9%id, 5.4%wa, 0.0%hi, 3.0%si, 0.0%st
几乎所有 CPU 时间都花在用户空间(us)和系统模式(us)上,那么您的 CPU 就超载了。检查顶部输出中标题下方的行,找出哪些服务(如 apache2、tomcat、MySQL)的 CPU 负载较高。然后优化您的 Web 应用程序以减少 CPU 使用率。如果这没有帮助,请为您的服务器添加更多 CPU 核心。
最后,但并非最不重要的一点,使用 检查您的内存free
。如果使用了大量内存,或者交换使用量超过几千字节,请添加更多内存。