Запуск ProbeVue
Динамическая трассировка разрешена только для пользователей с правами доступа администратора.
Идентификация и права доступа
Этим она отличается от средств трассировки в AIX, где проверка прав доступа не настолько строгая. Для выполнения команды probevue требуются особые права доступа и этому есть объяснение. Сценарий Vue в определенных условиях может повлиять на производительность системы более серьезно, чем статическое средство трассировки, такое как трассировка системы AIX. Это происходит потому, что точки теста трассировки системы предопределены и доступ к ним ограничен. ProbeVue может в определенных обстоятельствах поддерживать намного больше точек теста, а расположения тестов могут быть определены почти в любом месте. Кроме того, для выполнения действий трассировки ProbeVue в точке теста может потребоваться намного больше времени, чем для действий трассировки системы в точке теста, поскольку для них возможен только явный сбор данных.
Также следует учесть, что ProbeVue позволяет трассировать процессы и считывать глобальные переменные ядра. И то и другое необходимо контролировать, чтобы избежать нарушения защиты. Сеанс ProbeVue может интенсивно использовать ресурс закрепленной памяти, а ограничение использования ProbeVue, при котором допускаются только пользователи с правами доступа, снижает риск атак с отказом в обслуживании. ProbeVue также позволяет администраторам управлять использованием памяти сеансами ProbeVue с помощью интерфейса SMIT.
Права доступа для динамической трассировки предоставляются разными способами, в зависимости от того, включено ли ролевое управление доступом (RBAC). Дополнительные сведения о включении и выключении RBAC приведены на страницах справки AIX.
Учтите, что в версии Legacy или в режиме с выключенным RBAC идентификация не предусмотрена. Обычные пользователи не могут получить права доступа для ввода команды probevue для запуска сеанса динамической трассировки или для ввода команды probevctrl для управления ProbeVue. Права доступа к этим функциям могут быть только у администратора. Не выключайте RBAC при использовании ProbeVue, если только не требуется ограничить доступ к этому средству, разрешив доступ только пользователям root.
Режим с включенным RBAC
Получение привилегий в системе RBAC происходит при предоставлении прав доступа. Права доступа представляют собой строку текста, связанную с функциями или командами, которые имеют отношение к защите. Права доступа обеспечивают механизм предоставления прав на выполнение действий, для которых предусмотрены права доступа. Только пользователь с достаточными правами доступа может ввести команду probevue и начать сеанс динамической трассировки.
- aix.ras.probevue.trace.user.self
- Эти права доступа позволяют трассировать соответствующие приложения в пользовательском пространстве. ИД пользователя трассируемого процесса должен совпадать с действительным ИД пользователя, вызывающего команду probevue. С помощью этих прав доступа можно включить точки теста, предоставленные администратором тестов uft для ваших процессов. При этом необходимо, чтобы действующий, действительный и сохраненный идентификаторы пользователя трассируемого процесса совпадали. Таким образом, невозможно выполнить трассировку программ setuid, используя только эти права доступа.
- aix.ras.probevue.trace.user
- С помощью этих прав доступа можно трассировать любое приложение в пользовательском пространстве, включая программы setuid и приложения, запущенные администратором. Будьте внимательны при предоставлении этих прав доступа. С помощью этих прав доступа можно ввести команду probevue и включить точки теста, предоставленные администратором тестов uft для любого процесса в системе.
- aix.ras.probevue.trace.syscall.self
- Эти права доступа позволяют трассировать системные вызовы, создаваемые соответствующими приложениями. Необходимо, чтобы действующий, действительный и сохраненный идентификаторы пользователя процесса, создающего системный вызов, были одинаковыми и совпадали с ИД пользователя, вызвавшего команду probevue. С помощью этих прав доступа можно включить точки теста, предоставленные администратором тестов syscall для ваших процессов. Во втором поле спецификации теста должен быть указан ИД процесса для запущенного вами процесса.
- aix.ras.probevue.trace.syscall
- Эти права доступа позволяют трассировать системные вызовы, создаваемые любым приложением в системе, включая программы setuid и приложения, запущенные администратором. Будьте внимательны при предоставлении этих прав доступа. С помощью этих прав доступа можно ввести команду probevue и включить точки теста, предоставленные администратором тестов syscall для любого процесса. Во втором поле спецификации теста можно указать либо ИД процесса для тестирования определенного процесса, либо * для тестирования всех процессов.
- aix.ras.probevue.trace
- Эти права доступа позволяют трассировать всю систему. В эти права включены все права доступа, определенные в предыдущих разделах. Также можно обратиться к переменным ядра и считывать их при запуске команды probevue, а также трассировать события трассировки системы с помощью администратора тестов systrace и трассировать тесты привязки CPU с помощью администратора интервальных тестов. Использовать эти права доступа следует с особой осторожностью.
- aix.ras.probevue.manage
- Эти права доступа позволяют администрировать ProbeVue. В том числе можно изменять значения различных параметров ProbeVue, запускать и останавливать ProbeVue и показывать сведения о сеансах динамической трассировки любых пользователей при выполнении команды probevctrl. Если этих прав доступа нет, то можно использовать команду probevctrl, чтобы показать данные сеанса для сеансов динамической трассировки, запущенных вами, или показать текущие значения параметров ProbeVue.
- aix.ras.probevue.rase
- Эти права доступа позволяют обращаться к набору функций Vue событий RAS, имеющему высокий уровень привилегий, что может привести к созданию записей трассировки системы и трассировки LMT, созданию оперативного дампа и даже к аварийному завершению работы системы. Этими правами доступа следует управлять с особой осторожностью.
- aix.ras.probevue
- В данном случае предоставляются все права доступа динамической трассировки, что равнозначно объединению всех предыдущих прав доступа.
Администратору (или пользователю root) все эти права доступа присвоены по умолчанию. Другим пользователям права доступа должны присваиваться следующим образом: сначала создается роль с набором прав доступа, а затем эта роль присваивается пользователю. Также пользователю потребуется переключить роли на на роль с требуемыми правами доступа, определенными для динамической трассировки, прежде чем вызвать команду probevue. В следующем примере показано, как предоставить права доступа пользователю "joe", чтобы разрешить тесты пользовательского пространства и системных вызовов для процессов, запущенных пользователем "joe".
mkrole authorizations=
"aix.ras.probevue.trace.user.self,aix.ras.probevue.trace.syscall.self"
apptrace
chuser roles=apptrace joe
setkst -t roleTR
Команда ng:
swrole apptrace
Права доступа ProbeVue
Права доступа, доступные для ProbeVue, перечислены в следующей таблице. В ней приведено описание каждой привилегии и перечислены связанные с ней права доступа. Привилегии составляют иерархическую структуру, в которой родительская привилегия содержит все права доступа, связанные с привилегиями ее потомков, но может также включать в себя дополнительные привилегии.
| Права доступа | Описание | Права доступа | Связанная команда |
|---|---|---|---|
| PV_PROBEVUE_ TRC_USER_SELF | Позволяет процессу включить точки динамического теста пользовательского пространства в другом процессе с тем же самым действительным ИД пользователя. | aix.ras.probevue.trace.user.self aix.ras.probevue.trace.user aix.ras.probevue.trace aix.ras.probevue | probevue |
| PV_PROBEVUE_ TRC_USER | Позволяет процессу включить точки динамического теста пользовательского пространства в другом процессе. Включает в себя привилегию PV_PROBEVUE_ TRC_USER_SELF. | aix.ras.probevue.trace.user aix.ras.probevue.trace aix.ras.probevue | probevue |
| PV_PROBEVUE_ TRC_SYSCALL_SELF | Позволяет процессу включить точки динамического теста системного вызова в другом процессе с тем же самым действительным ИД пользователя. | aix.ras.probevue.trace.syscall.self aix.ras.probevue.trace.syscall aix.ras.probevue.trace aix.ras.probevue | probevue |
| PV_PROBEVUE_ TRC_SYSCALL | Позволяет процессу включить точки динамического теста
пространства системных вызовов в другом процессе. Включает в себя привилегию PV_PROBEVUE_ TRC_SYSCALL_ SELF. |
aix.ras.probevue.trace.syscall aix.ras.probevue.trace aix.ras.probevue | probevue |
| PV_PROBEVUE _TRC_KERNEL | Позволяет процессу обращаться к данным ядра при динамической трассировке. | aix.ras.probevue.trace aix.ras.probevue | probevue |
| PV_PROBEVUE_ MANAGE | Позволяет процессу управлять ProbeVue. | aix.ras.probevue.manage aix.ras.probevue | probevctrl |
| PV_PROBEVUE_ RASE | Разрешает использовать ограниченные функции "событий RAS". | aix.ras.probevue.rase aix.ras.probevue | probevue |
| PV_PROBEVUE_ | Равнозначно всем предыдущим привилегиям (PV_PROBEVUE_*) вместе. | aix.ras.probevue | probevue probevctrl |
ProbeVue параметры
Все параметры ProbeVue можно изменять с помощью интерфейса SMIT (используйте команду быстрого доступа "smit probevue") или непосредственно командой probevctrl. Можно остановить ProbeVue, если активных сеансов динамической трассировки нет, причем для его перезапуска не потребуется перезагрузка. Остановка ProbeVue может быть не выполнена, если были активны какие-либо сеансы, использующие локальные для нити переменные.
В следующей таблице приведен обзор параметров, определенных для сеансов динамической трассировки. В данном описании привилегированный пользователь соответствует администратору или пользователю с правами доступа aix.ras.probevue.trace, а непривилегированный пользователь соответствует пользователю, не имеющему таких прав доступа.
| Описание, как в SMIT | Максимальное значение | Начальное высокое значение конфигурации | Начальное низкое значение конфигурации | Минимальное значение | Связанная команда |
|---|---|---|---|---|---|
| Максимальный размер закрепленной памяти для среды Probevue | 64 ГБ | 10 % доступной памяти или максимальное значение в зависимости от того, какая из этих величин меньше. | 16 МБ | 3 МБ | Максимальный объем закрепленной памяти в МБ, выделенной для структур данных ProbeVue, включая число стеков на CPU и число областей локальных таблиц на CPU, и для всех сеансов
динамической трассировки. Сюда не входит память, выделенная администраторами тестов. Прим.: Этот параметр можно изменить в любой момент, однако новое значение вступит в силу только после перезапуска ProbeVue.
|
| Стандартный размер буфера трассировки на CPU | 256 МБ | 128 КБ | 8 КБ | 4 КБ | Размер буфера по умолчанию в КБ для каждого CPU. Выделяется по два буфера трассировки на CPU для каждого сеанса динамической трассировки ProbeVue: один активный и используемый программой записи или программой на языке Vue при сборе данных трассировки, а другой неактивный и используемый программой чтения или приемником данных трассировки. Например, если на 8-конвейерном процессоре задать размер буфера трассировки на CPU 16 КБ, то общий объем памяти, потребляемой буферами трассировки за сеанс ProbeVue составит 256 КБ. Можно указать другой размер буфера (больше или меньше) при вводе команды probevue, если он в рамках ограничений на память сеанса. |
| Максимальный размер закрепленной памяти для сеансов обычных пользователей | 64 ГБ | 2 МБ | 2 МБ | 0 МБ | Максимальный объем закрепленной памяти, выделенной для сеанса ProbeVue непривилегированного пользователя, включая буферы трассировки на CPU. Значение 0 эффективно выключает всех непривилегированных пользователей. Для привилегированных пользователей нет никаких ограничений на объем памяти, используемой их сеансами ProbeVue. Но для них продолжает действовать ограничение по максимальному объему закрепленной памяти, выделенной для среды ProbeVue. |
| Минимальная скорость чтения буфера трассировки для обычного пользователя | 5000 мс | 100 мс | 100 мс | 10 мс | Минимальный период в миллисекундах, запрашиваемый непривилегированным пользователем, за который приемник трассировки может проверить данные трассировки. Это значение внутренне округляется до следующего большего числа, кратного 10 мс. Привилегированные пользователи не ограничены этим параметром, но самая высокая скорость чтения, которую можно указать, равна 10 миллисекундам. |
| Скорость чтения буфера трассировки по умолчанию | 5000 мс | 100 мс | 100 мс | 10 мс | Период по умолчанию в миллисекундах, за который приемник трассировки проверяет данные трассировки в буферах трассировки памяти. Можно указать другую скорость чтения (больше или меньше) при запуске команды probevue, если это значение будет выше минимального значения скорости чтения буфера. |
| Максимальное число параллельных сеансов для обычного пользователя | 8 | 1 | 1 | 0 | Число параллельных сеансов ProbeVue, разрешенных для непривилегированного пользователя. Нулевое значение эффективно выключает всех непривилегированных пользователей. |
| Размер стека вычисления на CPU | 256 КБ | 20 КБ | 12 КБ | 8 КБ | Размер стека вычисления на CPU, используемый ProbeVue при вводе сценария Vue. Это значение округляется в большую сторону до следующего числа, кратного 8 КБ. ProbeVue выделяет
один стек на CPU для всех сеансов ProbeVue. Память, потребляемая стеками,
не включается в ограничения, устанавливаемые для каждого сеанса. Прим.: Этот параметр можно изменить в любой момент, однако новое значение вступит
в силу только после перекомпоновки и перезагрузки загрузочного образа
ядра AIX. Стек ProbeVue необходимо настроить для применения
виртуальной памяти размером 96 КБ с целью получения списка текущих
каталогов.
|
| Размер локальной таблицы на CPU | 256 КБ | 32 КБ | 4 КБ | 4 КБ | Размер локальной таблицы на CPU, используемой
ProbeVue для хранения переменных автоматического класса памяти, а также
для хранения временных переменных. ProbeVue использует половину этой области
для автоматических переменных, а оставшуюся половину - для сохранения временных
переменных. Это значение всегда
округляется в большую сторону до следующего числа, кратного 4 КБ. ProbeVue выделяет одну локальную таблицу и одну временную таблицу
на CPU для использования всеми сеансами ProbeVue. Память, занимаемая локальными таблицами, не включается в
ограничения, устанавливаемые для каждого сеанса. Прим.: Этот параметр можно изменить в любой момент, однако новое значение вступит в силу только после перезапуска ProbeVue.
|
| Минимальный допустимый интервал для теста с интервалами | нет | 1 | 1 | Минимальный допустимый временной интервал в миллисекундах для теста с интервалами для глобального пользователя root. | |
| Число нитей, подлежащих трассировке | нет | 32 | 32 | 1 | максимальное число нитей, поддерживаемых сеансом ProbeVue при наличии локальных переменных нитей. В ходе инициализации сеанса среда ProbeVue выделяет локальные переменные нитей для максимального числа нитей, указанного в этом атрибуте. Если во время выполнения теста число нитей с локальными переменными превысит указанное значение, то сеанс ProbeVue аварийно завершается. |
| Число страничных ошибок, подлежащих обработке | 1024 | 0 | 0 | 0 | Число контекстов сбоев страниц для обработки ошибок страниц в пределах всей среды. Контекст сбоев страниц содержит стек и локальную таблицу для сохранения переменных автоматических классов и временных переменных. Контекст сбоев страниц требуется для доступа к данным, выгруженным из памяти. Если свободный контекст сбоев страниц для обработки ошибки страницы отсутствует, то ProbeVue не извлекает выгруженные данные. |
| Максимальное время выполнения теста для тестов systrace, когда тест запускается в контексте прерывания | нет | 0 | 0 | 0 | Это число ограничивает максимальное время выполнения теста systrace в контексте прерывания (в мс). По умолчанию установлено нулевое значение, то есть тест systrace может выполняться неограниченное время. |
| Максимальное время выполнения теста для тестов ввода-вывода, когда тест запускается в контексте прерывания | нет | 0 | 0 | 0 | Это число ограничивает максимальное время выполнения теста ввода-вывода в контексте прерывания (в мс). По умолчанию установлено нулевое значение, то есть время не ограничено |
| Максимальное время выполнения теста для тестов sysproc, когда тест запускается в контексте прерывания | нет | 0 | 0 | 0 | Это число ограничивает максимальное время выполнения теста sysproc в контексте прерывания (в мс). По умолчанию установлено нулевое значение, то есть время не ограничено. |
| Максимальное время выполнения теста для тестов сети, когда тест запускается в контексте прерывания | нет | 0 | 0 | 0 | Это число ограничивает максимальное время выполнения теста сети в контексте прерывания (в мс). По умолчанию установлено нулевое значение, то есть время не ограничено. |
| Максимальный размер сетевого буфера | 64 КБ | 64 Б | 96 Б | 96 Б | Это значение - размер заранее выделяемого буфера (в байтах), используемого администратором тестов сети для точек тестирования bpf. Это значение выделяется при включении первого теста bpf и существует в системе до выключения последнего теста bpf. При выключении последнего теста bpf этот буфер освобождается. Этот буфер используется для копирования данных, когда данные пакетов распределены по нескольким буферам пакетов. |
| Интервал получения асинхронной статистики в миллисекундах | NA | 1000 миллисекунд (1 секунда) | 1000 миллисекунд (1 секунда) | 100 миллисекунд | Интервал получения асинхронной статистики в миллисекундах. Это глобальное значение, которое действует для всех сеансов ProbeVue. |
| Получать статистику только в асинхронном режиме | NA | Нет | Нет | NA | Указывает ProbeVue, что статистику следует собрать в асинхронном режиме даже в том случае, если доступен синхронный режим. |
| Максимальное время выполнения теста для интервальных тестов привязки CPU, когда тест запускается в контексте прерывания. | 60 секунд | 60 секунд | 100 миллисекунд | 100 миллисекунд | Это число ограничивает максимальное время (в миллисекундах) выполнения интервального теста привязки CPU в контексте прерывания. По умолчанию принимается значение 60 с. |
Профилирование сеанса ProbeVue
В среде ProbeVue есть функция профилирования, которую можно включать и выключать для оценки влияния активных тестов на приложение. Эта функция суммирует время, ушедшее на выполнение действий тестов, и выдает отчет по запросу и по завершении сеанса.
Отчет профилирования содержит строку теста и время, затраченное на выполнение действия, связанного с этой строкой. Время выполнения действия теста заносится в список, содержащий общее, минимальное, максимальное и среднее время выполнения действия теста. Данные профилирования также содержат информацию о том, сколько раз измерялось время выполнения действия теста. В случае формирования профайла для нескольких функций в одной строке теста (с помощью регулярного выражения или * вместо имени функции) данные профилирования содержат суммарную информацию для тестов, запущенных для всех таких функций. Информация о времени выполнения функций, которые тестируются отдельно, не включается, включается только информация для всего теста целиком.
Действия теста BEGIN и END не профилируются этой функцией. Информация профилирования касается только сеанса. Профилирование сеанса probevue можно включить при запуске сеанса с помощью команды probevue или probevctrl.
Дополнительная информация приведена в описании команд probevue и probevctrl.
Примеры программ
Пример 1
Следующая каноническая программа "Здравствуй, мир" печатает "Здравствуй, мир" в буфер трассировки и завершает работу:
#!/usr/bin/probevue
/* Hello World in probevue */
/* Program name: hello.e */
@@BEGIN
{
printf("Hello World\n");
exit();
}
Пример 2
Следующая программа "Здравствуй, мир" печатает "Здравствуй, мир" при нажатии клавиш Ctrl-C:
#!/usr/bin/probevue
/* Hello World 2 in probevue */
/* Имя программы: hello2.e */
@@END
{
printf("Hello World\n");
}
Пример 3
Следующая программа показывает использование переменных локальной нити. В этом Vue сценарии подсчитывается число байт, записанных в определенный файл. Подразумевается, что у процессов по одной нити или нити, открывающие файлы, являются теми же нитями, которые выполняют запись в эти файлы. Также подразумевается, что все операции записи выполняются успешно. Сценарий можно остановить в любой момент и получить текущее значение числа записанных байт, введя с терминала Ctrl-C.
#!/usr/bin/probevue
/* Имя программы: countbytes.e */
int open( char * Path, int OFlag, int mode );
int write( int fd, char * buf, int sz);
int done;
@@syscall:*:open:entry
when (done != 0 )
{
if (get_userstring(__arg1, -1) == "/tmp/foo") {
thread:trace = 1;
done = 1;
}
}
@@syscall:*:open:exit
when (thread:trace)
{
thread:fd = __rv;
}
@@syscall:*:write:entry
when (thread:trace && __arg1 == thread:fd)
{
bytes += __arg3; /* число байтов - третий аргумент */
}
@@END
{
printf("Bytes written = %d\n", bytes);
}
Пример 4
В следующей программе предварительной трассировки показано, как сделать так, чтобы трассировка параметров, переданных в системный вызов чтения, выполнялась только в том случае, если при чтении файла foo.data возвращается значение 0 байт:
#!/usr/bin/probevue
/* Файл: ttrace.e */
/* Пример предварительной трассировки */
/* Сбор данных о параметрах сист. вызова чтения только при сбое чтения */
int open ( char* Path, int OFlag , int mode );
int read ( int fd, char * buf, int sz);
@@syscall:*:open:entry
{
filename = get_userstring(__arg1, -1);
if (filename == "foo.data") {
thread:open = 1;
start_tentative("read");
printf("File foo.data opened\n");
}
}
@@syscall:*:open:exit
when (thread:open == 1)
{
thread:fd = __rv;
start_tentative("read");
printf("fd = %d\n", thread:fd);
thread:open = 0;
}
@@syscall:*:read:entry
when (__arg1 == thread:fd)
{
start_tentative("read");
printf("Read fd = %d, input buffer = 0x%08x, bytes = %d,",
__arg1, __arg2, __arg3);
end_tentative("read");
thread:read = 1;
}
@@syscall:*:read:exit
when (thread:read == 1)
{
if (__rv < 0) {
/* printf ниже, хотя и не предварительный, выполняется только
* в случае ошибки и объединяется с ранее
* напечатанными предварительными данными
*/
printf(" errno = %d\n", __errno);
commit_tentative("read");
}
else
discard_tentative("read");
thread:read = 0;
}
Возможный вывод, в случае сбоя при чтении из-за неправильного адреса (например: 0x1000), переданного в качестве указателя на буфер входных данных, может иметь следующий вид:
#probevue ttrace.e
File foo.data opened
fd = 4
Read fd = 4, input buffer = 0x00001000, bytes = 256, errno = 14
Пример 5
Следующий сценарий Vue печатает значения некоторых переменных ядра и сразу завершается. Обратите внимание на функцию exit в тесте @@BEGIN:
/* Файл: kernel.e */
/* Пример обращения к переменным ядра */
/* Структура конфигурации системы из /usr/include/sys/systemcfg.h */
struct system_configuration {
int architecture; /* архитектура процессора */
int implementation; /* реализация процессора */
int version; /* версия процессора */
int width; /* width (32 || 64) */
int ncpus; /* 1 = UP, n = n-way MP */
int cache_attrib; /* атрибуты кэша L1 (битовые флаги) */
/* бит 0/1 значение */
/* -------------------------------------*/
/* 31 без кэша / кэш имеется */
/* 30 раздельные I и D / объединенные */
int icache_size; /* размер кэша инструкций L1 */
int dcache_size; /* размер кэша данных L1 */
int icache_asc; /* ассоциативность кэша инструкций L1 */
int dcache_asc; /* ассоциативность кэша данных L1 */
int icache_block; /* размер блока кэша инструкций L1 */
int dcache_block; /* размер блока кэша данных L1 */
int icache_line; /* размер линии кэша инструкций L1 */
int dcache_line; /* размер линии кэша данных L1 */
int L2_cache_size; /* размер кэша L2, 0 = Нет кэша L2 */
int L2_cache_asc; /* ассоциативность кэша L2 */
int tlb_attrib; /* атрибуты TLB (битовые флаги) */
/* бит 0/1 значение */
/* -------------------------------------*/
/* 31 без TLB / TLB имеется */
/* 30 раздельные I и D / объединенные */
int itlb_size; /* записей в TLB инструкций */
int dtlb_size; /* записей в TLB данных */
int itlb_asc; /* ассоциативность tlb инструкций */
int dtlb_asc; /* ассоциативность tlb данных */
int resv_size; /* размер резервирования */
int priv_lck_cnt; /* счетчик блокировки прокрутки в режиме диспетчера */
int prob_lck_cnt; /* счетчик блокировки прокрутки в состоянии ошибки */
int rtc_type; /* тип RTC */
int virt_alias; /* 1 - псевдонимы аппаратного обеспечения поддерживаются */
int cach_cong; /* число разрядов страницы для синонима кэша */
int model_arch; /* используется системой для определения модели */
int model_impl; /* используется системой для определения модели */
int Xint; /* используется системой для временного преобразования */
int Xfrac; /* используется системой для временного преобразования */
int kernel; /* атрибуты ядра */
/* бит 0/1 значение */
/* -----------------------------------------*/
/* 31 32-разрядное ядро / 64-разрядное ядро */
/* 30 без LPAR / LPAR */
/* 29 преж. 64-р. ABI / 64-р. Large ABI */
/* 28 без NUMA / NUMA */
/* 27 UP / MP */
/* 26 без доб. DR CPU / доб. DR CPU подд. */
/* 25 без DR CPU rm / DR CPU rm поддерж. */
/* 24 без доб. DR MEM / доб. DR MEM подд. */
/* 23 без DR MEM rm / DR MEM rm поддерж. */
/* 22 ключи ядра выключены / включены */
/* 21 без восстан. / восстанов. поддерж. */
/* 20 без MLS / MLS включено */
long long physmem; /* байт памяти, доступной для OS */
int slb_attr; /* атрибуты SLB */
/* бит 0/1 значение */
/* -----------------------------------------*/
/* 31 Под управлением ПО */
int slb_size; /* размер slb (0 = без slb) */
int original_ncpus; /* исходное количество CPU */
int max_ncpus; /* макс. число CPU, подд. этим образом AIX */
long long maxrealaddr; /* макс. подд. действит. адрес памяти +1 */
long long original_entitled_capacity;
/* настроенная процессорная мощность при */
/* загрузке, необходимая для утилит LPAR */
/* обмена данными между разделами. */
long long entitled_capacity; /* процессорная мощность */
long long dispatch_wheel; /* Период круга диспетчеризации (ед. TB) */
int capacity_increment; /* допустимое приращение мощности */
int variable_capacity_weight; /* приоритетный вес для распределения*/
/* мощности при простое */
int splpar_status; /* Состояние подключения SPLPAR */
/* 0x1 => 1=поддержка SPLPAR; 0=нет */
/* 0x2 => SPLPAR включен 0=выделенный; */
/* 1=общий */
int smt_status; /* Состояние подключения SMT */
/* 0x1 = поддержка SMT 0=нет/1=да */
/* 0x2 = SMT включен 0=нет/1=да */
/* 0x4 = нити SMT связаны (true) 0=нет/1=да*/
int smt_threads; /* Число нитей SMT на физический CPU */
int vmx_version; /* версия VMX, определенная RPA, 0=нет/выкл.*/
long long sys_lmbsize; /* Размер LMB в этой системе. */
int num_xcpus; /* Число исключающих CPU на линии */
signed char errchecklevel;/* Уровень проверки ошибок ядра */
char pad[3]; /* отступ до границы слова */
int dfp_version; /* версия DFP, определенная RPA, 0=нет/выкл.*/
/* если задан MSbit, то имитируется DFP */
};
__kernel struct system_configuration _system_configuration;
@@BEGIN
{
String s[40];
int j;
__kernel int max_sdl; /* Атомарный уровень расщепления системы RAD */
__kernel long lbolt; /* Тактов после загрузки */
printf("Число подключенных CPU\t\t= %d\n", _system_configuration.ncpus);
/* Печать состояния SMT */
printf("Состояние SMT\t\t\t=");
if (_system_configuration.smt_status == 0)
printf(" Нет");
else {
if (_system_configuration.smt_status & 0x01)
printf(" Поддержка");
if (_system_configuration.smt_status & 0x02)
printf(" Включен");
if (_system_configuration.smt_status & 0x04)
printf(" BoundThreads");
}
printf("\n");
/* Печать уровня проверки ошибок */
if (_system_configuration.errchecklevel == 1)
s = "Минимальный";
else if (_system_configuration.errchecklevel == 3)
s = "Обычный";
else if (_system_configuration.errchecklevel == 7)
s = "Подробный";
else if (_system_configuration.errchecklevel == 9)
s = "Максимальный";
printf("Уровень проверки ошибок\t\t= %s\n",s);
printf("Атомарный уров. подр. сист. RAD\t= %d\n", max_sdl);
/* Long в ядре соотв. 64 разр., поэтому используйте %lld ниже */
printf("Число тактов после загрузки\t= %lld\n", lbolt);
exit();
}
Ниже приведен возможный вывод, полученный в результате выполнения описанного сценария в выделенном разделе Power 5 с атрибутами ядра по умолчанию:
# probevue kernel.e
Число подключенных CPU = 4
Состояние SMT = Поддержка Включен BoundThreads
Уровень проверки ошибок = Обычный
Атомарный уров. подр. сист. RAD = 2
Число тактов после загрузки = 34855934