我有一个社交应用程序,用户可以在其中进行其他社交应用程序的常规操作;每小时上传多个文本和照片帖子、点赞和评论(每个操作都会创建一条通知)、查看自定义/原生广告、阻止用户(及其内容)等。
应用程序在Parse Server
版本上运行2.8.4
。对于那些不知道的人,使用 和Parse Server
。Node.js
我有 1 个服务器用于应用程序,另一个服务器用于数据库,两者都托管在 DigitalOcean 上。express
MongoDB
它们的规格如下:
Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz x4
8 GB of RAM
SSD
Ubuntu 16.04
通常情况下,我们每天有大约 100-150 名同时在线用户,他们每天发布大约 500 篇帖子、2000 条评论、2000 个赞,并且每个人通常停留大约 40 分钟。但今天我们达到了 600 名,应用程序完全冻结了!我看到了 DigitalOcean 提供的图表,每个指标(CPU、RAM 等)都正常,最多为 40-50%。另一方面,入站和出站带宽达到峰值!
如下图所示,我们每天的入站速度约为 6 Mbps,出站速度约为 2.5 Mbps。今天,我们的入站速度超过 10 Mbps,出站速度超过 15 Mbps!
该应用程序在单个 CPU 上运行
pm2
。在事故发生期间,我们尝试使用所有 4 个 CPU,但似乎没有任何改善……它仍然冻结。我们目前也没有缓存任何内容(但很快就会缓存)。数据库已编入索引,但除此之外,没有做太多改进。所有照片都存储在S3
DigitalOcean 中。
问题是,考虑到其他所有指标都处于正常高位,并且数据库结构相当完善,您是否认为此带宽峰值可能会导致服务器完全冻结,或者根本不会影响服务器? 可能是我们使用的服务器不够好,无法支持该应用程序?
另外,您认为我们的基础设施应该支持多少用户?我知道这取决于很多因素,但根据我的描述,无法处理 600 个用户是否正常?
答案1
这看起来确实像是您达到了服务器或数据库的资源限制。
你认为这种带宽峰值会导致服务器完全冻结吗
首先,您需要查看日志和指标,找出“完全冻结”到底是什么。您的帖子中缺少得出合理结论所需的基本信息,即冻结时的 MongoDB 指标和实例指标。如果您尚未设置MongoDB 监控,这可能是这样做的好时机。
对于MongoDB来说,经常遇到的限制有:
- CPU 使用率达到最大值(特别是如果您大量使用聚合)
- 底层节点磁盘的 IOPS 积分已用完(通常表示工作集的 RAM 短缺)
对于服务器实例,它可能是:
- CPU 使用率达到最大值
- RAM 使用率已达到最大值
- 网络限制
根据您的基础架构,还可能存在一些更模糊的因素,例如反向代理或负载均衡器的限制。此外,在 Digital Ocean 的虚拟化环境中,可能还存在其他“人为”限制。
您认为我们的基础设施应该支持多少用户?
这取决于您的应用在流量增加时所需的资源,以及服务器实例、数据库实例和网络之间的限制。每个应用都不同,因此没有通用的答案。
一般来说,考虑到此类峰值,您会根据历史数据不断调整资源以适应预测的流量。对于面向用户的服务,设置负载平衡器和自动扩展组来处理流量波动通常在经济和运营上都是合理的。您还可以更好地应对可能导致负载增加的恶意攻击,随着您的服务越来越受欢迎,这种攻击的可能性和频率也会越来越高。