Формула успеха, или Секреты профессиональной оптимизации кремниевых коней в примерах и картинках


…В этой игре нет ни правил, ни ограничений. Нет ни победителей, ни проигравших. Стремительный рост вычислительных мощностей уравновешивается адекватным ростом вычислительной сложности или, попросту говоря, «аппетитом» программного обеспечения. Производительность компьютера, купленного год или два назад, удовлетворяет немногих, и с течением времени чувство неудовлетворенности все нарастает и нарастает.

Вы хотите сделать своему кремниевому другу «апгрейд»? Прекрасно! Но уверены ли вы, что сможете безошибочно определить, какой из многочисленных узлов компьютера действительно нуждается в замене? Бесполезно приобретать более быстрый процессор, если узким местом системы является пропускная способность подсистемы памяти и, соответственно, наоборот. Действуя наугад, вы рискуете выбросить на ветер приличную сумму денег, прежде чем добьетесь ожидаемого результата.

Между тем, операционные системы семейства Windows и процессорные системы класса Pentium поддерживают так называемые счетчики производительности (performance counters), позволяющие быстро и достоверно определить главных виновников «торможения». Хотите научиться ими пользоваться? Тогда эта статья расскажем вам, как!

Введение

Строго говоря, то, чем мы будем сейчас заниматься, не есть тюнинг системы в общепринятом его понимании. Скорее, это спортивный бег с препятствиями. Профессионалы, занимающиеся оптимизацией, не мыслят свою жизнь без целого комплекса программно-аппаратного обеспечения, позволяющего ощупать каждую сигнальную трассу, каждую жизненно важную артерию компьютера. Сложность управления всем этим оборудованием может повергнуть в ужас даже видавших виды специалистов. Но именно так создаются компьютеры brandname-производителей.

Мы же с вами — люди маленькие, и запросы у нас куда как более скромные. Презентационная точность юстировки системы нам не нужна. Достаточно лишь сделать ее более или менее работоспособной и сбалансированной. К счастью, современные процессоры и ОС настолько умы, что необходимый минимум измерительных средств в них уже есть.

Настройка системы с помощью Диспетчера Задач

«Диспетчер Задач», встроенный в операционные системы семейства Windows NT и вызываемый по нажатию клавиш Ctrl-Alt-Del, представляет собой мощное средство мониторинга системы, которое, к тому же, всегда под рукой. (В операционных системах семейства Windows 9x Диспетчер Задач отсутствует, но его заменяет утилита WinTop из набора Microsoft Resource Kit.)

Что умеет Диспетчер Задач? Прежде всего, он отображает степень загрузки центрального процессора, количество выделенной, используемой и свободной оперативной памяти, интенсивность использования файла подкачки и многое-многое другое. При желании можно не только ознакомиться с общим положением дел, творящихся в системе, но и определить конкретный вклад каждого из запущенных процессов.

Оценка мощности процессора

Быстрее, еще быстрее… и вот мы буквально летим, накручивая мегагерцы на кардан, проносясь по трассе со скоростью полусонной черепахи, ни на йоту не сдвинувшейся с того самого места, где она была год, а то и два года назад. Увы! Слишком быстрый процессор подавляющему большинству приложений просто не нужен, и увеличение тактовой частоты вдвое в лучшем случае увеличивает производительность системы лишь на треть. Посмотрите: если индикатор загрузки ЦП лениво осциллирует возле нулевой отметки, или кривая загрузки напоминает разлапистую горную цепь вроде лунных Апеннин (или земного Кавказа), — вычислительной мощности вашего процессора для решения поставленных перед ним задач более чем достаточно! Наращивание тактовой частоты слегка сузит ширину основания «пиков», но общее время выполнения задачи окажется практически неизменным.

Реальное увеличение производительности достигается лишь на тех задачах, чьи потребности в процессорном времени достигают 100% (например, поиск регулярных выражений, обработка изображений и т. д.). Однако никаких гарантий того, что Диспетчер Задач не лжет, у нас нет. Показатель производительности, именуемый «загрузка процессора», на самом деле представляет собой готовность отдачи квантов времени всеми остальными процессами системы. Высокая загруженность процессора может быть вызвана и дисковой подсистемой, и подсистемой оперативной памяти, и… да много еще чем!

Это не означает, что показаниям Диспетчера Задач нельзя доверять, но означает, что тактовая частота процессора — не единственный, да и не самый вероятный виновник. Высокая степень загрузки ЦП лишь указывает на потенциальную возможность радикального увеличения быстродействия, но не говорит, какой из компонентов системы для этого следует заменить.

