Я работаю над приложением для индивидуального чата, работающим в производственной среде. Он использует StropheJS для подключения к серверу Ejabberd через BOSH (используя диспетчер соединений ejabberd по умолчанию). Основная проблема, с которой мы сталкиваемся, заключается в том, что иногда сообщениям требуется много времени, чтобы добраться до другого конца (~ 30 секунд или около того), в противном случае они достигают мгновенно. Что-то вроде этого --
Пользователь А отправляет сообщение
Пользователь Б получает мгновенно
---- [еще один обмен сообщениями, который происходит мгновенно] -----
Пользователь А отправляет сообщение
B не получил сообщения
Пользователь A отправляет другое сообщение
B по-прежнему не получил сообщения
...
...
(Через 20-30 секунд) B получает два сообщения вместе (не как одно сообщение, но без заметного интервала времени между ними)
Помимо чата, остальные части веб-приложения работают нормально.
Мне трудно понять, в чем именно заключается узкое место. Он работает на экземпляре Ubuntu 10.04 (2 ГБ памяти + 4 ГБ подкачки).
Я должен упомянуть, что одна машина используется для размещения всего - apache2, mysql, ejabberd, rabbitmq, mongodb, рабочих очереди сообщений и веб-приложения python, обслуживаемого apache2 с использованием mod_wsgi. Кроме того, apache также обслуживает некоторые (очень немногие) статические файлы и передает запросы BOSH к ejabberd. В любое время apache имеет максимальное количество процессов (около 40) и использует 700-800 МБ памяти, поэтому я предполагаю, что он выполняет большую часть работы. В день он обслуживает в среднем 200 тыс. Запросов (эта цифра получена из журналов доступа).
Мы переместили статические файлы для обслуживания из CDN (что значительно повысило производительность), а также зарегистрировали медленные запросы и оптимизировали их путем создания индексов, что снова привело к общему увеличению производительности, хотя я планирую повторить это упражнение завтра.
Есть ли систематический подход, который можно использовать для устранения узкого места?
Я также не понимаю,
PS: Было бы также здорово получить некоторые предложения по книгам для чтения для понимания основ управления / архитектуры / настройки сервера.
Я бы сказал, вы многое вкладываете в одну коробку. Память - это всего лишь один показатель. Вы можете столкнуться с узкими местами ЦП, когда получаете трафик, или ограничиваете ввод-вывод. iostat
даст представление об активности диска. Вы, вероятно, увидите, что проблема исчезнет, если вы переместите службы на их собственные серверы (ваш веб-сервер должен быть отдельным от сервера jabber).