Как следует из названия вопроса, мне трудно понять, что можно улучшить в моем приложении (или настроить в ОС, Ubuntu) для достижения приемлемой производительности. Но сначала я объясню архитектуру:
Внешний сервер - это 8-ядерный компьютер с 8 ГБ оперативной памяти под управлением Ubuntu 12.04. Приложение полностью написано на javascript и выполняется в node.js v 0.8.22 (так как некоторые модули, похоже, жалуются на более новые версии узла), я использую nginx 1.4 для прокси-трафика http с порта 80 и с 443 до 8 рабочих узлов, которые управляются и начал использовать кластер узлов API. Я использую последнюю версию socket.io 0.9.14 для обработки соединений веб-сокетов, для которых я включил только веб-сокеты и опрос xhr в качестве доступных транспортов. На этой машине я также запускаю экземпляр Redis (2.2)
Я храню постоянные данные (например, пользователей и оценки) на втором сервере на mongodb (3.6) с 4 Гб оперативной памяти и 2 ядрами.
Приложение работает в течение нескольких месяцев (оно работало на одном устройстве до нескольких недель назад), и его используют около 18 000 пользователей в день. Он всегда работал очень хорошо, за исключением одной основной проблемы: снижение производительности. При использовании количество процессоров, используемых каждым процессом, увеличивается до тех пор, пока он не проработает статую рабочего (что больше не будет обслуживать запросы) Я временно решил, что каждую минуту проверяю процессор, используемый каждым работником, и перезагружаю его, если он достигает 98%. Так что проблема здесь в основном процессор, а не оперативная память. Оперативная память больше не является проблемой, так как я обновил файл socket.io 0.9.14 (более ранняя версия имела утечку памяти), поэтому я сомневаюсь, что это проблема утечки памяти, особенно потому, что теперь этот процессор растет довольно быстро ( Я должен перезапускать каждого работника примерно 10-12 раз в день!). Объем оперативной памяти растет, если честно, но очень медленно, 1 гиг каждые 2-3 дня использования, и странно то, что он не выпускается, даже когда я полностью перезагружаю все приложение. Выпускается только если я перезагружаю сервер! это я не могу понять ...
Теперь я обнаружил удивительную нодли , поэтому теперь я могу наконец увидеть, что происходит на моем производственном сервере, и я собираю данные уже пару дней. Если кто-то захочет увидеть графики, я могу дать вам доступ, но в основном я вижу, что у меня от 80 до 200 одновременных подключений! Я ожидал, что node.js обработает тысячи, а не сотни запросов. Также среднее время отклика для http-трафика колеблется между 500 и 1500 миллисекундами, что, на мой взгляд, очень много. Кроме того, в тот самый момент, когда в сети 1300 пользователей, это вывод "ss -s":
Total: 5013 (kernel 5533)
TCP: 8047 (estab 4788, closed 3097, orphaned 139, synrecv 0, timewait 3097/0), ports 0
Transport Total IP IPv6
* 5533 - -
RAW 0 0 0
UDP 0 0 0
TCP 4950 4948 2
INET 4950 4948 2
FRAG 0 0 0
который показывает, что у меня есть много закрытых соединений в ожидании времени. Я увеличил максимальное количество открытых файлов до 999999, вот вывод ulimit -a:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 63724
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 999999
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 63724
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Поэтому я подумал, что проблема может быть в http-трафике, который по некоторым причинам насыщает доступные порты / сокеты (?), Но для меня не имеет смысла одно: почему, когда я перезагружаю работников, и все клиенты повторно соединяются в течение нескольких секунд, нагрузка на процессор работника снижается до 1% и способна правильно обслуживать запросы, пока не будет насыщена примерно через 1 час (в пиковое время)?
Я в основном программист на javascript, а не системный администратор, поэтому я не знаю, какую нагрузку мне следует ожидать от работы с моими серверами, но, конечно, он не работает должным образом. В противном случае приложение стабильно, и эта последняя проблема не позволяет мне отправить готовые мобильные версии приложения, поскольку, очевидно, они принесут большую нагрузку и в конечном итоге приведут к краху!
Надеюсь, что-то очевидно, что я делаю что-то не так, и кто-то поможет определить это ... не стесняйтесь спрашивать меня о дополнительной информации, и я извиняюсь за длину вопроса, но это было необходимо, я полагаю ... заранее спасибо!
top
когда использование процессора близко к 100%?