Всегда есть компромисс между производительностью разработчика, удобством обслуживания и производительностью; вы можете реально сделать этот компромисс разумно, если вы можете измерить. Производительность измеряется тем, сколько времени нужно, чтобы что-то сделать; ремонтопригодность сложнее измерить, но, к счастью, производительность довольно легко определить количественно. В общем, я бы сказал, что сначала нужно оптимизировать производительность и ремонтопригодность, а оптимизировать только производительность, если у вас есть измеримая проблема.
Чтобы работать таким образом, вам необходимо иметь целевые показатели производительности и способ регулярно оценивать решение в соответствии с этими целевыми показателями - очень сложно встроить производительность в проект. Однако оптимизация производительности без доказанной необходимости имеет тенденцию приводить к неясным, трудным для отладки программным решениям.
Во-первых, вам нужно превратить целевой показатель производительности в числа, которые вы можете измерить; для веб-приложений это обычно «динамические запросы страниц в секунду». 400 одновременно работающих пользователей, вероятно, не все запрашивают страницы в одно и то же время - они обычно тратят некоторое время на чтение страницы, заполнение форм и т. Д. С другой стороны, AJAX-ориентированные сайты запрашивают намного больше динамических страниц.
Используйте Excel или что-то еще для работы от пиковых одновременных пользователей до динамических генераций страниц в секунду, основанных на времени ожидания, запросах на взаимодействие и построении в буфере - я обычно перерасход на 50%.
Например:
400 одновременно работающих пользователей с продолжительностью сеанса 5 взаимодействий и
2 динамические страницы на взаимодействие означают 400 * 5 * 2 = 4000 запросов страниц.
При времени ожидания 30 секунд эти запросы будут распределены в течение 30 * 5 = 150 секунд.
Таким образом, среднее число запросов страниц в секунду составляет 4000/150 = 27 запросов в секунду.
При 50% буфере вам необходимо поддерживать пиковую скорость примерно 40 запросов в секунду.
Это не тривиально, но ни в коем случае не исключение.
Затем настройте среду тестирования производительности, характеристики которой вы полностью понимаете и можете реплицировать, а также можете сопоставить с производственной средой. Я обычно не рекомендую воссоздавать производство на этом этапе. Вместо этого сократите количество поколений страниц / второй тест, чтобы соответствовать среде тестирования производительности (например, если у вас 4 сервера в работе и только 2 в среде тестирования производительности, уменьшите вдвое).
Как только вы начинаете разработку, регулярно (не реже одного раза в неделю, в идеале каждый день) развертывайте свою незавершенную работу в этой среде тестирования. Используйте генератор нагрузочных тестов (для меня работают Apache Benchmark или Apache JMeter), пишите нагрузочные тесты, имитирующие типичные поездки пользователей (но без времени ожидания), и запускайте их в своей среде тестирования производительности. Измерьте успех, выбрав целевой целевой показатель «количество поколений страниц в секунду». Если вы не достигли отметки, выясните, почему (профилировщик ANTS от Redgate - ваш друг!).
Когда вы приблизитесь к концу проекта, попробуйте создать тестовую среду, которая ближе к производственной системе с точки зрения инфраструктуры. Разверните свою работу и повторно запустите тесты производительности, увеличив нагрузку, чтобы отразить «реальные» требования страниц в секунду. На этом этапе у вас должно быть хорошее представление о характеристиках производительности приложения, поэтому вы действительно проверяете только свои предположения. Как правило, гораздо сложнее и дороже получить такую «производственную» среду, и обычно намного сложнее вносить изменения в программное обеспечение, поэтому вы должны использовать это исключительно для проверки, а не для выполнения обычной работы по проектированию производительности.