В этой главе описывается администрирование подсистемы расширенного учета.
Краткое описание подсистемы расширенного учета приведены в Глава 4Расширенный учет (обзор).
Задача |
Описание |
Инструкции |
---|---|---|
Активация подсистемы расширенного учета |
Расширенный учет используется для контроля потребления ресурсов каждым проектом, выполняющимся в системе. Подсистема расширенного учета позволяет регистрировать данные истории для задач, процессов и потоков. |
Активация расширенного учета для процессов, задач и потоков, Активация расширенного учета при помощи сценария запуска |
Отображение состояния расширенного учета |
Позволяет выяснить состояние подсистемы расширенного учета. | |
Просмотр доступных ресурсов учета |
Позволяет просмотреть ресурсы учета, доступные в системе. | |
Деактивация функциональности учета для процессов, задач потоков |
Выключение функциональных возможностей расширенного учета. | |
Использование интерфейса Perl к подсистеме расширенного учета |
Интерфейс Perl используется для разработки собственных сценариев создания отчетов и извлечения данных. |
Для активации расширенного учета задач, процессов и потоков используется команда acctadm. Дополнительный последний параметр команды acctadm указывает, должна ли команда воздействовать на компоненты подсистемы расширенного учета для процессов, системных задач или потоков.
Перейдите в режим суперпользователя или воспользуйтесь эквивалентной ролью.
Роли содержат подтвержденные полномочия и привилегированные команды. Для получения дополнительной информации о ролях см. Using the Solaris Management Tools With RBAC (Task Map) в System Administration Guide: Basic Administration.
Активируйте расширенный учет для процессов.
# acctadm -e extended -f /var/adm/exacct/proc process |
Активируйте расширенный учет для задач.
# acctadm -e extended,mstate -f /var/adm/exacct/task task |
Активируйте расширенный учет для потоков.
# acctadm -e extended -f /var/adm/exacct/flow flow |
Для получения дополнительной информации см. acctadm(1M).
Активировать расширенный учет на постоянной основе можно путем установки ссылки на сценарий /etc/init.d/acctadm в /etc/rc2.d.
# ln -s /etc/init.d/acctadm /etc/rc2.d/Snacctadm # ln -s /etc/init.d/acctadm /etc/rc2.d/Knacctadm |
Переменная n заменяется числом.
Для настройки конфигурации необходимо по крайней мере один раз активировать расширенный учет вручную.
Информацию по настройке учета приведены в Настройка расширенного учета.
Для вывода текущего состояния подсистемы расширенного учета введите acctadm без аргументов.
# acctadm Task accounting: active Task accounting file: /var/adm/exacct/task Tracked task resources: extended Untracked task resources: none Process accounting: active Process accounting file: /var/adm/exacct/proc Tracked process resources: extended Untracked process resources: host Flow accounting: active Flow accounting file: /var/adm/exacct/flow Tracked flow resources: extended Untracked flow resources: none |
В примере выше для системных задач активирован учет в расширенном режиме и в режиме mstate. Для процессов и потоков активен учет в расширенном режиме.
В контексте расширенного учета микросостояние (mstate) означает дополнительные данные, связанные с переключением микросостояний процессов, которые доступны в файле использования процесса (см. proc(4)). Эти данные предоставляют существенно более подробную информацию о работе процесса, чем базовые или расширенные записи.
Доступные ресурсы могут варьироваться в зависимости от конкретной системы или платформы. Для просмотра ресурсов учета, доступных в системе, можно воспользоваться командой acctadm с параметром -r.
# acctadm -r process: extended pid,uid,gid,cpu,time,command,tty,projid,taskid,ancpid,wait-status,zone,flag, memory,mstatedisplays as one line basic pid,uid,gid,cpu,time,command,tty,flag task: extended taskid,projid,cpu,time,host,mstate,anctaskid,zone basic taskid,projid,cpu,time flow: extended saddr,daddr,sport,dport,proto,dsfield,nbytes,npkts,action,ctime,lseen,projid,uid basic saddr,daddr,sport,dport,proto,nbytes,npkts,action |
Учет деактивируется по отдельности для процессов, задач и потоков командой acctadm с параметром -x.
Перейдите в режим суперпользователя или воспользуйтесь эквивалентной ролью.
Роли содержат подтвержденные полномочия и привилегированные команды. Для получения дополнительной информации о ролях см. Using the Solaris Management Tools With RBAC (Task Map) в System Administration Guide: Basic Administration.
Отключите учет для процессов.
# acctadm -x process |
Отключите учет для задач.
# acctadm -x task |
Отключите учет для потоков.
# acctadm -x flow |
Проверьте отключение учета для задач, процессов и потоков.
# acctadm Task accounting: inactive Task accounting file: none Tracked task resources: extended Untracked task resources: none Process accounting: inactive Process accounting file: none Tracked process resources: extended Untracked process resources: host Flow accounting: inactive Flow accounting file: none Tracked flow resources: extended Untracked flow resources: none |
Для рекурсивного вывода содержимого объекта exacct используется следующий код. Следует отметить, что эта возможность предоставляется библиотекой в виде функции Sun::Solaris::Exacct::Object::dump(). Эта возможность также доступна через упрощенную функцию ea_dump_object().
sub dump_object { my ($obj, $indent) = @_; my $istr = ' ' x $indent; # # Retrieve the catalog tag. Because we are # doing this in an array context, the # catalog tag will be returned as a (type, catalog, id) # triplet, where each member of the triplet will behave as # an integer or a string, depending on context. # If instead this next line provided a scalar context, e.g. # my $cat = $obj->catalog()->value(); # then $cat would be set to the integer value of the # catalog tag. # my @cat = $obj->catalog()->value(); # # If the object is a plain item # if ($obj->type() == &EO_ITEM) { # # Note: The '%s' formats provide s string context, so # the components of the catalog tag will be displayed # as the symbolic values. If we changed the '%s' # formats to '%d', the numeric value of the components # would be displayed. # printf("%sITEM\n%s Catalog = %s|%s|%s\n", $istr, $istr, @cat); $indent++; # # Retrieve the value of the item. If the item contains # in turn a nested exacct object (i.e., an item or # group),then the value method will return a reference # to the appropriate sort of perl object # (Exacct::Object::Item or Exacct::Object::Group). # We could of course figure out that the item contained # a nested item orgroup by examining the catalog tag in # @cat and looking for a type of EXT_EXACCT_OBJECT or # EXT_GROUP. # my $val = $obj->value(); if (ref($val)) { # If it is a nested object, recurse to dump it. dump_object($val, $indent); } else { # Otherwise it is just a 'plain' value, so # display it. printf("%s Value = %s\n", $istr, $val); } # # Otherwise we know we are dealing with a group. Groups # represent contents as a perl list or array (depending on # context), so we can process the contents of the group # with a 'foreach' loop, which provides a list context. # In a list context the value method returns the content # of the group as a perl list, which is the quickest # mechanism, but doesn't allow the group to be modified. # If we wanted to modify the contents of the group we could # do so like this: # my $grp = $obj->value(); # Returns an array reference # $grp->[0] = $newitem; # but accessing the group elements this way is much slower. # } else { printf("%sGROUP\n%s Catalog = %s|%s|%s\n", $istr, $istr, @cat); $indent++; # 'foreach' provides a list context. foreach my $val ($obj->value()) { dump_object($val, $indent); } printf("%sENDGROUP\n", $istr); } } |
Следующий сценарий позволяет создать новую запись группы, которая помещается в файл /tmp/exacct.
#!/usr/bin/perl use strict; use warnings; use Sun::Solaris::Exacct qw(:EXACCT_ALL); # Prototype list of catalog tags and values. my @items = ( [ &EXT_STRING | &EXC_DEFAULT | &EXD_CREATOR => "me" ], [ &EXT_UINT32 | &EXC_DEFAULT | &EXD_PROC_PID => $$ ], [ &EXT_UINT32 | &EXC_DEFAULT | &EXD_PROC_UID => $< ], [ &EXT_UINT32 | &EXC_DEFAULT | &EXD_PROC_GID => $( ], [ &EXT_STRING | &EXC_DEFAULT | &EXD_PROC_COMMAND => "/bin/rec" ], ); # Create a new group catalog object. my $cat = ea_new_catalog(&EXT_GROUP | &EXC_DEFAULT | &EXD_NONE) # Create a new Group object and retrieve its data array. my $group = ea_new_group($cat); my $ary = $group->value(); # Push the new Items onto the Group array. foreach my $v (@items) { push(@$ary, ea_new_item(ea_new_catalog($v->[0]), $v->[1])); } # Open the exacct file, write the record & close. my $f = ea_new_file('/tmp/exacct', &O_RDWR | &O_CREAT | &O_TRUNC) || die("create /tmp/exacct failed: ", ea_error_str(), "\n"); $f->write($group); $f = undef; |
Следующий сценарий на Perl позволяет вывести содержимое файла exacct.
#!/usr/bin/perl use strict; use warnings; use Sun::Solaris::Exacct qw(:EXACCT_ALL); die("Usage is dumpexacct <exacct file>\n") unless (@ARGV == 1); # Open the exact file and display the header information. my $ef = ea_new_file($ARGV[0], &O_RDONLY) || die(error_str()); printf("Creator: %s\n", $ef->creator()); printf("Hostname: %s\n\n", $ef->hostname()); # Dump the file contents while (my $obj = $ef->get()) { ea_dump_object($obj); } # Report any errors if (ea_error() != EXR_OK && ea_error() != EXR_EOF) { printf("\nERROR: %s\n", ea_error_str()); exit(1); } exit(0); |
Ниже приводится пример результата работы функции Sun::Solaris::Exacct::Object->dump() над файлом, созданным в Создание новой записи группы с записью в файле.
Creator: root Hostname: localhost GROUP Catalog = EXT_GROUP|EXC_DEFAULT|EXD_NONE ITEM Catalog = EXT_STRING|EXC_DEFAULT|EXD_CREATOR Value = me ITEM Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_PID Value = 845523 ITEM Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_UID Value = 37845 ITEM Catalog = EXT_UINT32|EXC_DEFAULT|EXD_PROC_GID Value = 10 ITEM Catalog = EXT_STRING|EXC_DEFAULT|EXD_PROC_COMMAND Value = /bin/rec ENDGROUP |