我正在开发一个在生产环境中运行的一对一聊天应用程序。它使用 StropheJS 通过 BOSH 连接到 Ejabberd 服务器(使用 ejabberd 的默认连接管理器)。我们面临的主要问题是,有时消息需要很长时间才能到达另一端(约 30 秒左右),而其他时候则很快到达。类似这样——
用户 A 发送一条消息
用户 B 立即收到
---- [立即发生更多消息交换] -----
用户 A 发送消息
B 未收到消息
用户 A 发送另一条消息
B 仍然未收到消息
...
...
(20-30 秒后) B 同时收到两条消息(不是单条消息,但它们之间没有任何明显的时间间隔)
除聊天之外,网络应用程序的其他部分运行良好。
我很难弄清楚确切的瓶颈是什么。它运行在 Ubuntu 10.04 实例上(2 GB 内存 + 4 GB 交换空间)。
我应该提到的一件事是,一台机器用于托管所有内容——apache2、mysql、ejabberd、rabbitmq、mongodb、消息队列工作者和由 apache2 使用 mod_wsgi 提供的 python web 应用程序。此外,apache 还提供一些(非常少的)静态文件并将 BOSH 请求代理到 ejabberd。在任何时候,apache 都有最大进程数(大约 40),并使用 700-800 MB 的内存,所以我猜它正在做大部分工作。每天,它平均处理 20 万个请求(这个数字是从访问日志中获得的)
我们已将静态文件移至 CDN 提供服务(这显著提高了性能),并且还记录了慢速查询并通过创建索引进行了优化,这再次提高了整体性能,尽管我计划明天再次进行练习。
是否存在可以遵循的系统方法来解决瓶颈。
我也很困惑,
- 切换到 nginx 是否会提高性能
- 是否是时候将东西移到他们自己的服务器上,也许他们正在争夺单台机器上的资源?
- 升级机器的内存
- 对 http 服务器进行负载平衡(尽管我对此有点怀疑,因为 New Relic 显示在请求排队上花费的时间几乎可以忽略不计。)
- 可以在前端/后端进行哪些类型的测量来获得想法?
PS:如果能推荐一些可以阅读的书籍来了解服务器管理/架构/调优的基础知识就更好了。
答案1
我想说的是,你在一个盒子上放了很多东西。内存只是一个指标。当你获得流量时,你可能会遇到 CPU 瓶颈,或者你限制了 I/O。iostat
这将给出关于磁盘活动的想法。如果你将服务移动到它们自己的服务器上(将你的 Web 服务器与 jabber 服务器分开),你可能会看到问题消失。