進程資源


進程需要一定的資源,如CPU和記憶體來執行任務。 現在我們將檢視相關的命令和系統呼叫來了解資源利用和監視的資訊。 此外,資源上的每個過程在預設情況下都有一定的限制,如果需要,可以增加限制以適應應用需求。

以下是使用命令的基本系統或過程資源資訊 -

top命令

yiibai$ top

top命令不斷顯示系統資源的使用情況。 如果任何進程使系統處於某種掛起狀態(消耗更多的CPU或記憶體),則可能會記錄進程資訊並採取相應的措施(例如,殺死相關進程)。

ps命令

yiibai$ ps

ps命令提供有關所有正在執行的進程的資訊。 這有助於監視和控制過程。

vmstat命令

yiibai$ vmstat

vmstat命令報告虛擬記憶體子系統的統計資訊。 它報告進程(等待執行,睡眠,可執行進程等),記憶體(虛擬記憶體資訊,如空閒,已使用等),交換區域,IO裝置,系統資訊(中斷數目,上下文切換 )和CPU(使用者,系統和空閒時間)。

lsof命令

yiibai$ lsof

lsof命令列印所有當前正在執行的進程(包括系統進程)的開啟檔案列表。

getconf命令

yiibai$ getconf

getconf命令顯示系統組態變數資訊。現在,讓我們看看相關的系統呼叫。

  • 系統呼叫getrusage(),它提供有關系統資源使用情況的資訊。
  • 與存取和設定資源限制(即getrlimit()setrlimit()prlimit())有關的系統呼叫。

系統資源使用呼叫

參考以下程式碼 -

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

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

系統呼叫getrusage()返回有關系統資源使用情況的資訊。 這可以包括關於自身,子進程或呼叫執行緒的資訊,使用標誌RUSAGE_SELFRUSAGE_CHILDRENRUSAGE_THREAD來表示「who」變數。 通話結束後,它返回結構中的資訊。

這個呼叫會在成功時返回「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_NOFILERLIMIT_NPROCRLIMIT_STACK等等)來獲取結構rlimit中的資源限制。
系統呼叫setrlimit()盡可能地在rlimit結構中設定資源限制。
系統呼叫prlimit()用於檢索當前資源限制或將資源限制更新為新值。

結構rlimit包含兩個值 -

  • 軟限制 - 當前限制
  • 硬限制 - 可以擴充套件的最大限制。

RLIMIT_NOFILE - 返回此進程可以開啟的最大檔案描述符數量。 例如,如果它返回1024,那麼該進程具有從01023的檔案描述符。
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