Как вы максимизируете производительность сервера?
Я пытался понять, что такое производительность и масштабируемость, и хотел бы знать, что делают разработчики / системные администраторы для создания сока своих систем. Чтобы стандартизировать ответы, было бы полезно, если бы вы могли наилучшим образом ответить на любое из следующего:
- Профиль - публикация журнала на Joomla; Доска вакансий на CodeIgniter + OpenId + AJAX
- Производительность - Максимальное количество запросов в секунду на сервер?
- Аппаратное обеспечение - сервер, роутер, диск, локальная сеть?
- Программное обеспечение - Lighttpd, Memcache, Varnish, Nginx, Squid, Pound, LVS, eAccelerator и др.
- Сервисы - Amazon S3, Akamai, Google Compute и др.
- Конфигурация - статическое хеширование, модуль Upstream, Memcache на x минут после n запросов, отключение регистрации запросов изображений и т. Д.
- Другое - что-нибудь еще? (например, нормализованные таблицы плохо для сайтов с большим количеством чтений)
Изменить: Пожалуйста, еще раз подумайте, прежде чем закрывать этот вопрос, так как это важно для веб-разработчиков. Программист может настроить точку с запятой в своем коде, но при этом проиграть плохой кодер, пишущий для memcached или умеющий собрать CDN через Google App Engine.
3 ответа
Не существует конкретного генерального плана оптимизации производительности (как, например, сначала запуск программного обеспечения "xyz").
Общий подход:
- Определить (измерить!) Вашу наиболее улучшаемую сущность с помощью улучшения / затраченного времени
- Оптимизировать его
- Повторение
Наша система: я не могу вам рассказать об этом, но это большое SaaS-приложение, обслуживающее многих платящих клиентов.
Каждая часть работы над производительностью / мощностью, которую мы выполняем, выполняется очень осторожно - мы не можем просто попробовать что-то посмотреть, чтобы убедиться, что они работают.
Первоначально был бы некоторый анализ текущей производительности и мощности, можем ли мы продолжать работать в любом случае.
Если возможно, мы воспроизвели бы проблемы с производительностью в непроизводственной системе, где мы могли бы профилировать код и вносить экспериментальные изменения. Мы не всегда можем использовать точно такое же оборудование, как и на производстве (на производстве имеется большое количество серверов с очень высокими техническими характеристиками; у dev есть только несколько специализированных тестов производительности).
Если проблема не может быть тщательно проанализирована в непроизводственной среде, мы отправим некоторые инструменты в наш код в процессе производства (после тщательного тестирования, чтобы убедиться, что инструменты не влияют на саму систему). Эта контрольно-измерительная аппаратура будет поставляться "выключенной" и включаться выборочно, чтобы собрать достаточно данных.
Получив точный анализ проблемы, мы рассмотрим возможные решения и, возможно, разработаем прототипы - их можно будет проверить на функциональную правильность.
Обычно мы выбираем наименее рискованный вариант, если их несколько.
Затем будет следовать нормальный процесс выпуска - множество тестов, обзоров кода и т. Д.
Если это уместно, изменение может быть отправлено с "переключателем возврата", который позволяет быстро отключить его в производственном процессе при возникновении проблемы.
Мы выявили много потенциальных улучшений производительности, большинство из которых мы не будем развивать дальше до тех пор, пока не возникнет проблема (если мы все равно не сделаем рефакторинг этого компонента программного обеспечения).
У меня нет времени, чтобы ответить на ваш вопрос. =) Но я могу рекомендовать общую стратегию разделения проблем, а не объединять ресурсы сервера, когда в этом нет срочной необходимости. mod_proxy (и любые его эквиваленты) - ваш друг. Это позволяет легко бросать аппаратные средства при проблемах производительности, которые обнаруживаются. Конечно, вам не нужно идеально учитывать систему с самого начала (поскольку очень трудно предвидеть, где будут обнаруживаться реальные узкие места). Но когда вы сталкиваетесь с проблемами. Помни своего друга.