Практика работы с NetBSD: профилирование ядра::Журнал СА 8.2004
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Подписка
Архив номеров
Где купить
Наука и технологии
Авторам
Рекламодателям
Контакты
   

  Опросы
  Статьи

Дата-центры  

Дата-центры: есть ли опасность утечки данных?

Российские компании уже несколько лет испытывают дефицит вычислительных мощностей. Рост числа проектов,

 Читать далее...

Событие  

В банке рассола ждет сисадмина с полей фрактал-кукумбер

Читайте впечатления о слете ДСА 2024, рассказанные волонтером и участником слета

 Читать далее...

Организация бесперебойной работы  

Бесперебойная работа ИТ-инфраструктуры в режиме 24/7 Как обеспечить ее в нынешних условиях?

Год назад ИТ-компания «Крок» провела исследование «Ключевые тренды сервисного рынка 2023». Результаты

 Читать далее...

Книжная полка  

Читайте и познавайте мир технологий!

Издательство «БХВ» продолжает радовать выпуском интересных и полезных, к тому же прекрасно

 Читать далее...

СУБД PostgreSQL  

СУБД Postgres Pro

Сертификация по новым требованиям ФСТЭК и роль администратора без доступа к данным

 Читать далее...

Критическая инфраструктура  

КИИ для оператора связи. Готовы ли компании к повышению уровня кибербезопасности?

Похоже, что провайдеры и операторы связи начали забывать о требованиях законодательства

 Читать далее...

Архитектура ПО  

Архитектурные метрики. Качество архитектуры и способность системы к эволюционированию

Обычно соответствие программного продукта требованиям мы проверяем через скоуп вполне себе понятных

 Читать далее...

Как хорошо вы это знаете  

Что вам известно о разработках компании ARinteg?

Компания ARinteg (ООО «АРинтег») – системный интегратор на российском рынке ИБ –

 Читать далее...

Графические редакторы  

Рисование абстрактных гор в стиле Paper Cut

Векторный графический редактор Inkscape – яркий представитель той прослойки open source, с

 Читать далее...

День сисадмина  

Учите матчасть! Или как стать системным администратором

Лето – время не только отпусков, но и хорошая возможность определиться с профессией

 Читать далее...

День сисадмина  

Живой айтишник – это всегда движение. Остановка смерти подобна

Наши авторы рассказывают о своем опыте и дают советы начинающим системным администраторам.

 Читать далее...

Виртуализация  

Рынок решений для виртуализации

По данным «Обзора российского рынка инфраструктурного ПО и перспектив его развития», сделанного

 Читать далее...

Книжная полка  

Как стать креативным и востребованным

Издательский дом «Питер» предлагает новинки компьютерной литературы, а также книги по бизнесу

 Читать далее...

Книжная полка  

От создания сайтов до разработки и реализации API

В издательстве «БХВ» недавно вышли книги, которые будут интересны системным администраторам, создателям

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 6229
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 6935
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

12.03.2018г.
Просмотров: 4221
Комментарии: 0
Глубокое обучение с точки зрения практика

 Читать далее...

12.03.2018г.
Просмотров: 3010
Комментарии: 0
Изучаем pandas

 Читать далее...

12.03.2018г.
Просмотров: 3808
Комментарии: 0
Программирование на языке Rust (Цветное издание)

 Читать далее...

19.12.2017г.
Просмотров: 3825
Комментарии: 0
Глубокое обучение

 Читать далее...

19.12.2017г.
Просмотров: 6319
Комментарии: 0
Анализ социальных медиа на Python

 Читать далее...

19.12.2017г.
Просмотров: 3172
Комментарии: 0
Основы блокчейна

 Читать далее...

19.12.2017г.
Просмотров: 3462
Комментарии: 0
Java 9. Полный обзор нововведений

 Читать далее...

16.02.2017г.
Просмотров: 7279
Комментарии: 0
Опоздавших не бывает, или книга о стеке

 Читать далее...

17.05.2016г.
Просмотров: 10647
Комментарии: 0
Теория вычислений для программистов

 Читать далее...

30.03.2015г.
Просмотров: 12368
Комментарии: 0
От математики к обобщенному программированию

 Читать далее...

