Трохи тестів продуктивності мережевих фреймворків

Привіт Хабр! Пару місяців тому я захотів провести тестування продуктивності деяких мережевих фреймворків, c метою зрозуміти наскільки велика разбежка між ними. Чи треба використовувати Node.js там, де хотілося б Python з Gevent або потрібен Ruby з його EventMachine.
 
Я хочу звернути вашу увагу на те, що ці матеріали не є керівництвом до вибору фреймворка і можуть містити спірні моменти. Я взагалі не збирався публікувати результати цього дослідження, але коли вони траплялися мені на очі я ловив себе на думці, що це може бути кому-небудь корисно. На цей пост я виділити не більше 4-ох годин, інакше він не з'явився б, тому від орфографічних помилок, як і від будь-яких інших, я не застрахований. Тепер, коли ви до всього готові, я почну закидати вас графіками.
 
 
 

1. Text / Httperf / VPS 1 CPU, 512 RAM

Перший тест я провів на найдешевшому VPS DigitalOcean (1 Core, 512 SSD, 20Gb SSD). Для тестування продуктивності використовувалася утиліта httperf . Що б призвести необхідне навантаження були задіяні VPS такої ж конфігурації, в кількості 5 штук. Для одночасного запуску тесту на всіх клієнтах я використовував утиліту autobench з наступними параметрами:
 
 
autobench_admin --single_host --host1 example.com --port1 8080 --uri1 / --low_rate 50 --high_rate 600  --rate_step 10 --num_call 10 --num_conn 6000 --timeout 5 --clients XX.XX.XX.XX:4600,XX.XX.XX.XX:4600,XX.XX.XX.XX:4600,XX.XX.XX.XX:4600,XX.XX.XX.XX:4600 --file bench.tsv

 
Це тест починає виконання з 50 сполук в секунду (10 запитів через одне з'єднання) і з кроком в 10 з'єднань в секунду досягає 600. Кожен тест встановлює всього 6000 з'єднань і всі запити, що не були оброблені на протязі 5 секунд, вважаються помилкою.
 
Всі HTTP сервери роблять одне і те ж, а саме повертають рядок «I am a stupid HTTP server!» На кожен запит. Результати вийшли наступними (по осі Х — кількість запитів в секунду ):
 
 
Навантаження на процесор
 
 
 
Споживання оперативної пам'яті (у% від 512Mb)
 
 
 
Кількість відповідей
 
 
 
Час відповіді (у мілісекундах)
 
 
 
Кількість помилок
 
 
Як тільки ми досягаємо 100% використання CPU, споживання оперативної пам'яті починає рости, кількість відповідей падає, час відповіді на кожен запит зростає і починають з'являтися помилки. Як я писав вище, кожен запит, який не отримав відповідь на протязі 5 секунд, вважається помилкою і тут саме це і відбувається, це можна простежити на графіку «Час відповіді».
 
 Результати (у дужках кількість оброблених запитів без помилок):
 
     
  1. Gevent (4700 )
  2.  
  3. Express.js (3600 )
  4.  
  5. Eventlet (3200 )
  6.  
  7. Tornado (2200 )
  8.  
 
Я ніколи не буваю задоволений своєю роботою повністю, тому вже через пару годин я вирішив, що тестувати продуктивність на VPS не найкращий вибір. Між фреймворками різниця в продуктивності зрозуміла і якісь висновки зробити можна, але дізнатися скільки клієнтів ми в змозі обслужити на одному ядрі справжнього процесора ми не можемо. Одна справа ділити з кимось невідомі ресурси і зовсім інша коли всі ресурси відомі і в нашому розпорядженні.
 
 
 

2. Text / Httperf / Intel ® Core ™ i7-4770 Quad-Core Haswell, 32 GB DDR3 RAM

Для наступного тесту я орендував виділений сервер у Hetzner (EX40) з процесором «Intel ® Core ™ i7-4770 Quad-Core Haswell» і 32 GB DDR3 RAM.
 
Цього разу я створив 10 VPS, які створюватимуть необхідне навантаження і запустив autobench з наступними параметрами:
 
 
autobench_admin --single_host --host1 example.com --port1 8080 --uri1 / --low_rate 50 --high_rate 1500  --rate_step 50 --num_call 10 --num_conn 15000 --timeout 5 --clients XX.XX.XX.XX:4600,XX.XX.XX.XX:4600,XX.XX.XX.XX:4600,XX.XX.XX.XX:4600,XX.XX.XX.XX:4600 ... --file bench.tsv

 
Це тест починає виконання з 50 сполук в секунду (10 запитів через одне з'єднання) і з кроком в 50 з'єднань в секунду досягає 1500. Кожен тест встановлює всього 15000 з'єднань і всі запити, що не були оброблені на протязі 5 секунд, вважаються помилкою.
 
Вихідний код серверів той же, що і в першому тесті. Запущена одна копія сервера, яка використовує тільки 1 ядро. У цей тест я додав фреймворки Twisted 13.2 та Eventmachine 1.0.3. Споживання пам'яті я видалив з результатів тесту бо різниця, за сучасними мірками, незначна. Не буду тягнути кота за хвіст, ось результати:
 
 
Навантаження на процесор
 
 
 
 
Кількість відповідей
 
 
 
 
Час відповіді (у мілісекундах)
 
 
 
 
Кількість помилок
 
 
 
Тут, як і колись, вперлися в CPU, чого і слід було очікувати. У середньому, продуктивність тут вище в 3 рази, ніж на VPS DigitalOcean (1 Core, 512Mb), з чого можна зробити відповідні висновки про кількість виділених нам ресурсів.
 
 Результати (у дужках кількість оброблених запитів без помилок):
 
     
  1. Eventmachine (подробиці нижче )
  2.  
  3. Gevent (12500 )
  4.  
  5. Express.js (11500 )
  6.  
  7. Eventlet (9000 )
  8.  
  9. Twisted (7000 )
  10.  
  11. Tornado (6500 )
  12.  
 
 

Eventmachine

 
Eventmachine мене здивував своєю продуктивністю і пішов далеко від конкурентів, через що мені довелося збільшити навантаження до 25000 запитів в секунду спеціально для нього. Результат на графіках:
 
 
Навантаження на процесор
 
 
 
 
Кількість відповідей
 
 
 
 
Час відповіді (у мілісекундах)
 
 
 
 
Кількість помилок
 
 
 
У мене є підозри, що і 30 000 запитів він би зміг обробити, але мені треба було рухатися далі, тому я не зміг у цьому переконатися. Взагалі я до цього моменту вже знав, що буду використовувати Python для свого проекту, так що фреймворки на інших мовах мені потрібні були просто для порівняння.
 
 
 

3. Files / Siege / Intel ® Core ™ i7-4770 Quad-Core Haswell, 32 GB DDR3 RAM

Як я писав вище, я не буваю задоволений своєю роботою повністю, тому я ліг спати з почуттям виконаного обов'язку, а прокинувся з думкою «потрібно більше тестів!». Віддавати рядок тексту на кожен запит це звичайно добре, але це не єдина функція веб-сервера, значить будемо роздавати файли.
 
Для цього тесту я використовував 10 VPS, що б створити необхідне навантаження. Експериментальним шляхом я з'ясував, що на 1 VPS DigitalOcean, в середньому, виділений канал 100Mbps. Сервер у мене був з каналом 1Gbps і мені треба було його повністю навантажити. Файлами для роздачі послужили зображення з інтернет-магазину в кількості 10 000 штук, різних розмірів. Для створення навантаження я використовував утиліту siege з наступними параметрами:
 
 
siege -i -f fileslist.txt -c 55 -b -t1M

 
У filelist.txt зберігається список файлів, встановлюється 55 з'єднань і через них ми починаємо довбати сервер запитами в перебігу 1-ої хвилини. Файли при цьому вибираються випадковим чином зі списку fileslist.txt. Безумовно варто врахувати, що тест цей запускається на 10 машинах одночасно, а значить ми встановлюємо не 55, а 550 одночасних з'єднань. Більше того, цю опцію я постійно змінював від 5 до 55 з кроком в 5, збільшуючи тим самим навантаження на сервер, і встановлюючи від 50 до 550 одночасних з'єднань.
 
Ось що отримуємо (по осі Х — кількість одночасних з'єднань ):
 
 
Кількість виконаних запитів
 
 
 
Кількість оброблених запитів в секунду
 
 
 
Навантаження на процесор (у%)
 
 
 
Споживання оперативної пам'яті (у% від 32Gb)
 
 
 
Навантаження на канал зв'язку (мегабайт в секунду)
 
 
 
Середній час відповіді на запит (у секундах)
 
 
У цьому тесті я додав споживання оперативної пам'яті, а також веб-сервер nginx для порівняння. Тут вузьким місцем є канал зв'язку, причому 1-ого ядра достатньо для того, що б весь цей канал в 1Gbps завантажити.
 
 Результати (у дужках кількість оброблених запитів без помилок):
 
     
  1. Nignx (100175 )
  2.  
  3. Eventlet (97925 )
  4.  
  5. Gevent (96918 )
  6.  
  7. Express.js (96162 )
  8.  
  9. Twisted (85733 )
  10.  
  11. Tornado (83241 )
  12.  
 
 
 

4. GridFS / Siege / Intel ® Core ™ i7-4770 Quad-Core Haswell, 32 GB DDR3 RAM

На цьому можна було завершувати статтю, але я хотів використовувати MongoDB GridFS у своєму проекті, тому вирішив подивитися, як зміниться продуктивність з її використанням. Даний тест аналогічний третьому, за винятком того, що всі зображення в кількості 10 000 штук я залив у MongoDB і переписав веб-сервери так, що б вони роздавали файли з бази. Отже, що ми отримуємо:
 
 
Кількість виконаних запитів
 
 
 
Кількість оброблених запитів в секунду
 
 
 
Навантаження на процесор (у%)
 
 
 
Споживання оперативної пам'яті (у% від 32Gb)
 
 
 
Навантаження на канал зв'язку (мегабайт в секунду)
 
 
 
Середній час відповіді на запит (у секундах)
 
 
 
Кількість помилок
 
 
Під час тесту у Gevent були відповіді з помилками, тому я додав графік «Кількість помилок». В цілому GridFS цілком можна використовувати, але варто враховувати, що сама база створює чималу навантаження на CPU, а у мене було 7 вільних ядер в її розпорядженні, коли з файловою системою все набагато простіше.
 
 Результати (у дужках кількість оброблених запитів без помилок):
 
     
  1. Express.js (88714 )
  2.  
  3. Gevent (86182 )
  4.  
 
 

Висновки

 
     
  • MacBook Pro Retina дійсно відпрацьовує 9:00 на одному заряді.
  •  
  • Node.js не єдиний інструмент, як вважають деякі, для розробки мережних додатків.
  •  
  • Gevent видає дуже хорошу продуктивність.
  •  
  • Оформлення статті займає більше часу, ніж її написання.
  •  
  • Тестування продуктивності складний процес, який займає багато часу.
  •  
 
Якщо серйозно, все залежить від умов, за яких буде працювати ваш проект. Можна провести величезне число тестів, але коли сервіс буде написаний, все швидше за все буде зовсім по іншому. Наприклад, при збільшенні числа картинок з 10 000 до 1 000 000 вузьким місцем вже стає продуктивність жорсткого диска, а не канал зв'язку.
 
 
Матеріали
Якщо ви вирішите провести власне тестування або більш докладно вивчити моє, то цей список вам повинен допомогти.
 
 
Звіти
Повні звіти з індивідуальними графіками та цифрами можна скачати за цим посиланням:
 
     
  1. Text / Httperf / VPS 1 CPU, 512 RAM
  2.  
  3. Text / Httperf / Intel ® Core ™ i7-4770 Quad-Core Haswell, 32 GB DDR3 RAM
  4.  
  5. Files / Siege / Intel ® Core ™ i7-4770 Quad-Core Haswell, 32 GB DDR3 RAM
  6.  
  7. GridFS / Siege / Intel ® Core ™ i7-4770 Quad-Core Haswell, 32 GB DDR3 RAM
  8.  
 
 
иструмента
У своїх тестах я використав:
  
 
Фреймворки
У тестах брали участь:
  
Поняття не маю який з мене письменник і чи буде корисно комусь моє дослідження. Пишіть, що ви про це думаєте.
 
Всім дякую за увагу.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.