У листопаді 2007 року ми провели на titan-r тривалий тест сайту на Joomla: один мільйон запитів до головної сторінки 3r.kiev.ua. Хотілося побачити, як сервер витримає великий обсяг однотипної роботи.
Мільйон запитів за 9,66 години
Тест виконував ApacheBench із п’ятьма одночасними запитами. У журналі зафіксовано 34785.675571 секунди — приблизно 9 годин 40 хвилин — і середню швидкість 28.75 запиту за секунду. Сервер відповідав як nginx/0.4.13; початкова довжина документа становила 10496 байтів.
Повний журнал вимірювання
root@titan-r:~# ab -c 5 -n 1000000 http://3r.kiev.ua/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/
Benchmarking 3r.kiev.ua (be patient)
Completed 100000 requests
Completed 200000 requests
Completed 300000 requests
Completed 400000 requests
Completed 500000 requests
Completed 600000 requests
Completed 700000 requests
Completed 800000 requests
Completed 900000 requests
Finished 1000000 requests
Server Software: nginx/0.4.13
Server Hostname: 3r.kiev.ua
Server Port: 80
Document Path: /
Document Length: 10496 bytes
Concurrency Level: 5
Time taken for tests: 34785.675571 seconds
Complete requests: 1000000
Failed requests: 999925
(Connect: 0, Length: 999925, Exceptions: 0)
Write errors: 0
Non-2xx responses: 11
Total transferred: -1991124364 bytes
HTML transferred: 1831846342 bytes
Requests per second: 28.75 [#/sec] (mean)
Time per request: 173.928 [ms] (mean)
Time per request: 34.786 [ms] (mean, across all concurrent requests)
Transfer rate: -55.90 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 0 173 44.6 168 1743
Waiting: 0 167 44.1 162 1738
Total: 0 173 44.6 168 1743
Percentage of the requests served within a certain time (ms)
50% 168
66% 193
75% 209
80% 218
90% 233
95% 247
98% 269
99% 284
100% 1743 (longest request)Чому одного лічильника запитів недостатньо
Найбільше запитання тут викликає рядок Failed requests: 999925. Усі ці відхилення віднесено до Length: довжина відповіді відрізнялася від очікуваної. Це не доводить, що сервер відхилив майже всі з’єднання, але й назвати мільйон відповідей перевіреними коректними сторінками за таким журналом не можна.
Окремий лічильник показує 11 відповідей поза діапазоном 2xx. Точних кодів і тіл відповідей у збереженому виводі немає. Тому встановити, чи змінювалася звичайна динамічна сторінка, чи поверталося інше повідомлення, вже з цих підсумків неможливо.
Ще одна аномалія — від’ємні значення Total transferred та Transfer rate. Вони не можуть означати реальний від’ємний обсяг трафіку. Причина помилки лічильників у цьому записі не встановлена, тож оцінювати за ними передані дані не варто. Значення полів можна звірити з документацією ApacheBench.
Що сталося з оцінкою «1,2 мільйона сторінок на добу»
Після тесту я записав висновок про 1,2 мільйона сторінок на добу. Проте з наведеного часу така цифра безпосередньо не випливає: просте множення 28.75 запиту/с на 86400 секунд дає близько 2,48 мільйона запитів. І навіть ця арифметика не є прогнозом реальної добової місткості.
У тесті повторювалася одна адреса за фіксованої паралельності. Реальний відвідувач переходить між різними сторінками, а запити мають різну складність. До того ж тут залишилися невизначеними причини відмінностей довжини відповідей і помилки лічильників.
Практичний результат перевірки
Для нас це був тривалий прогін сервера з мільйоном запитів, а не доведена гарантія мільйона коректних сторінок для користувачів. Саме так і варто читати цей результат 2007 року: як вимірювання конкретної інсталяції, в якому поруч зі швидкодією видно питання, що потребували окремої перевірки.