Як випливає з назви запитання, мені важко зрозуміти, що можна покращити в моєму додатку (або налаштованому на ОС, 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) з 4gigs ОЗУ та 2 ядрами.
Додаток виробляється з декількох місяців (він працював на одній коробці до декількох тижнів тому) і ним користуються близько 18 тисяч користувачів на день. Це завжди добре працювало, окрім одного головного питання: зниження рівня продуктивності. З використанням кількість процесорів, використовуваних кожним процесом, зростає, поки він не встановить статут працівника (який більше не подаватиме запити). Я тимчасово вирішив це, перевіряючи процесор, який використовує кожен працівник щохвилини, і перезапускати його, якщо він досягає 98%. Тому тут проблема в основному процесорі, а не оперативній пам'яті. Оперативна пам’ять вже не є проблемою, оскільки я оновив до socket.io 0.9.14 (у попередній версії просочувалася пам'ять), тому я сумніваюся, що це проблема витоку пам'яті, тим більше, що зараз це процесор, який досить швидко зростає ( Я повинен перезапустити кожного працівника приблизно 10-12 разів на день!). Оперативна пам’ять, яка використовується, також зростає, якщо чесно, але дуже повільно, 1 концерт кожні 2-3 дні використання, і дивно, що він не виходить, навіть коли я повністю перезавантажую всю програму. Він випускається, лише якщо я перезавантажую сервер! цього я насправді не можу зрозуміти ...
Зараз я виявив nodefly, що дивовижно, тому я нарешті можу побачити, що відбувається на моєму виробничому сервері, і я збираю дані вже через пару днів. Якщо хтось хоче бачити діаграми, я можу надати вам доступ, але в основному я бачу, що у мене між 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-програміст, а не адміністратор sys, тому я не знаю, скільки навантажень я повинен очікувати для роботи зі своїми серверами, але, безумовно, він не працює так, як слід. Додаток є стабільним інакше, і ця остання проблема заважає мені відправляти готові мобільні версії програми, оскільки, очевидно, вони принесуть більше навантаження і, врешті-решт, завершать роботу всього!
Сподіваюсь, є щось очевидне, що я роблю неправильно, і хтось допоможе це помітити ... сміливо запитайте мене за додатковою інформацією, і мені шкода за тривалість питання, але це було потрібно, я вірю ... Спасибі заздалегідь!
top
коли використання процесора близько 100%?