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时间相关推荐

  1. android如何获取进程占用的内存大小,Android获取cpu使用率,剩余内存和硬盘容量

    1.内存信息 在proc/meminfo下有详细的内存使用情况,我这里获取的内存信息就是从这个文件里获取的.获取到详细的内存信息后根据我自己的需求,从bufferdreader中单独抽取出来了剩余的内 ...

  2. linux查看进程占用的内存大小,查看进程占用内存大小的几种方法,占用内存几种方法...

    查看进程占用内存大小的几种方法,占用内存几种方法 1. pmap -x pid 2. ps -aux | grep 进程名 ps -e -o 'pid,comm,args,pcpu,rsz,vsz,s ...

  3. 查看Linux服务器内存大小,cpu个数,型号

    查看服务器内存大小的命令 cat /proc/meminfo | grep MemTotal 查看服务器CPU个数命令 cat /proc/cpuinfo | grep "physical ...

  4. 使用 getprop 命令查看 android 系统允许进程分配的内存大小

    下面输出的红色字体就是 android 允许进程分配的堆空间大小限制. D:\>adb shell getprop [UserVolumeLabel]: [IFive] [camera2.por ...

  5. python使用psutil获取系统(Windows Linux)所有运行进程信息实战:CPU时间、内存使用量、内存占用率、PID、名称、创建时间等;

    python使用psutil获取系统(Windows Linux)所有运行进程信息实战:CPU时间.内存使用量.内存占用率.PID.名称.创建时间等: psutil模块可以跨平台使用,支持Linux/ ...

  6. linux监测cpu 内存,Linux中CPU与内存性能监测.docx

    Linux中CPU与内存性能监测(出处://chenleixing/article/details 在系统维护的过程中,随时可能有需要查看 CPU 使用率内存使用情况的需要,尤其是涉及到JVM,程序调 ...

  7. linux 释放进程res_linux下查询进程占用的内存方法总结

    linux下查询进程占用的内存方法总结 假设现在有一个「php-cgi」的进程 ,进程id为「25282」.现在想要查询该进程占用的内存大小.linux命令行 下有很多的工具进行查看,现总结常见的几种 ...

  8. linux OOM-killer机制(杀掉进程,释放内存)

    Linux下面有个特性叫OOM killer(Out Of Memory killer),这个东西会在系统内存耗尽的情况下跳出来,选择性的干掉一些进程以求释放一些内存.相信广大从事Linux服务端编程 ...

  9. java8中方法区的内存大小如何设置_从Java8升级到Java11

    奇技 · 指南 为什么选择Java11? 容器环境支持,GC等领域的增强,仅通过切换到 Java 11 就有 16% 的改进. 进行了瘦身,更轻量级,安装包体积小. JDK11 是一个长期支持版. 1 ...

最新文章

  1. gunzip 和 unzip 解压文件到指定的目录
  2. 编程之美3.3 计算两个字符串的相似度
  3. Linux进程地址空间与进程内存布局详解,内核空间与用户空间
  4. WinForm 之 程序启动不显示主窗体
  5. 【317】python 指定浏览器打开网页 / 文件
  6. 字符串hash(一)
  7. Hibernate之性能优化
  8. 在静态页面中使用Scss(windows)
  9. 有了C盘之后,添加另外一个磁盘的方法
  10. Python笔记(5) 变量类型
  11. JQuery中的省市联动
  12. ZooKeeper官方文档学习笔记05-ZooKeeper的屏障(Barrier)和队列(Queue)教程
  13. gaot工具箱介绍及应用
  14. 路由与交换技术(复习知识点-全)
  15. 【Zotero同步管理】【Zotero 6.0 + 坚果云 + iPad官方zotero APP】最新版教程
  16. 微信接口类php,【微信接口库】分享10个常用的php微信接口类
  17. 20210412SQL实现全称量词和集合查询
  18. 北部湾及涠洲岛海域潮汐和海平面特征
  19. 西湖大学人工智能与生物医学影像实验室招聘科研助理及博士后
  20. C语言dlopen()和dlsym()获取函数的运行时地址

热门文章

  1. 自定义列_如何对Pandas DataFrame进行自定义排序
  2. 20190703 日子
  3. Fence Repair (poj3253)
  4. 面向对象一些概念简述
  5. 在Java中==的一个坑
  6. java入门之内部类
  7. qemu-kvm 代码分析
  8. 自己动手、丰衣足食!面试表
  9. 碰撞回避算法(一) Velocity Obstacle
  10. JavaScript数据结构——栈(Stack)