我们目前正在 Apache 1.3 上运行 Perl Web 应用程序(我知道这已经过时了,但目前我们对此无能为力)。在一天中,随着访问该应用程序的用户数量增加,服务器的响应速度越来越慢,直到最终不可用。此时,我们会停止 Apache 服务器,直到没有活动连接,然后重新启动服务器。这远非理想的解决方案,也无法解决根本问题。
我们可以做些什么来找到问题的根源?我们可以做些什么来在短期和长期内解决这个问题?
答案1
一些一般的想法:
- 使用“top”和“free”检查高负载期间服务器的状态。通常,瓶颈是 CPU、内存或 IO,但您的应用/设置也可能存在特定问题(例如,并发用户数量增加时出现死锁问题)。
- 如果问题出在内存上(尤其是当它开始分页交换时),那么您可以添加更多 RAM 或从 Apache 中删除任何不必要的模块。默认配置通常会加载所有内容,这会使 Apache 在每个客户端上消耗大量内存。虽然这似乎不直观,但您也可以减少 MaxClients 的数量,以防止 Apache 使用过多内存而开始交换。
- 如果问题出在 CPU 上,您可以考虑购买更强大的服务器或尝试优化您的应用程序。我不熟悉 Perl,但对于 PHP,安装 APC 之类的操作码可以通过缓存已编译的 PHP 脚本来减少 CPU 的使用。同样,安装 Squid 或 Nginx 之类的缓存层可能有助于减少对 Apache/Perl 层的请求,具体取决于您的情况中可缓存的内容。
- 可以通过获取更快的磁盘和/或设置 RAID(提高性能的手段)来解决 IO 问题。添加缓存层和/或增加内存也可以帮助减少 IO 负载,因为这样可以将更多应用保留在内存中,减少对磁盘的接触。
- 除非问题仅仅是 Apache 或应用程序配置错误,否则您的“最佳”解决方案可能是研究添加一些缓存或移动到更强大的服务器,具体取决于哪种方式对您来说最容易。
答案2
似乎您遇到了可扩展性问题。您有两个选择:
1- 通过添加更多 CPU、RAM 等升级服务器规格。此选项可能很昂贵,并且长期来看可扩展性不够。此外,强烈建议您使用另一台服务器来消除单点故障。
2- 添加更多服务器并使用负载平衡器在所有服务器之间分配负载。此选项可能比前一个选项更适合解决可用性问题,特别是如果您目前只有一台 Web 服务器。添加更多服务器可提供更高的长期可扩展性,并且可以使用多个不太昂贵的硬件来实现。