18.02.2014г.
Просмотров: 14000
Комментарии: 0
Рецензия на книгу «Читаем Тьюринга»

 Читать далее...

13.02.2014г.
Просмотров: 9126
Комментарии: 0
Читайте, размышляйте, действуйте

 Читать далее...

12.02.2014г.
Просмотров: 7079
Комментарии: 0
Рисуем наши мысли

 Читать далее...

10.02.2014г.
Просмотров: 5389
Комментарии: 3
Страна в цифрах

 Читать далее...

18.12.2013г.
Просмотров: 4617
Комментарии: 0
Большие данные меняют нашу жизнь

 Читать далее...

18.12.2013г.
Просмотров: 3428
Комментарии: 0
Компьютерные технологии – корень зла для точки роста

 Читать далее...

04.12.2013г.
Просмотров: 3158
Комментарии: 0
Паутина в облаках

 Читать далее...

03.12.2013г.
Просмотров: 3402
Комментарии: 0
Рецензия на книгу «MongoDB в действии»

 Читать далее...

02.12.2013г.
Просмотров: 3027
Комментарии: 0
Не думай о минутах свысока

 Читать далее...

Друзья сайта  

 Практика работы с NetBSD: профилирование ядра

Архив номеров / 2004 / Выпуск №8 (21) / Практика работы с NetBSD: профилирование ядра

Рубрика: Администрирование /  Продукты и решения

АЛЕКСАНДР БАЙРАК

Практика работы с NetBSD: профилирование ядра

Перед началом рассмотрения процесса профилирования я предполагаю, что вы установили исходные тексты системы и умеете перекомпилировать ядро. Как это сделать, было описано в статье «Первые шаги в NetBSD. Часть 1», опубликованной в июньском номере журнала.

Целью и задачей профилирования ядра служит сравнение производительности старого и нового ядра. Например, вы скомпилировали новое ядро, и по вашим расчетам оно должно работать быстрее первого, но желаемого результата получено не было. В чем дело? Где вы ошиблись? Все это можно будет выяснить, используя профилирование ядра. Если вы собираете NetBSD для какой-либо встроенной системы, без профилирования вам точно не обойтись. Ведь во встроенных системах аппаратные характеристики железа, как правило, очень ограниченны. А без использования профилирования вряд ли удастся настроить систему на оптимальную производительность.

Рассмотрим пример профилирования для NetBSD, работающей на обычном x86-компьютере. Для примера мы возьмем ядро GENERIC, поставляющееся с системой по умолчанию, и сравним его по производительности с собранным вами новым ядром.

Соберем профилированное GENERIC-ядро.

Переходим в каталог, где располагаются конфигурационные файлы ядра:

# cd /sys/arch/i386/conf/

Опция –p указывает, что собираемое ядро будет профилироваться:

# config –p GENERIC

Запускаем сборку ядра:

# cd ../compile/GENERIC.PROF/

# make depend && make

Сохраняем старое ядро:

# cp /netbsd /netbsd.old

Копируем в корень новое:

# cp netbsd /netbsd

Перезагружаемся:

# reboot

Сразу после загрузки системы проверим, работает профилирование или нет.

# kgmon – b

В ответ мы должны получить:

kgmon: kernel profiling is running.

Теперь отключим профилирование:

# kgmon –h

В ответ мы получим:

kgmon: kernel profiling is off.

Теперь нам нужно поместить данные kgmon в файл.

# kgmon –p

После этой команды мы получим файл gmon.out размером около 3 Мб.

Далее нам нужно получить вывод gprof:

#gprof /netbsd > gprof.out

Должен заметить, имя файла для вывода можно выбрать самому. Примерно через 2-3 минуты в текущем каталоге появится заказанный нами файл gprof.out. После этого переходим непосредственно к процессу анализа полученных данных. Смотрим наш gprof.out (или как вы его назвали).

Первым разделом идет Flat profile, это список всех вызванных функций, время и количество их вызовов.

Вот пример части вывода:

Flat profile:

Each sample counts as 0.01 seconds.
%            cumulative      self                  self            total
time      seconds      seconds      calls      us/call      us/call      name
98.48      4.55            4.55                                          idle
 0.43      4.57            0.02            331      60.42            60.42            pmap_enter
 0.43      4.59            0.02                                          Xtrap0e
 0.22      4.60            0.01            31      322.58            322.58            pmap_do_remove
 0.00      4.61            0.01            4      0.00            422.11       check_exec

