Столкнулся с очень увесистым различием в работе ASP.NET и PHP под управлением IIS. Симптом проблемы очень нагляден: на одном и том же сервере .NET-сайты работают быстро, на основе PHP — тормозят.
Такое положение дел достало, начал копать вопрос. Проверка ping’ом показала, что сетевой проблемы нет: ответы приходят максимум за полсекунды (привет, «последняя миля»). Запустил профилирование на сервере и закидал его запросами по всем сайтам. Профиль был короткий, всего 1 минута, но наглядный.
Проблема вкратце: оперативная память была перегружена и её не хватало, активно использовался своп.
Решение: сервер был хиленький, Hyper-V с 512 Мб рамы. Сейчас памяти в 2 раза больше, а процессорного времени в 2,5 раза больше. Теперь занято не 85%, а 71% в среднем, и главное, что не свопятся сайты.
В чём суть проблемы.
ASP.NET «максимально бинарен». Все страницы компилируются, в конечном счете вся разметка становится бинарным кодом с отдельными строковыми значениями. Плюс такого подхода в компактности и простоте размещения в памяти. Все кешируется во временном каталоге, а сайт висит в памяти, в качестве отдельного приложения.
С PHP история другая. Природа PHP основана на парсинге текста. Как итог, постоянная работа с файловой системой, от которой частично спасает кеширование. Так или иначе, при более менее схожем функциональном объеме, такой сайт будет съедать заметно больше памяти и чаще обращаться к диску, чем сайт под управлением .NET. Именно поэтому сайты на PHP вылетали из оперативной памяти в своп, отсюда и жуткие тормоза в среднем по 2-5 на генерацию ответа — доступ к жесткому диску дорогой.