четверг, 26 февраля 2009 г.

Минимизация ущерба от апплетов - системные службы

Это перевод Applet mitigations - services. Автор: Ларри Остерман.

Как старший разработчик в Microsoft, вы часто будете участвовать в работе ряда V-команд. Одна из V-команд, в которой я состою, ответственна за утверждение новых служб в Windows. Как я уже говорил ранее, я очень требователен к вещам, которые работают у меня на машине, а системные службы относятся к вещам, которые особенно меня волнуют.

В качесте работы в составе этой V-команды, я написал это небольшое письмо несколько лет назад (текст слегка изменён - вырезана частная информация):
Я несколько месяцев наблюдал за работой команды <имя V-команды>, и я заметил несколько тенденций, которые взволновали меня.

Каждая новая возможность системы (а у нас их целая тьма) похоже требует для себя собственную службу. Не поймите меня неправильно - это прекрасно, что все эти функции работают как службы, а не как отдельные процессы.

Но каждая из этих новых служб, которые я видел, включается на всех редакциях Windows. Каждая. И все они автозапускаемые.

<имя V-команды> сделала огромную работу по уменьшению числа запущенных процессов служб. Это действительно классно, и это хорошо и для наших клиентов тоже.

Но я думаю, что они зашли ещё недостаточно далеко. Нам нужно тщательнее поработать над службами. Потому что, даже если несколько служб работают в одном процессе - всё равно каждая служба съедает как минимум один поток. А поток съедает часть песочницы (working set) клиента. А это, в свою очередь, увеличивает время загрузки. А если к тому же ваш код имеет утечки памяти (или объектов GDI/User), то он может и вовсе заблокировать весь компьютер. Ещё один момент: каждая запущенная в Windows служба увеличивает площадь атаки злоумышленников (Windows attack surface).

В Windows XP, у нас есть не меньше 40-ка служб в работающей системе. На умалчиваемой установке Vista сегодня этих служб раза в два больше (я подразумеваю, что на моей тестовой машине стоит обычный дистрибутив longhorn)(*).

Да, я понимаю, что каждая возможность является критической для наших клиентов в целом, но я задаюсь вопросом: необходима ли она для всех клиентов. Вы ДЕЙСТВИТЕЛЬНО верите, что ваш код будет использоваться каждым из почти миллиарда пользователей Windows? Сделает ли ваша служба жизнь каждого пользователя из этого миллиарда лучше? Если нет, то, наверное, ваш код не должен работать на каждой из миллиарда машин.

Как я уже говорил, я некоторое время обдумывал это, и я считаю, что могу предложить несколько вещей, которые стоит рассмотреть, когда вы пытаетесь понять, нужно ли вам устанавливать службу.

Для начала: я в курсе, что ваша возможность (feature) является самой важной для вас вещью, но ведь это же верно и для всех остальных разработчиков, работающих над Windows. Мы не можем быть все одновременно номерами один, поэтому вам стоит подумать над относительной важностью своей службы действительно серьёзно.

Если ваша служба стоит на авто-запуске - ДЕЙСТВИТЕЛЬНО ли это необходимо? Каждый ли пользователь Windows получит с этого выгоду?

Если ваша служба привязана к какому-то железу, то так ли необходимо вашей службе работать, если этого железа на машине нет? Нельзя ли привязать службу к установщику для оборудования?

Если ваша служба привязана к определённому пользовательскому интерфейсу, а пользователь никогда не открывает ваш интерфейс, то принесёт ли ваша служба пользу пользователю в таком случае? Может быть пользовательский интерфейс может запускать службу, если она не запущена?

ДЕЙСТВИТЕЛЬНО ли ваша служба должна быть доступной и на авто-запуске (даже если на отложенном) в каждой редакции? Правда?

Как пользователь узнает о вашей возможности/службе? Если её не так-то просто обнаружить, будет ли ваша служба полезной пользователю, до того, как он найдёт вашу возможность и станет её использовать?

Теперь для некоторых служб уже что-то стало ясным. Но для большого количества наших новых служб - пока ещё не очень.

Даже моя личная служба, Windows Audio, не удовлетворяет всем критериям. Мне бы действительно хотелось сделать её службой с ручным запуском, если только на машине нет звуковой карточки, и изменить установщик аудио-устройств так, чтобы он включал службу. Потому что, если на машине нет аудио-железа, то нет смысла и работать этой службе. Но ЕСТЬ один важный сценарий, когда важно, чтобы служба Windows Audio работала всегда: это удалённый рабочий стол (Remote Desktop). Когда мы используем удалённый рабочий стол, то, даже если сервер не имеет звуковухи, мы всё ещё можем проиграть звук на железе клиента (**).

Но это относительно редкий сценарий. И мне бы хотелось изменить его (или переработать службу удалённого рабочего стола, чтобы она запускала аудио-службу при подключении клиента). А вам?
Это всё было небольшое отступление - оно не о минимизации ущерба, а о тех непростых решениях, которые вам придётся сделать, когда вы задумаетесь о добавлении в систему новой службы. Но в любом случае эти заметки стоят того, чтобы их опубликовать здесь.

Так как же вам снизить ущерб от служб? Для начала, соедините похожие службы в один процесс. Таким образом, вместо того, чтобы занимать два процесса, вы займёте только один (см. мои предыдущие посты, где я указывал стоимость процесса).

Во-вторых, как я указывал выше, рассмотрите возможность установки своей службы как службы с ручным запуском. Её запуск можно производить по различным событиям - например, запуску GUI-приложения. Если только у вас нет действительно серьёзной причины на авто-запуск - просто позвольте кому-то запускать вашу службу.

В-третьих, если вам всё же нужна служба с авто-запуском - серьёзно рассмотрите возможность отложенного авто-запуска (delayed auto-start service) - эта функциональность появилась в Vista/Windows Server 2K8, она позволяет контроллеру служб отложить запуск службы так, что она не будет влиять на время загрузки (***).

В дополнение, серьёзно проанализируйте, сколько времени вы тратите в своей процедуре инициализации в службе. Чем меньше времени вы там что-то делаете - тем лучше (особенно, если ваша служба стоит на авто-запуске). Чем меньше работы вы будете делать перед тем, как сообщить менеджеру служб о своей готовности - тем быстрее будет загрузка системы.

Завтра: "лучшие методы" для апплетов - собираем мысли предыдущих постов в один блок.

(*) Заметьте: хотя в Vista БОЛЬШЕ служб, чем в XP, но эти слова - просто гипербола.

(**) Этого не произошло. Сверху решили, что поскольку каждая клиентская машина с логотипом Vista должна иметь звук, то можно держать аудио-службу на авто-запуске (они тоже чувствовали, что аудио будет использоваться каждым пользователем :) ).

(***) Да, я знаю - это улучшение пригодно только в Vista, но оно действительно классное.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.