限制进程使用的内存大小和CPU时间
linux进程的资源限制
最近软件比武,需要限制每个进程的内存使用大小和CPU使用时间,而以前使用的CPPUTEST测试框架里没有这些东西,需要自己写。发现linux下的setrlimit函数就能很好的解决问题了。
setrlimit和getrlimit
每个进程都有一组资源限制,可以通过getrlimit和setrlimit函数查询更改。
注意:
资源限制影响到调用进程并由子进程继承。
函数原型
#include <sys/resource.h>int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);struct rlimit {rlim_t rlim_cur; /* Soft limit */rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */
};
更改资源限制时,有以下几点规则:
1. 软限制值小于等于硬限制值;
2. 超级用户才能更改硬限制值;
可通过reource参数设置需要更改的资源限制
下面介绍一下关心的时间和内存限制:
RLIMIT_CPU
cpu使用的最大值(秒),当超过软限制时,内核向改进程发送SIGXCPU信号。进程可以捕捉该信号,到内核会每个1s发一次,当超过硬限制时,会发送SIGKILL信号终止该进程。RLIMIT_AS
进程可用存储区的最大长度(字节)。这会影响sbrk很mmap函数。超过限制会收到SIGSEGV信号。RLIMIT_DATA
数据段的最大字节长度,这是初始化、非初始化以及堆的总大小。超过限制会收到SIGSEGV信号。RLIMIT_STACK
栈的最大大小
RLIMIT_AS和RLIMIT_DATA
- 在实际使用中,我们往往会限制竞赛程序的malloc分配总大小和全局数组空间大小。那么这两个参数该怎么用才能限制住呢?
全局数组肯定会占用数据段的大小,用RLIMIT_DATA限制即可。关键是malloc的限制,这个glibc的实现有关了。glibc在分配小内存时在堆上分配,这通过RLIMIT_DATA可以限制;而超过限制的大内存是通过mmap分配,mmap分配的不在堆上,而它产生的地址空间受RLIMIT_AS影响。
问题:RLIMIT_DATA和RLIMIT_AS限制多大合适?
参考:
https://github.com/lodevil/Lo-runner/issues/10
http://www.cnblogs.com/niocai/archive/2012/04/01/2428128.html
unix系统高级编程
一段限制的小程序
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/time.h> #include <sys/resource.h> #include <sys/wait.h> #include <unistd.h>#define KB (1024)void set_limit(void) {struct rlimit memory_limit;//限制进程虚拟地址段大小memory_limit.rlim_cur = memory_limit.rlim_max = 10*1024*KB;if(setrlimit(RLIMIT_AS, &memory_limit))perror("setrlimit:");//限制进程数据段大小memory_limit.rlim_cur = memory_limit.rlim_max = 10*1024*KB;if(setrlimit(RLIMIT_DATA, &memory_limit))perror("setrlimit:");//限制进程栈大小memory_limit.rlim_cur = memory_limit.rlim_max = 1024*KB;if(setrlimit(RLIMIT_STACK, &memory_limit))perror("setrlimit:");//限制进程CPU时间memory_limit.rlim_cur = memory_limit.rlim_max = 1;if(setrlimit(RLIMIT_CPU, &memory_limit))perror("setrlimit:"); }int main(int argc, char *argv[]) {pid_t pid;int status;/* 子进程参数处理 */char *child_argv[10] = {NULL};int i = 0;for(i = 1; i < argc; i++){child_argv[i-1] = argv[i];}set_limit();if((pid = fork()) < 0){perror("");exit(-1);}else if(pid == 0){execvp(child_argv[0], child_argv); //执行竞赛程序printf("llm->%s(%d) execvp error\n", __FUNCTION__, __LINE__);}else{if(wait(&status) != pid)perror("wait:");if(WIFEXITED(status))printf("child process normal exit\n");else if(WIFSIGNALED(status))printf("abort, signal number = %d\n", WTERMSIG(status));}return 0; }
限制进程使用的内存大小和CPU时间相关推荐
- android如何获取进程占用的内存大小,Android获取cpu使用率,剩余内存和硬盘容量
1.内存信息 在proc/meminfo下有详细的内存使用情况,我这里获取的内存信息就是从这个文件里获取的.获取到详细的内存信息后根据我自己的需求,从bufferdreader中单独抽取出来了剩余的内 ...
- linux查看进程占用的内存大小,查看进程占用内存大小的几种方法,占用内存几种方法...
查看进程占用内存大小的几种方法,占用内存几种方法 1. pmap -x pid 2. ps -aux | grep 进程名 ps -e -o 'pid,comm,args,pcpu,rsz,vsz,s ...
- 查看Linux服务器内存大小,cpu个数,型号
查看服务器内存大小的命令 cat /proc/meminfo | grep MemTotal 查看服务器CPU个数命令 cat /proc/cpuinfo | grep "physical ...
- 使用 getprop 命令查看 android 系统允许进程分配的内存大小
下面输出的红色字体就是 android 允许进程分配的堆空间大小限制. D:\>adb shell getprop [UserVolumeLabel]: [IFive] [camera2.por ...
- python使用psutil获取系统(Windows Linux)所有运行进程信息实战:CPU时间、内存使用量、内存占用率、PID、名称、创建时间等;
python使用psutil获取系统(Windows Linux)所有运行进程信息实战:CPU时间.内存使用量.内存占用率.PID.名称.创建时间等: psutil模块可以跨平台使用,支持Linux/ ...
- linux监测cpu 内存,Linux中CPU与内存性能监测.docx
Linux中CPU与内存性能监测(出处://chenleixing/article/details 在系统维护的过程中,随时可能有需要查看 CPU 使用率内存使用情况的需要,尤其是涉及到JVM,程序调 ...
- linux 释放进程res_linux下查询进程占用的内存方法总结
linux下查询进程占用的内存方法总结 假设现在有一个「php-cgi」的进程 ,进程id为「25282」.现在想要查询该进程占用的内存大小.linux命令行 下有很多的工具进行查看,现总结常见的几种 ...
- linux OOM-killer机制(杀掉进程,释放内存)
Linux下面有个特性叫OOM killer(Out Of Memory killer),这个东西会在系统内存耗尽的情况下跳出来,选择性的干掉一些进程以求释放一些内存.相信广大从事Linux服务端编程 ...
- java8中方法区的内存大小如何设置_从Java8升级到Java11
奇技 · 指南 为什么选择Java11? 容器环境支持,GC等领域的增强,仅通过切换到 Java 11 就有 16% 的改进. 进行了瘦身,更轻量级,安装包体积小. JDK11 是一个长期支持版. 1 ...
最新文章
- gunzip 和 unzip 解压文件到指定的目录
- 编程之美3.3 计算两个字符串的相似度
- Linux进程地址空间与进程内存布局详解,内核空间与用户空间
- WinForm 之 程序启动不显示主窗体
- 【317】python 指定浏览器打开网页 / 文件
- 字符串hash(一)
- Hibernate之性能优化
- 在静态页面中使用Scss(windows)
- 有了C盘之后,添加另外一个磁盘的方法
- Python笔记(5) 变量类型
- JQuery中的省市联动
- ZooKeeper官方文档学习笔记05-ZooKeeper的屏障(Barrier)和队列(Queue)教程
- gaot工具箱介绍及应用
- 路由与交换技术(复习知识点-全)
- 【Zotero同步管理】【Zotero 6.0 + 坚果云 + iPad官方zotero APP】最新版教程
- 微信接口类php,【微信接口库】分享10个常用的php微信接口类
- 20210412SQL实现全称量词和集合查询
- 北部湾及涠洲岛海域潮汐和海平面特征
- 西湖大学人工智能与生物医学影像实验室招聘科研助理及博士后
- C语言dlopen()和dlsym()获取函数的运行时地址