Дальше в том же духе. Давайте рассмотрим содержание этих столбцов более подробно.

  1. Сколько всего времени (в процентах) исполнялась та или иная функция.
  2. Общая сумма времени (в секундах) выполнения всех функций до текущего момента.
  3. Время (в секундах) исполнения какой-либо функции. Это основной показатель данной таблицы.
  4. Общее количество вызовов некой функции.
  5. Среднее время (в миллисекундах), истраченное на вызов функции. Если функция не профилируется, то столбец останется пустым. Например, функцию idle, как вы понимаете, «улучшить» никак нельзя, поэтому текущий столбец для этой функции оказался незаполненным.
  6. Среднее время (в миллисекундах), истраченное этой функцией и ее потомками на вызов. Так же, как и в предыдущем столбце, если функция не профилируется, значение остается пустым.
  7. Имя функции.

Как видно из этого фрагмента, подавляющее большинство времени система бездействовала.

Теперь следует раздел Call Graph Profile. Его задача – показать дальнейшие запросы («потомки») от перечисленных функций.

Вот часть вывода:

granularity: each sample hit covers 4 byte(s) for 0.01% of 75.78 seconds

index      % time            self            children      called            name
                                                         
[1]          97.7            74.04            0.00                        idle [1]
                                                          < spontaneous>
[2]           0.9             0.00            0.65                        shed_sync [2]
                         0.01            0.63            12/12         VOP_FSYNC (cycle 1) [4]
                         0.00            0.00            75/1731      ltsleep [62]
                         0.00            0.00            152/1731     lockmgr [310]

И так далее. Всего 6 столбцов с данными.

  1. Уникальное число, присвоенное каждой функции.
  2. Cколько времени (в процентах) исполнялась некая функция и все ее «потомки».
  3. Общий процент времени, истраченный на эту функцию.
  4. Общее время, занятое «потомками» этой функции.
  5. Сколько раз функция была вызвана. После «/» идет количество вызовов этой функции ее потомками. Рекурсивные вызовы не учитываются.
  6. Имя функции.

Следующим разделом этого файла является список всех функций, которые указывались выше, отсортированные в алфавитном порядке, и с указанием уникального номера, присвоенного в разделе Call graph profile. После того как мы проанализировали полученные данные, давайте создадим еще одно ядро системы. Отличие от «оригинального» будет в заведомой «заторможенности» одной из функций. Для примера (как и в NetBSD handbook) возьмем функцию check_exec. Настало время немного поправить ядро системы. Берем свой любимый текстовый редактор и открываем файл /usr/src/sys/kern/kern_exec.c. Ищем там функцию check_exec и добавляем в конце вот такой код:

for (x = 0; x < 100000000; x++)

{

y = x;

}

Не забыв в начале функции check_exec, написать:

int x;

int y;

После внесения этих нехитрых изменений, снова перекомпилируем ядро. Естественно, с профилированием. Перезагрузившись, повторяем уже известные нам действия по созданию файлов gmon.out и gprof.out. И переходим к анализу полученных файлов.

В данном случае результат сразу бросается в глаза, вот что у меня получилось в gprof.out, раздел Flat profile:

Each sample counts as 0.01 seconds.
  %         cumulative         self              self         total
 time         seconds         seconds          calls             us/call        us/call              name
 93.97         136.13         136.13                                                                 idle
  5.87         143.81           7.68             25             466826.09       466842.52            check_exec
  0.01         143.83           0.02            243                 82.30           82.30            pmap_copy_page

Сравним получившиеся результаты функции check_exec с теми, которые были получены до модификации последней.

До:

0.00      4.61            0.01            4           0.00      422.11       check_exec

После:

5.87          143.81       7.68                   25           466826.09       466842.52      check_exec

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

И все видно сразу как на ладони. Для любителей оптимизации и разработчиков встроенных систем это просто находка!

Вообще тема профилирования достаточно обширна, но думаю, что описанного выше простого примера вполне достаточно, чтобы понять принцип профилирования ядра.


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-45
E-mail: sa@samag.ru