Попутно заметим, что неправильно спроектированное приложение способно пожирать чудовищное количество процессорного времени даже при полном ничегонеделании. Этим, в частности, грешат ранние версии словаря Context и переводчика Socrat, вызывающие 100-процентную загрузку центрального процессора и, как следствие, сильное торможение системы. Все версии Microsoft Word (вплоть до XP включительно) также имеют один очень неприятный дефект проектирования, при определенных обстоятельствах приводящий к 92—95-процентной загрузке ЦП. Причем увеличение тактовой частоты процессора не исправляет ситуацию и практически не увеличивает общую производительность системы! Единственно правильным решением будет полный отказ от «неправильных» приложений или переход на их альтернативные версии.

Если стабильно работающая система вдруг без видимых причин начинает тормозить, вызовите Диспетчер Задач и, щелкнув мышкой по вкладке «Процессы», посмотрите — какой из процессов поглощает наибольшее количество времени (колонка ЦП).

Microsoft Word, даже работая в фоновом режиме, отнимает 92% от быстродействия системы. Если вы хотите этого избежать — просто отключите автоматическую проверку правописания, и загрузка процессора тут же упадет практически до нуля.

Оценка требуемого количества оперативной памяти

Зависимость производительности системы от объема установленной оперативной памяти отнюдь не линейна. Даже небольшая нехватка оперативной памяти приводит к интенсивной работе с файлом подкачки и чудовищному падению производительности. Избыток же оперативной памяти просто «не замечается» операционной системой, и хотя какое-то количество «лишней» памяти может быть выделено под дисковый кэш, адекватного ускорения работы приложений это, увы, не вызывает.

Если при переключении между ранее запущенными задачами происходит обращение к жесткому диску, значит, количества имеющейся в распоряжении системы оперативной памяти более чем недостаточно, и имеет смысл ее нарастить, воткнув в материнскую плату еще один модуль. Но вот вопрос: а какого этот модуль должен быть объема? Как узнать, сколько именно мегабайтов вам требуется? Нет ничего проще! Вызываем Диспетчер Задач, переходим к вкладке «Быстродействие», находим графу «Выделенная память», а в ней — текущее и пиковое количество выделенной памяти за последний сеанс работы с системой.

Для обеспечения комфортной работы требуется, как минимум, удовлетворить потребности компьютера в текущем объеме выделенной памяти (при этом должны быть запущены все те приложения, с которыми вы планируете одновременную работу). Однако аппетит подавляющего большинства приложений весьма непостоянен, и при определенных обстоятельствах он может значительно возрасти, что приведет к необходимости обращения к файлу подкачки на диске. Поскольку «характер» и «стратегия» потребления памяти у всех приложений различна, никаких общих рекомендаций на этот счет дать невозможно.

Если вы хотите сэкономить свои деньги, то просто последите за положением индикатора «Память» (вкладка «Быстродействие»), отмечая его «среднемаксимальные» значения. Поработав в таком режиме неделю-другую, вы сможете точно выяснить, сколько именно памяти вам реально необходимо. Если же вы цените свое время дороже, чем деньги, то установите в компьютер максимальное количество выделявшейся за несколько последних сеансов оперативной памяти (строка «Пик»).

При этом следует отметить тот факт, что далеко не всякое приложение использует запрошенный им объем оперативной памяти целиком. Выделение памяти еще не приводит к ее немедленному «захвату», и физическая оперативная память выделяется лишь тем страницам, к которым происходит хотя бы однократное обращение. Программист может запросить выделение хоть гигабайта памяти, но это никак не скажется на производительности всей системы в целом, при том, конечно, условии, что эта память никогда не будет использована.

Графа «Выделенная память» как раз и отражает количество выделенной, то есть зарезервированной памяти, но не дает прямого ответа на вопрос, используется эта память или нет. Для прояснения ситуации следует обратиться к графе «Физическая память», содержащей среди прочей информации доступный объем оперативной памяти. Чем он больше — тем лучше. Считается, что если свободно хотя бы 50 или 100 мегабайтов физической памяти, то потребности системы в ней полностью удовлетворены. На самом деле, это предположение в коре неверно. Если перед обращением к Диспетчеру Задач вы завершите какое-нибудь «монстроидальное» приложение, то вся занятая им память окажется свободной и будет оставаться таковой, пока вы не переключитесь на приложение, полностью или частично «высвопленное» на диск. Наглядное доказательство тому приведено ниже (см. рис). Смотрите: в системе установлено 256 МБ памяти, из них 235 МБ выделено, а 98 МБ — свободно. Согласитесь, что 235 + 98 > 256! Поэтому следует опираться не на текущее, а на минимальное количество свободной физической памяти. Держите глаза широко раскрытыми и периодически поглядывайте на Диспетчер Задач в ходе работы с другими приложениями.

