ХАКЕР.PRoКрис КасперсКиÎõîòàçà ïðèçðàêàìèáóòûëî÷íîãîãîðëûøêàСеанС термоядерной отладки для админовПри падении производительности сервера на базе Win2k3 и возникновениипроблем со стабильностью его работы администратору нужно заглянуть вомножество уголков операционной системы. Для выявления узких мест могутбыть использованы различные решения, в том числе и хардкорные. Например,отладчик уровня ядра SoftICE.никому не СкрытьСяоперационные системы семейства nt поддерживают развитую системумониторинга счетчиков производительности, отображающих в реальномвремени, сколько «тиков» ушло на ту или иную операцию. не отстают от нихи процессоры, позволяющие регистрировать практически любые события:от количества переключений контекста до интенсивности кэш-промахов.специальные программы-профилировщики обобщают эту информацию,выявляя так называемые «горячие точки», в которых система проводитнаибольшую часть своего времени. однако точность измерений невелика.Прежде чем приступать к профилировке (или снятию показаний счетчиковпроизводительности), требуется устранить все побочные факторы, способныеввести профилировщик в заблуждение. в противном случае придетсяисходить из предположения, что все приложения и драйвера работаютправильно, чего в жизни, увы, практически никогда не бывает.128xàêåð 07 /115/ 08
ХАКЕР.PROПросмотр стека позволяет определить, какой именно драйвер вызываетфункции ядраСчетчики производительности — популярный, но крайне ненадежныйспособ измеренийSoftICE, будучи отладчиком уровня ядра, позволяет остановить системув любой момент и посмотреть, какими интересными делами она сейчасзанимается. С ним поиск «бутылочного горлышка» занимает буквальносчитанные минуты, причем результат абсолютно надежен. Не скрыться ни«кривым» драйверам, ни некорректно работающему аппаратному обеспечению.Кстати, знания ассемблера не потребуется — невероятно, но факт!Достаточно освоить несколько несложных команд, а все остальное SoftIceсделает сам!Сеанс термоядерной отладкиКак узнать, на что уходит львиная доля системного времени? Очень просто— установить SoftIce, вызвать его комбинацией , посмотреть,чем занимается сервер. Выйти из SoftICE по или команде«x;», затем тут же вызывать его вновь (чем занимается системана этот раз?). Повторяя данную операцию в цикле, можно быстро собратьбогатый статистический материал. Совершенно очевидно: истинное процессорноевремя, потребляемое каждым компонентом, прямо пропорциональночастоте его появления при вызове отладчика.Когда сервер вообще ничем не нагружен, свыше 90% «всплытий» приходитсяна псевдопроцесс «Idle». Он означает, что текущие операциивыполняются столь быстро, что мы их просто не засекаем (так как они занимаютничтожные доли процессорного времени). При этом сервер можетобслуживать достаточно большое количество пользователей, дефрагментироватьжесткий диск в фоновом режиме и заниматься прочими делами.Вот так парадокс! Сервер работает, а процессор — отдыхает. Это означает,что конфигурация сервера имеет определенный избыток по мощности иузких мест в ней нет.При дальнейшем росте загрузки мы получаем более или менее «гладкое»распределение, попадая то в интерпретатор PHP, то в процесс, обслуживающийSQL, то в другой сервис. Вполне нормальное явление, однакодоминирование одного процесса над другим — плохой признак, указывающийна дефекты проектирования программы. В нормальной ситуациисвыше 90% машинного времени уходит на ввод/вывод, в течение которогопроцессы, инициировавшие запрос ввода/вывода, спят, как младенцы,независимо от того, справляется дисковая подсистема/сетевая карта сосвоей работой или нет.Повышение активности процессов свидетельствует о «тяжелых» операцияхтипа криптографии, упаковке/распаковке потока данных и прочих«наукоемких» задачах, большинство из которых, кстати говоря, сугубоопциональны. В частности, шифрование можно либо вообще отключить,либо выбрать более «легкие» алгоритмы. Аналогично обстоит дело и супаковкой. Естественно, ситуацию с вещанием цифрового аудио/видео мыв расчет не берем. Тут, понятно, требуется мощный процессор с емкой кэшпамятью.А как узнать, что кэш-памяти достаточно для решения поставленнойзадачи? Очень просто! Если SoftICE останавливается на произвольныхмашинных инструкциях — все ОК. А вот если доминируют инструкциичтения/записи в память (MOV плюс что-то в квадратных скобках, а такжеMOVSx, CMPSx и STOSx), то установка процессора с более емкой кэш-памятьюсущественно поднимет производительность!Но это теория, переходим к практике и вещам, далеко не очевидным дажедля тех, кто давно использует SoftICE. Имя процесса, исполняемого вданный момент, отображается в правом нижнем углу, а текущий исполняемыйкод — в окне CODE, расположенном посередине экрана. В правильносконструированной программе процесс останавливается каждый раз вслучайном месте. То есть колонка адресов будет отличаться. Это означает,что в исследуемом процессе нет горячих точек (или они выражены крайнеслабо). Напротив, если какие-то диапазоны адресов встречаются чащеостальных — мы поймали горячую точку, которую разработчики программыдолжны были устранить еще на стадии проектирования, ну или, в крайнемслучае, в процессе оптимизации продукта перед выбросом его на рынок.Почему счетчикипроизводительностиненадежныПочему же ошибаются счетчики производительности и, в частности,индикатор загрузки процессора? Дело в том, что под «загрузкойпроцессора» создатели NT понимают отнюдь не загрузку процессора,как таковую, а готовность потока поделиться остатками кванта отпущенногоему процессорного времени. На хакерских конференцияхбыло продемонстрировано большое количество exploit’ов, отдающих~3%-5% от полного кванта времени и заставляющих счетчикпроизводительности отображать загрузку близкую к нулевой, чемс успехом пользуются многие зловредные программы (например,использующие распределенные сети для взлома паролей).Другой источник ошибок — асинхронные операции ввода/вывода,поддерживаемые ядром. При чтении данных с диска или файлаподкачки поток «замораживается» системой, передающей управлениепотокам этого же или другого процесса, в результате чего поток,инициирующий процесс чтения, показывает намного более низкоепотребление процессорного времени, чем происходит в действительности.Строго говоря, индикатор загрузки не лжет. Поток действительно«спит» во время чтения с диска, но ведь нас интересует неформальная сторона проблемы, а полное время, включающее в себядлительность всех операций ввода/вывода, поскольку интенсивныйввод/вывод — отличное средство торможения!Наконец, счетчик загрузки ЦП не учитывает время, потребляемоедрайверами. «Загрузка ядра» более или менее корректно вычисляетсятолько для некоторых системных вызовов, да и то с кучей оговорок иограничений.xàêåð 07 /115/ 08129