Программист написал питоновское веб-приложение. Решили мы его потестировать на производительность. Я настроил для него реверс-прокси через nginx, заходим на сам сервер и начинаем с него долбить себя же siege'ом по адресу
http://site.domain.ru/python. Получаем целых 108 транзакций в секунду. (Transaction rate: 108.81 trans/sec)
Начинаем думать. Решаем долбануть напрямую питоновское приложение по адресу
http://127.0.0.1:8800/python.
Transaction rate: 2658.29 trans/sec
Клёво. По примитивной логике "без nginx'а быстро, с nginx'ом медленно", на которую я и купился, виноват nginx. Начал его крутить, перекрутил всё, что можно - естественно без результатов.
И тут я додумался прописать в /etc/hosts запись вида
127.0.0.1 site.domain.ru и снова зарядить siege на
http://site.domain.ru/python с nginx'ом. Попугаев выдало чуть более, чем дофига. "Ага", - подумал я, - "наверное с сетевой частью что-то, раз на localhost работает, а на eth0 нет". Начал проверять шейперы, CONNLIMIT'ы итд, даже ядро обновил - безрезультатно, разумеется. Начали закрадываться подозрения, переписываю /etc/hosts, вместо 127.0.0.1 ставлю реальный IP сервера, натравливаю siege - попугаев сколько надо, ~7тыс. запросов в секунду.
Делаю tcpdump -i any port 53 -n, вижу быстро бегущую матрицу, и до меня доходит, что siege на каждый бенчмарковый запрос к тестируемому серверу, делает DNS-запрос, и весь тест упирался в лимиты хостеровского DNS-сервера.
З.Ы. Кстати вполне допускаю, что я ламер, не осиливший документацию по siege'у, и этот нюанс где-то там описан, но тем не менее ситуация для меня была интересная. ApacheBenchmark (ab) так себя не ведёт, кстати.