该进程需要某些资源(如CPU和内存)来执行任务,现在我们将研究相关的命令和系统调用,以了解有关资源利用和监视的信息。默认情况下,每个进程对资源都有一定的限制,如果需要,可以增强这些限制以适应应用程序的要求。
以下是使用命令的基本系统或进程资源信息-
$top
top命令连续显示系统资源的使用情况,如果有任何进程使系统处于某种挂起状态,则可以记录该进程信息并采取适当的措施(例如杀死相关进程)。
$ps
ps命令提供有关所有正在运行的进程的信息,这有助于监视和控制过程。
$vmstat
vmstat命令报告虚拟内存子系统的统计信息,它报告进程的信息(等待运行,睡眠,可运行的进程等),内存(虚拟内存信息,例如空闲,已使用等),交换区域,IO设备,系统信息(中断数,上下文切换))和CPU(用户,系统和空闲时间)。
$lsof
lsof命令显示所有当前正在运行的进程(包括系统进程)的打开文件列表。
$getconf –a
getconf命令显示系统配置变量信息。
现在,让我们看一下相关的系统调用。
系统调用getrusage(),它提供有关系统资源使用情况的信息。
与访问和设置资源限制有关的系统调用,即getrlimit(),setrlimit(),prlimit()。
#include <sys/time.h> #include <sys/resource.h> int getrusage(int who, struct rusage *usage);
系统调用getrusage()返回有关系统资源使用情况的信息,这可以包括有关" who"变量的使用标志RUSAGE_SELF,RUSAGE_CHILDREN,RUSAGE_THREAD的自身,子进程或调用线程的信息,调用之后,它将以结构体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_NOFILE,RLIMIT_NPROC,RLIMIT_STACK等)来获取结构rlimit中的资源限制。
系统调用 setrlimit() 设置rlimit结构中提到的资源限制,直到限制之内。
系统调用 prlimit() 用于多种用途,如用于检索当前资源限制或将资源限制更新为新值。
来源:LearnFk无涯教程网
结构rlimit包含两个值-
软限制(Soft limit) - 当前限制
硬限制(Hard limit) - 可以扩展到的最大限制。
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
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)