Технологические ресурсы

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

Ниже приведены основные сведения о ресурсах системы или процесса с помощью команд:

Верхняя команда

$ top

Команда top постоянно отображает использование системных ресурсов. Если какой-либо процесс переводит систему в некое состояние зависания (потребляя больше ресурсов ЦП или памяти), можно записать информацию о процессе и предпринять соответствующие действия (например, убить связанный процесс).

Команда ps

$ ps

Команда ps предоставляет информацию обо всех запущенных процессах. Это помогает контролировать и контролировать процессы.

Команда vmstat

$ vmstat

Команда vmstat сообщает статистику подсистемы виртуальной памяти. Он сообщает информацию о процессах (ожидающих выполнения, спящих, запущенных процессах и т. Д.), Памяти (информация о виртуальной памяти, например, свободная, использованная и т. Д.), Области подкачки, устройствах ввода-вывода, системной информации (количество прерываний, переключение контекста). ) и процессор (пользовательский, системный и простой).

Команда lsof

$ lsof

Команда lsof печатает список открытых файлов всех текущих запущенных процессов, включая системные процессы.

Команда getconf

$ getconf –a

Команда getconf отображает информацию о переменных конфигурации системы.

Теперь давайте посмотрим на соответствующие системные вызовы.

  • Системный вызов getrusage (), который предоставляет информацию об использовании системных ресурсов.

  • Системные вызовы, связанные с доступом и настройкой лимитов ресурсов: getrlimit (), setrlimit (), prlimit ().

Вызов использования системных ресурсов

#include <sys/time.h>
#include <sys/resource.h>

int getrusage(int who, struct rusage *usage);

Системный вызов getrusage () возвращает информацию об использовании системных ресурсов. Это может включать информацию о себе, дочерних элементах или вызывающем потоке с использованием флагов RUSAGE_SELF, RUSAGE_CHILDREN, RUSAGE_THREAD для переменной who. После вызова он возвращает информацию в структуру rusage.

Этот вызов вернет «0» в случае успеха и «-1» в случае ошибки.

Давайте посмотрим на следующий пример программы.

/ * Имя файла: sysinfo_getrusage.c * /

#include<stdio.h>
#include<sys/time.h>
#include<sys/resource.h>

void main(void) {
   struct rusage res_usage;
   int retval;
   retval = getrusage(RUSAGE_SELF, &res_usage);
   if (retval == -1) {
      perror("getrusage error");
      return;
   }
   printf("Details of getrusage:\n");
   printf("User CPU time (seconds) is %d\n", (int)res_usage.ru_utime.tv_sec);
   printf("User CPU time (micro seconds) is %d\n", (int)res_usage.ru_utime.tv_usec);
   printf("Maximum size of resident set (kb) is %ld\n", res_usage.ru_maxrss);
   printf("Soft page faults (I/O not required) is %ld\n", res_usage.ru_minflt);
   printf("Hard page faults (I/O not required) is %ld\n", res_usage.ru_majflt);
   printf("Block input operations via file system is %ld\n", res_usage.ru_inblock);
   printf("Block output operations via file system is %ld\n", res_usage.ru_oublock);
   printf("Voluntary context switches are %ld\n", res_usage.ru_nvcsw);
   printf("Involuntary context switches are %ld\n", res_usage.ru_nivcsw);
   return;
}

Шаги компиляции и выполнения

Details of getrusage:
User CPU time (seconds) is 0
User CPU time (micro seconds) is 0
Maximum size of resident set (kb) is 364
Soft page faults (I/O not required) is 137
Hard page faults (I/O not required) is 0
Block input operations via file system is 0
Block output operations via file system is 0
Voluntary context switches are 0
Involuntary context switches are 1

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

#include <sys/time.h>
#include <sys/resource.h>

int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);
int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);

Системный вызов getrlimit () получает ограничения ресурсов в структуре rlimit путем ввода необходимого ресурса, такого как RLIMIT_NOFILE, RLIMIT_NPROC, RLIMIT_STACK и т. Д.

Системный вызов setrlimit () устанавливает пределы ресурса, указанные в структуре rlimit, в пределах этих ограничений.

Системный вызов prlimit () используется для различных целей, например, для извлечения текущих пределов ресурса или для обновления пределов ресурса до новых значений.

Структура rlimit содержит два значения -

  • Мягкий предел - текущий предел

  • Жесткий предел - максимальный предел, до которого он может быть расширен.

RLIMIT_NOFILE - возвращает максимальное количество файловых дескрипторов, которые могут быть открыты этим процессом. Например, если он возвращает 1024, то у процесса есть файловые дескрипторы от 0 до 1023.

RLIMIT_NPROC - максимальное количество процессов, которое может быть создано для пользователя этого процесса.

RLIMIT_STACK - максимальный размер в байтах сегмента стека для этого процесса.

Все эти вызовы возвращали бы «0» в случае успеха и «-1» в случае неудачи.

Давайте рассмотрим следующий пример, где мы используем системный вызов getrlimit ().

/ * Имя файла: sysinfo_getrlimit.c * /

#include<stdio.h>
#include<sys/time.h>
#include<sys/resource.h>

void main(void) {
   struct rlimit res_limit;
   int retval;
   int resources[] = {RLIMIT_NOFILE, RLIMIT_NPROC, RLIMIT_STACK};
   int max_res;
   int counter = 0;
   printf("Details of resource limits for NOFILE, NPROC, STACK are as follows: \n");
   max_res = sizeof(resources)/sizeof(int);
   while (counter < max_res) {
      retval = getrlimit(resources[counter], &res_limit);
      if (retval == -1) {
         perror("getrlimit error");
         return;
      }
      printf("Soft Limit is %ld\n", res_limit.rlim_cur);
      printf("Hard Limit (ceiling) is %ld\n", res_limit.rlim_max);
      counter++;
   }
   return;
}

Шаги компиляции и выполнения

Details of resource limits for NOFILE, NPROC, STACK are as follows: 
Soft Limit is 516
Hard Limit (ceiling) is 516
Soft Limit is 256
Hard Limit (ceiling) is 256
Soft Limit is 33554432
Hard Limit (ceiling) is 33554432

Давайте рассмотрим другой пример с системным вызовом getrlimit (), но теперь с системным вызовом prlimit ().

/ * Имя файла: sysinfo_prlimit.c * /

#include<stdio.h>
#include<unistd.h>
#include<sys/time.h>
#include<sys/resource.h>

void main(void) {
   struct rlimit res_limit;
   int retval;
   int resources[] = {RLIMIT_NOFILE, RLIMIT_NPROC, RLIMIT_STACK};
   int max_res;
   int counter = 0;
   printf("Details of resource limits for NOFILE, NPROC, STACK using prlimit are as follows: \n");
   max_res = sizeof(resources)/sizeof(int);
   while (counter < max_res) {
      retval = prlimit(getpid(), resources[counter], NULL , &res_limit);
      if (retval == -1) {
         perror("prlimit error");
         return;
      }
      printf("Soft Limit is %ld\n", res_limit.rlim_cur);
      printf("Hard Limit (ceiling) is %ld\n", res_limit.rlim_max);
      counter++;
   }
   return;
}

Шаги компиляции и выполнения

Details of resource limits for NOFILE, NPROC, STACK using prlimit are as follows: 
Soft Limit is 516
Hard Limit (ceiling) is 516
Soft Limit is 256
Hard Limit (ceiling) is 256
Soft Limit is 33554432
Hard Limit (ceiling) is 33554432