Руководство по системному администрированию: контейнеры в Solaris - управление ресурсами и зонами

Глава 5 Администрирование расширенного учета (задачи)

В этой главе описывается администрирование подсистемы расширенного учета.

Краткое описание подсистемы расширенного учета приведены в Глава 4Расширенный учет (обзор).

Администрирование подсистемы расширенного учета (карта задач)

Задача 

Описание 

Инструкции 

Активация подсистемы расширенного учета 

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

Активация расширенного учета для процессов, задач и потоков, Активация расширенного учета при помощи сценария запуска

Отображение состояния расширенного учета 

Позволяет выяснить состояние подсистемы расширенного учета. 

Отображение состояния расширенного учета

Просмотр доступных ресурсов учета 

Позволяет просмотреть ресурсы учета, доступные в системе. 

Просмотр доступных ресурсов учета

Деактивация функциональности учета для процессов, задач потоков 

Выключение функциональных возможностей расширенного учета. 

Деактивация учета для процессов, задач и потоков

Использование интерфейса Perl к подсистеме расширенного учета 

Интерфейс Perl используется для разработки собственных сценариев создания отчетов и извлечения данных. 

Использование интерфейса Perl для libexacct

Использование функциональных возможностей расширенного учета

ProcedureАктивация расширенного учета для процессов, задач и потоков

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

  1. Перейдите в режим суперпользователя или воспользуйтесь эквивалентной ролью.

    Роли содержат подтвержденные полномочия и привилегированные команды. Для получения дополнительной информации о ролях см. Using the Solaris Management Tools With RBAC (Task Map) в System Administration Guide: Basic Administration.

  2. Активируйте расширенный учет для процессов.


    # acctadm -e extended -f /var/adm/exacct/proc process
    
  3. Активируйте расширенный учет для задач.


    # acctadm -e extended,mstate -f /var/adm/exacct/task task
    
  4. Активируйте расширенный учет для потоков.


    # 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

ProcedureДеактивация учета для процессов, задач и потоков

Учет деактивируется по отдельности для процессов, задач и потоков командой acctadm с параметром -x.

  1. Перейдите в режим суперпользователя или воспользуйтесь эквивалентной ролью.

    Роли содержат подтвержденные полномочия и привилегированные команды. Для получения дополнительной информации о ролях см. Using the Solaris Management Tools With RBAC (Task Map) в System Administration Guide: Basic Administration.

  2. Отключите учет для процессов.


    # acctadm -x process 
    
  3. Отключите учет для задач.


    # acctadm -x task
    
  4. Отключите учет для потоков.


    # acctadm -x flow
    
  5. Проверьте отключение учета для задач, процессов и потоков.


    	# 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

Использование интерфейса Perl для libexacct

Рекурсивный вывод содержимого объекта exacct

Для рекурсивного вывода содержимого объекта 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;

Вывод содержимого файла exacct

Следующий сценарий на 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()

Ниже приводится пример результата работы функции 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