Диспетчер Задач следит за хронологией загрузки процессора и выделения оперативной памяти

Практический пример тюнинга системы

Один из приятелей автора как-то пожаловался на свой Pentium 4: дескать, работает он медленно, да и видеофильмы идут с большим торможением, «рывками». Разгон процессора, сопровождаемый панической переустановкой модулей памяти и ковырянием настроек BIOS, ничего не дал, и вконец отчаявшийся экспериментатор решил пригласить к своему компьютеру меня (по принципу: если я его сломаю, хуже уже не будет).

Запуск Диспетчера Задач показал, что процессор тут вообще не причем, поскольку его загрузка стабильно держалась на уровне ~40%, и большую часть времени он проводил в спячке, охлаждая свои внутренности от перегрева (см. рис.). Следовательно, наиболее вероятным виновником «тормозов» становилась дисковая подсистема, и показания Системного Монитора полностью подтвердили это предположение: моменты «дерганья» изображения хорошо согласовывались с «вылетами» графика длины очереди запросов на чтение [диска]. То есть, привод время от времени впадал в некий «ступор», не реагируя ни на какие попытки обращения. Причина? Запуск ASUS PC Probe обнаружил значительную просадку напряжения на линии +12 В, потенциал которой составил всего +10,2 В. Компьютер все еще работал, но — нестабильно. После замены блока питания ситуация нормализовалась, и все тормоза немедленно исчезли.


Проигрывание видеоклипа загружает процессор менее, чем наполовину, между тем, изображение движется рывками. Как вы думаете, почему?

Системный Монитор

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

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

Пуск —> Настройка —> Панель Управления —> Администрирование —> Системный Монитор. (В Windows 9x Системный Монитор тоже есть, но попроще, ищите его в меню служебных программ.) Теперь вызываем контекстное меню посередине появившейся консоли, выбираем в нем пункт «Добавить счетчики» и добавляем три следующих счетчика: счетчик загруженности процессора (объект: процессор), счетчик активности диска (объект: физический диск) и счетчик текущей длины очереди диска (объект тот же). Добавив все необходимые счетчики, мы возвращаемся в главное окно Системного Монитора, нажимая клавишу «Закрыть». Клавиша «Объяснения» выдает короткую справку по текущему счетчику производительности — обращайтесь к ней всякий раз, когда встретитесь с чем-то непонятным.

«Процесс пошел!» — как говорят в Одессе. Системный Монитор начинает протоколирование, процарапывая на экране три кривые. Зеленая отвечает за загруженность диска, красная — за загруженность ЦП, голубая — за длину очереди запросов на диск (разумеется, такие цвета кривым назначаются по умолчанию — они могут быть изменены вручную и будут перепутаны, если вы добавляли счетчики в ином порядке).

Левый рисунок (см. ниже) иллюстрирует пример хорошо сбалансированной системы. Смотрите: загрузка жесткого диска держится на довольно высоком уровне. Это означает, что продолжительность эвристического анализа [антивирусным сканером] одного файла сопоставима со временем чтения другого. Причем процессор работает на пределе. Обратите внимание на то, как хорошо совпадают пики загрузки процессора с провалами активности диска! Замена диска на более быстрый практически не увеличит производительности, поскольку большую часть времени этот диск будет простаивать. Не верите? А вот переведите свой взгляд на правый график, снятый на той же самой системе, но уже после апгрейда винчестера.

Загрузка процессора резко возросла, а на графике активности диска появились длинные и глубокие провалы, похожие на Большой Каньон. Причем более быстрый диск оказался более «быстрым» только наполовину. Скорость линейного чтения явно возросла, но вместе с ней возросло и время поиска. На основании чего был сделан такой вывод? В этом нам помогла разобраться голубая кривая, отображающая динамику роста длины очереди запросов к диску. Видите этот высокий пик посередине? Да, тот самый, что приходится на спад загрузки процессора, но на максимум дисковой активности! В этом месте винчестер стрекотал как угорелый, но все равно не успевал обрабатывать поступающие к нему запросы.

Таким образом, для увеличения производительности обновленной системы нам требуется заменить процессор на более мощный. Стоп! Я не сказал «более быстрый»! Мы еще не знаем наверняка, в чем истинная причина «тормозов»: может быть, недостает емкости кэш-памяти, а может — тактовой частоты. Подробнее об этом мы поговорим в разделе «В ядре процессора», а сейчас вернемся к нашим баранам. Очевидно, что подобная методика применима не только к оптимизации системы под антивирусное сканирование, но и к ее балансировке под любую другую задачу.

