Масштабируемость и производительност
октября 8 2009 by admin in Обязательный материалНа заре программирования в распоряжении разработчиков имелись весьма ограниченные ресурсы, и, чтобы повысить производительность, они были вынуждены придумывать хитроумные и неудобные для сопровождения алгоритмы. Сегодня производительность и объем памяти компьютерных систем выросли неимоверно, что позволяет разрабатывать более простые и удобные в сопровождении алгоритмы.
К сожалению, прогресс в этой области имеет и обратную сторону: разработчики обленились. Я знаю, что некоторые, не задумываясь, выделяют мегабайты памяти задачам, которым требуется от силы несколько килобайт. Другие используют мыотексы, когда вполне хватило бы критических секций. Этих «профессионалов» не заботит, что функции, применяющие мыотексы, требуют переключения из пользовательского в привилегированный режим и обратно, на что требуется около 1 000 циклов центрального процессора, и это без учета выполнения кода в привилегированном режиме! А ведь выполнение критических секций, как правило, целиком происходит в пользовательском режиме и требует около 100 циклов.
Благодаря компьютеру люди получают неограниченный доступ к информации, хранящейся на серверах. Исследования показывают, что посетители разочаровываются в серверах, которые им не отвечают, и начинают искать нужные им сведения в других местах, а это приводит к снижению прибылей. Точно так же серверы организаций, не отвечающие на запросы сотрудников, мешают их работе, что опять-таки негативно сказывается на бизнесе.
Реактивность сервера можно улучшить, добавив новые компьютеры. Но по многим причинам лучше запускать сервер на одной машине. Во-первых, серверную программу из нескольких частей, работающих на разных машинах, написать гораздо труднее, чем исполняющуюся на одной машине. Во-вторых, зависимость сложности администрирования от количества машин часто является нелинейной и стремительно возрастает при разрастании сети. В-третьих, вы вводите дополнительные потенциальные источники неисправностей, затрудняя поиск и исправление ошибок. Одномашинный сервер, конечно, сгодится не во всех случаях, но вы должны расценивать этот вариант как идеальный при реализации серверного кода.
Производительность одномашинного сервера можно повысить, добавив память, процессоры, диски, сетевые карты и т. д., но только когда ваш серверный код эффективно применяет эти ресурсы. Например, производительность сервера, выделяющего по одному потоку для каждого пользовательского соединения, не удваивается при удвоении объема ОЗУ. Однако если тот же сервер спроектировать на основе эффективного алгоритма работы с пулом потоков, его производительность адекватно увеличится при добавлении дополнительных ресурсов.