Пример хорошо сбалансированной системы: в кривых загрузки диска и процессора практически отсутствуют высокие пики и провалы Пример плохо сбалансированной системы: процессор не справляется с обработкой поступающей информации, и жесткому диску приходится периодически простаивать

В ядре процессора

Процессоры семейства Pentium имеют невероятно развитую систему мониторинга, отслеживая практически все мало-мальски значимые события, как-то: обращения к памяти, ошибки предсказания переходов, вытеснение данных из кэш-памяти в оперативную память и т. д. Процессор перестает быть монолитным кристаллом кремния, это уже не вещь в себе! Теперь не нужно гадать, быстродействия каких именно узлов нам больше всего не хватает, достаточно лишь сказать счетчикам производительности «Фас!» и, дав им непродолжительное время на сбор статистики, проанализировать добытый результат.

Теперь к делу. Счетчиков производительности всего два, и с прикладного уровня они по умолчанию недоступны. Но разве настоящих хакеров такими запретами остановишь? Для работы со счетчиками производительности создано огромное количество разнообразных программ, разбросанных по всей Сети. Сходите на сайт Марка Русиновича и скачайте оттуда утилиту под названием CPUMon размером всего в 40 КБ.

Разобраться с ней несложно (не забудьте только, что под Windows NT она требует наличия прав администратора). В окне «Class» мы выбираем интересующий нас класс событий, а в окне «Counter» указываем, какое из событий мы, собственно, хотим считать. И так — для обоих счетчиков.

Давайте, для примера, решим такую задачу: у нас есть сильно тормозящее приложение, быстродействие которого мы хотим увеличить, но не знаем, как именно. При условии, что диск не трещит как угорелый, на производительность может влиять либо вычислительная мощь процессора (хоть это и не совсем то же самое, что тактовая частота, но нечто очень тесно с ней связанное), либо объем кэш-памяти первого и второго уровней, либо пропускная способность/латентность основной оперативной памяти, либо все это сразу.

Как мы будем действовать? В окне «Class» счетчика 0 мы выбираем «Bus» (шина), а в окне «Counter» — BUS_TRAN_MEN. Этот счетчик будет отслеживать количество обращений к памяти, пропущенных через шину. Для счетчика 1 в окне «Class» мы выберем «Cache» (кэш), а в окне «Counter» — DATA_MEM_REFS. Этот счетчик будет фиксировать общее количество обращений к памяти.

Запустив подопытное приложение, нажимаем «Start» и даем счетчикам несколько секунд для накопления статистически достоверной информации. Когда же наше терпение иссякнет, глубоко утопим «Stop» и рассмотрим появившееся на экране диалоговое окно.

Пример хорошо сбалансированной системы — большинство запросов к памяти обрабатывается локально

Так… 1180 млн. обращений к памяти за неполные 7 секунд, причем 30 млн. из них прошли через шину и адресовались к основной оперативной памяти, а все остальные были обработаны локально.

Следовательно, емкости кэш-памяти вполне достаточно, и главный камень преткновения — тактовая частота ядра процессора. (Внимание! Здесь неявно подразумевается, что мы говорим лишь о процессорах одной архитектуры, в противном случае анализ рискует стать взаимно противоречивым и неоднозначным!)

А вот ниже приведен пример системы с большей тактовой частой, но урезанной кэш-памятью второго уровня (смертельный бой: Celeron против Pentium III «Coppermine» — это если быть уж совсем точным). 290 млн. обращений к памяти за 8 секунд, причем чуть ли не половина из них (120 млн.) была пропущена через шину, и лишь вторая половина — обработана локально. Почему количество общих обращений к памяти за единицу времени такое разное? Так ведь основная оперативная память — это вам не кэш, и вторая система жутко тормозит, передвигаясь со скоростью черепахи.

Пример плохо сбалансированной системы — кэш справился лишь с половиной запросов

Для увеличения производительности мы должны либо приобрести процессор с более емким кэшем (и это лучшее решение из всех возможных), либо увеличить тактовые частоты процессорной шины и оперативной памяти, либо же перейти к использованию двухканального чипсета (это рекомендация общего характера, не имеющая прямого отношения к ситуации с процессорами времен ядра «Coppermine»).

Подробнее со счетчиками производительности вы можете познакомиться в руководстве Intel Architecture Software Developer's Manual Volume 3: System Programming Guide, электронную копию которого можно бесплатно скачать с сервера компании Intel. Полное описание всех имеющихся счетчиков заняло бы слишком много места и потому здесь не приводится.

Настройка системы с помощью профилировщика

Еще большие возможности для тонкого тюнинга системы открывает профилировка. Лучший профилировщик всех времен и народов — это, бесспорно, VTune, разработанный компанией Intel. До сих пор, говоря об определении слабых мест системы, мы все время упускали из виду тот факт, что слабым местом может быть не только «железо», но и, например, драйвера. Также мы обошли стороной вопрос выбора графической подсистемы и оценки ее влияния на общую производительность.

Что ж! Настала пора восполнить этот пробел! Соединившись с FTP-сервером Intel и поставив VTune на скачку (а это целая туша на сто с гаком метров весом), посетите любой книжный магазин вашего города в поисках соответствующей литературы. Грамотная работа с профилировщиком требует определенной подготовки, и метод «тыка» здесь навряд ли поможет. Неплохое практическое руководство по VTune для начинающих можно найти, например, здесь.

Пример результатов профилировки одного из приложений приведен ниже. По вертикальной оси откладывается время, проведенное процессором в каждом из модулей системы, а по горизонтальной располагаются сами модули. Как видно, львиная доля общего времени выполнения приходится на ядро (~25%), за ним с небольшим отрывом следует системная библиотека NTDLL.DLL и прикладной процесс парольного переборщика PSWD.EXE (~20% и 18% соответственно). Доля влияния графической подсистемы в лице библиотеки G400.DLL (Matrox Millennium G450 Dual Head, для справки) составляет менее 5% и со всей очевидностью ни в какой оптимизации не нуждается. Драйвер файловой системы: — NTFS.SYS — не отнял вообще ни одного процента времени, значит, быстродействие жесткого диска в данном случае также некритично.


«Табель о рангах» — кто из всех модулей системы в наибольшей степени ответственен за ее быстродействие

Итак, наиболее узкое место системы локализовано в NTOSKRNL.EXE, что, конечно, далеко не безынтересно само по себе, но для ответа на извечный вопрос «Кто виноват и что делать?» мы должны заглянуть внутрь ядра! В VTune эта операция осуществляется двойным щелчком мыши по соответствующему [ядру] прямоугольнику. Прежде казавшееся монолитным, ядро внезапно расщепляется на изъеденный эрозией горный кряж с высокими пиками и глубокими впадинами. Чем выше пик, тем больше он пожирает процессорных тактов. Самые высокие горы окрашены красным цветом, так что на этой местности очень легко ориентироваться.

Подогнав курсор мыши к Эвересту системы, мы, во-первых, узнаем, с какой системной функций он связан (ее имя появится справа от курсора), а во-вторых, дважды щелкнув по пику правой клавишей мыши, мы попадем внутрь дизассемблерного кода… Ой, нет. В дизассемблерный лес нам лучше не надо. Ограничимся именами функций. Как правило, по описанию функции легко понять, связана ли она с подсистемой ввода/вывода, памятью или вычислительными процессорными ресурсами (описание большинства системных функций Windows можно найти сервере MSDN). В данном случае основной виновник всех тормозов — быстродействие оперативной памяти, а точнее — отсутствие оного (подробности вы найдете в руководстве по VTune, ссылка на которое уже была дана выше), и потому переход на память с более высокой тактовой частотой оказывается лучшим средством увеличения производительности системы.

Самое замечательное, что VTune способен эмулировать множество различных процессоров. Допустим, вы работаете на Pentium III и хотите узнать, какой выигрыш даст переход на Pentium 4. Конечно, оценки такого рода очень приблизительны (ведь это виртуальный процессор, и такты у него виртуальные), однако кое-какую информацию для размышлений они все-таки дают.

Заключение

Позвольте одну маленькую притчу напоследок. Пришел как-то раз один алчный помещик к мудрецу и жалуется, что де как он ни крутится, как он ни вертится, а на жизнь все равно не хватает… Что ответил мудрец помещику — неважно, поскольку ни один взаправдашний помещик его бы все равно не послушал. Деньги и тактовые частоты — опасные штуки. Чем больше вы получаете, тем острее ощущаете их недостаток. Так что гораздо эффективнее заняться оптимизацией своих потребностей, чем оптимизацией вашего ПК.




Дополнительно

Нашли ошибку на сайте? Выделите текст и нажмите Shift+Enter

Код для блога бета

Выделите HTML-код в поле, скопируйте его в буфер и вставьте в свой блог.