精华内容
下载资源
问答
  • 7 . 11 getrlimit和setrlimit函数 每个进程都有一组资源限制,其中某一些可以用getrlimit和setrlimit函数查询和更改。 #include <...int getrlimit(int resource, struct rlimit * rlptr) ;int setrlim...

    7 . 11 getrlimitsetrlimit函数

    每个进程都有一组资源限制,其中某一些可以用getrlimitsetrlimit函数查询和更改。

    #include <sys/time.h>

    #include <sys/resource.h>

    int getrlimit(int resource, struct rlimit * rlptr) ;

    int setrlimit(int resource, const struct rlimit * rlptr) ;

    //两个函数返回:若成功则为0,若出错则为非0

          这两个函数在Single UNIX Specification中定义为XSI扩展。进程的资源限制通常是在系统初始化时由进程0建立的,然后由每个后续进程继承,没有实现都可以用自己的方法对各种限制做出调整。

    对这两个函数的每一次调用都指定一个资源以及一个指向下列结构的指针。

    struct rlimit {

    rlim_t rlim_cur; /* soft limit: current limit */

    rlim_t rlim_max; /* hard limit: maximum value for rlim_cur */

    } ;

    在更改资源限制时,须遵循下列三条规则:

    (1) 任何一个进程都可将一个软限制更改为小于或等于其硬限制

    (2) 任何一个进程都可降低其硬限制值,但它必须大于或等于其软限制值。这种降低,对普通用户而言是不可逆反的。

    (3) 只有超级用户可以提高硬限制。

    一个无限量的限制由常数R L I M _ I N F I N I T Y指定。

    这两个函数的resource参数取下列值之一。注意并非所有资源限制都受到SVR44 . 3 + BSD的支持。

    • RLIMIT_AS   进程可用存储区的最大总长度(字节),这会影响sbrk函数和mmap函数;

    • RLIMIT_CORE    c o r e文件的最大字节数,若其值为0则阻止创建c o r e文件。

    • RLIMIT_CPU      CPU时间的最大量值(),当超过此软限制时,向该进程发送S I G X CPU信号。

    • RLIMIT_DATA    数据段的最大字节长度。

    • RLIMIT_FSIZE     可以创建的文件的最大字节长度。当超过此软限制时,则向该进程发送S I G X F S Z信号。

    • RLIMIT_LOCKS 一个进程可持有的文件锁的最大数。

    • RLIMIT_MEMLOCK 锁定在存储器地址空间(尚未实现)

    • RLIMIT_NOFILE 每个进程能打开的最多文件数。更改此限制将影响到s y s c o n f函数在参数_ S C _ O P E N _ M A X中返回的值。

    • RLIMIT_NPROC       每个实际用户I D所拥有的最大子进程数。更改此限制将影响到s y s c o n f函数在参数_ S C _ C H I L D _ M A X中返回的值。

    • RLIMIT_OFILE SVR4R L I M I T _ N O F I L E相同。

    • RLIMIT_RSS 最大驻内存集字节长度(R S S)。如果物理存储器供不应求,则内核将从进程处取回超过R S S的部分。

    • RLIMIT_STACK 栈的最大字节长度。

    • RLIMIT_VMEM 可映照地址空间的最大字节长度。这影响到m m a p函数。

    资源限制影响到调用进程并由其子进程继承。这就意味着为了影响一个用户的所有后续进程,需将资源限制设置构造在shell之中。确实,Bourne shellKorn Shell具有内部ulimit命令,C shell具有内部l i m i t命令。( umaskchdir函数也必须是shell内部的。)

    实例

    程序7 - 8打印由系统支持的对所有资源的当前软限制和硬限制。为了在各种实现上编译该程序,我们已经有条件地包括了各种不同的资源名,另请注意,有些平台定义rlim_tunsigned long long而非unsigned long,对于此种平台,必须使用不同的printf格式。

    #include <stdio.h>

    #include <stdlib.h>



    #if defined(BSD) || defined(MACOS)

    #include <sys/time.h>

    #define FMT "%10lld "

    #else

    #define FMT "%10ld "

    #endif



    #include <sys/resource.h>



    #define doit(name) pr_limits(#name,name)



    static void pr_limits(char *, int);



    int main(void)

    {

    #ifdef RLIMIT_AS

    doit(RLIMIT_AS);

    #endif



    doit(RLIMIT_CORE);

    doit(RLIMIT_CPU);

    doit(RLIMIT_DATA);

    doit(RLIMIT_FSIZE);



    #ifdef RLIMIT_LOCKS

    doit(RLIMIT_LOCKS);

    #endif



    #ifdef RLIMIT_MEMLOCK

    doit(RLIMIT_MEMLOCK);

    #endif



    doit(RLIMIT_NOFILE);



    #ifdef RLIMIT_NPROC

    doit(RLIMIT_NPROC);

    #endif



    #ifdef RLIMIT_RSS

    doit(RLIMIT_RSS);

    #endif



    #ifdef RLIMIT_SBSIZE

    doit(RLIMIT_SBSIZE);

    #endif



    doit(RLIMIT_STACK);



    #ifdef RLIMIT_VMEM

    doit(RLIMIT_VMEM);

    #endif



    exit(0);

    }



    static void pr_limits(char *name, int resource)

    {

    struct rlimit limit;

    if (getrlimit(resource, &limit) < 0)

    perror("getrlimit error");

    printf("%-14s ", name);

    if (limit.rlim_cur == RLIM_INFINITY)

    printf("(infinite) ");

    else

    printf(FMT, limit.rlim_cur);

    if (limit.rlim_max == RLIM_INFINITY)

    printf("(infinite)");

    else

    printf(FMT, limit.rlim_max);

    putchar((int) '\n');

    }


    注意,在doit宏中使用了新的ANSI C字符串创建算符( # ),以便为每个资源名产生字符串值。例如:

    doit ( RLIMIT_CORE ) ;

    这将由C预处理程序扩展为:

    pr_limits("RLIMIT_CORE", RLIMIT_CORE);

    Ubuntu上运行该程序得到:

    RLIMIT_AS       (infinite)  (infinite)

    RLIMIT_CORE              0 (infinite)

    RLIMIT_CPU      (infinite)  (infinite)

    RLIMIT_DATA     (infinite)  (infinite)

    RLIMIT_FSIZE    (infinite)  (infinite)

    RLIMIT_LOCKS    (infinite)  (infinite)

    RLIMIT_MEMLOCK       65536      65536

    RLIMIT_NOFILE         1024       1024

    RLIMIT_NPROC    (infinite)  (infinite)

    RLIMIT_RSS      (infinite)  (infinite)

    RLIMIT_STACK       8388608 (infinite)

    转载于:https://www.cnblogs.com/shaoguangleo/archive/2011/10/12/2806011.html

    展开全文
  • 内置模块:resource 在mac环境下功能会存在问题。linux下可以使用:但是for i in range(10000)的值必须是10000或者更大的数值才有用。没有搞清楚为什么 ...#soft,hard=resource.getrlimit(resource.RLIM...

    内置模块:resource

    在mac环境下功能会存在问题。linux下可以使用:但是for i in range(10000)的值必须是10000或者更大的数值才有用。没有搞清楚为什么

    #/usr/bin/env python
    #-*-coding:utf-8-*-
    import resource
    #soft,hard=resource.getrlimit(resource.RLIMIT_STACK)
    #resource.setrlimit(resource.RLIMIT_STACK,(4,hard))
    #soft,hard=resource.getrlimit(resource.RLIMIT_DATA)
    #resource.setrlimit(resource.RLIMIT_DATA,(0.002,hard))
    soft,hard=resource.getrlimit(resource.RLIMIT_AS)
    resource.setrlimit(resource.RLIMIT_AS,(1,hard))   # 理解上,值1表示1字节,程序随便赋个值,内存就会不够用,其实不是这么回事,需要下面循环10000次才有效果
    aia=2222222
    b='sdfdf似懂非懂辅导辅导'
    for i in range(10000):
        a='str'
        a=a+str(i)
        print a
        a=b
        print a

    效果:MemoryError

     

     

    要限制内存使用,设置可使用的总内存值即可,如下:

    import resource
    
    def limit_memory(maxsize): soft, hard = resource.getrlimit(resource.RLIMIT_AS) resource.setrlimit(resource.RLIMIT_AS, (maxsize, hard)) 

    像这样设置了内存限制后,程序运行到没有多余内存时会抛出 MemoryError 异常。

    讨论

    在本节例子中,setrlimit() 函数被用来设置特定资源上面的软限制和硬限制。 软限制是一个值,当超过这个值的时候操作系统通常会发送一个信号来限制或通知该进程。 硬限制是用来指定软限制能设定的最大值。通常来讲,这个由系统管理员通过设置系统级参数来决定。 尽管硬限制可以改小一点,但是最好不要使用用户进程去修改。

    setrlimit() 函数还能被用来设置子进程数量、打开文件数以及类似系统资源的限制。 更多详情请参考 resource 模块的文档。

    需要注意的是本节内容只能适用于Unix系统,并且不保证所有系统都能如期工作。 比如我们在测试的时候,它能在Linux上面正常运行,但是在OS X上却不能。

     

    主要函数:

    • resource.getrlimit(resource) 获取资源的大小限制
    • resource.setrlimit(resourcelimits) 设置资源的大小限制,limits必须是格式(soft,hard),soft/hard都必须为整数
    • resource.prlimit(pidresource[, limits])
    • resource.getrusage(who) 获取进程或者线程占用的资源情况
    • resource.getpagesize()

    resource值可以为:resource.RLIMIT_COREresource.RLIM_INFINITYresource.RLIMIT_CPUresource.RLIMIT_FSIZE……

    who的值可以为:resource.RUSAGE_SELF进程自身、resource.RUSAGE_CHILDREN子进程resource.RUSAGE_BOTHresource.RUSAGE_THREAD当前线程

     

    Python 内存管理的另一个有趣话题是它的“垃圾回收”机制。它以“引用计数” 为主,并借助“标记-清除”机制消除循环引用带来的影响。为了加速对象的创建,Python 又引入 “分代回收”机制,它缓存部分反复创建和销除的对象,而非在它们释放后直接从内存删除它们, 从而加速下次该对象的创建

     

    https://docs.python.org/3.4/library/resource.html

    https://python3-cookbook.readthedocs.io/zh_CN/latest/c13/p14_putting_limits_on_memory_and_cpu_usage.html 对应中文:https://www.rddoc.com/doc/Python/3.6.0/zh/library/resource/ 翻译的一般

    https://blog.csdn.net/liangyuannao/article/details/9697987 这个例子可以在linux下看出效果

    转载于:https://www.cnblogs.com/shengulong/p/10140127.html

    展开全文
  • python降低cpu的占用

    2021-03-10 17:43:01
    import signal import resource import os import time from multiprocessing import Process def time_exceeded(signo, frame): time.sleep(0.1) ... soft,hard = resource.getrlimit(resource.RLIMIT_CPU)
    import signal
    import resource
    import os
    import time
    from multiprocessing import Process
    
    def time_exceeded(signo, frame):
        time.sleep(0.1)
        # raise SystemExit(1)
    def set_max_runtime(seconds):
        soft,hard = resource.getrlimit(resource.RLIMIT_CPU)
        resource.setrlimit(resource.RLIMIT_CPU, (seconds, soft))
        signal.signal(signal.SIGXCPU, time_exceeded)
    
    if __name__ == '__main__':
        set_max_runtime(5)
        while True:
            pass
    
    
    展开全文
  • 如果程序开发不当,可能会出现占用过多内存的情况。特别是在Docker里面,如果Python程序占用太多内存,...首先获取系统默认的内存 soft上限和 hard上限:import resourcesoft, hard = resource.getrlimit(resourc...

    如果程序开发不当,可能会出现占用过多内存的情况。特别是在Docker里面,如果Python程序占用太多内存,可能会导致Docker容器死掉。

    为了限制Python程序所能使用的最大内存,我们可以使用Python自带的 resource模块。

    首先获取系统默认的内存 soft上限和 hard上限:import resourcesoft, hard = resource.getrlimit(resource.RLIMIT_AS)

    其中的 resource.RLIMIT_AS实际上就是数字5,表示内存资源。而 soft限制是一个可以调节的内存使用上限, hard是一个一旦设定就很难动态调整的内存使用量上限。

    在我的电脑上运行效果如下图所示:

    一开始 soft和 hard的值是一样的。并且它们的单位不是比特。而是比比特还小的单位。我的电脑是8GB内存,而 8*1024^6 正好约等于这里的hard和soft的值。

    接下来,设置当前运行的这个Python程序能够使用的最大内存:resource.setrlimit(resource.RLIMIT_AS, (最大上限, hard))

    其中最大上限是一个整数。假设我想限制当前程序最多可以使用500MB的内存,那么这里的最大上限可以设置为:0.5 * 1024 ^ 6 = 576460752303423488

    所以设置为:resource.setrlimit(resource.RLIMIT_AS, (576460752303423488, hard))

    那么当前Python程序使用的内存超过500MB以后,程序就会抛出 MemoryError。

    最后,这些代码只能在Linux系统上正常工作。Windows和Mac上可能会有问题。

    展开全文
  • getrlimit

    千次阅读 2012-05-20 09:17:44
    nix系统函数 名称  getrlimit,setrlimit - 控制系统资源的最大使用量。... int getrlimit(int resource, struct rlimit *rlp);  int setrlimit(int resource, const struct rlimit *rlp);
  • 1.getrlimit()/setrlimit()函数 获取或设置资源使用限制,linux下每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值。非授权调用的进程只能...int getrlimit(int resource, s
  • getrlimit , setrlimit 函数

    千次阅读 2007-08-15 13:30:00
    NAMEgetrlimit, setrlimit - control maximum resource consumptionSYNOPSIS[XSI] #include sys/resource.h> int getrlimit(int resource, struct rlimit *rlp); int setrlimit(int resource, const
  • getrlimit Unix系统函数

    2011-02-15 17:00:00
    Unix系统函数 名称  getrlimit,setrlimit - 控制系统资源的最大使用量。[1]‍‍[2] ... int getrlimit(int resource, struct rlimit *rlp);  int setrlimit(int resource, const struct...
  • 每个进程都有一组资源限制,其中一些可以用getrlimit和setrlimit函数...int getrlimit( int resource, struct rlimit *rlptr ); int setrlimit( int resource, const struct rlimit *rlptr ); 两个函数返回值:...
  • getrlimit setrlimit

    千次阅读 2015-11-22 11:15:01
    getrlimit, setrlimit函数
  • getrlimit && setrlimit

    2011-11-02 21:58:00
    C语言系统资源控制(getrlimit && setrlimit) 2007-08-17 00:40 ...每一个进程都有自己的一组资源限制,在(*)inux系统中我们可以通过 ...int getrlimit(int resource, struct rlimit *rlim); in...
  • 每个进程都有一组资源限制,其中一些可以用getrlimit和setrlimit函数查询和更改。...int getrlimit( int resource, struct rlimit *rlptr ); int setrlimit( int resource, const struct rlimit *rlptr ); 两...
  • #include <stdio.h> #include <sys/time.h>...sys/resource.h> int main(int argc, char *argv[]) { struct rlimit nofile_rlmt; if (getrlimit(RLIMIT_NOFILE, &nofile_rlm...
  • resource 中的函数探测进程消耗的当前系统资源,并对它们设置限制以控制程序可以对系统施加的负载量。目前的用法使用 getrusage() 来探测当前进程和/或其子进程使用的资源。 返回值是一个数据结构,包含基于系统当前...
  • getrlimit,setrlimit - 控制系统资源的最大使用量 #include <unistd.h> #include <stdio.h> #include <sys/resource.h> /*struct rlimit{ rlim_t rlim_cur; //soft limit: current limit.....
  • getrlimit和setrlimit 头文件 #include <...int getrlimit(int resource, struct rlimit *rlim); int setrlimit(int resource, const struct rlimit *rlim); 功能 每个进程都有一组资源限制...
  • print(resource.getrlimit(resource.RLIMIT_NOFILE))" (1048576, 1048576) </code></pre> <p>that takes a huge time to query. <p>docker version we are using is <pre><code> $ docker --version Docker ...
  • #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h>...sys/resource.h> void printf_linux_res(const char* n
  • int getrlimit(int resource, struct rlimit *rlptr); int setrlimit(int resource, const struct rlimit *rlptr); //返回值:两个函数返回:若成功则为 0,若出错则为非0 备注: 进程的资源限制通...
  • 每一个进程都有自己的一组资源限制,在Linux系统中...int getrlimit(int resource, struct rlimit *rlim);int setrlimit(int resource, const struct rlimit *rlim);这2个API来取得和设置资源。getrlimit用来取...
  • getrlimit 与setrlimit

    2012-11-22 21:31:28
    getrlimit和setrlimit函数   每个进程都有一组资源限制,其中某一些可以用getrlimit和setrlimit函数查询...int getrlimit(int resource,struct rlimit *rlptr); int setrlimit(int resource,const struct rlimit rl
  • 每一个进程都用一组资源限值,它们可以用来限制进程能够消耗的...int getrlimit(int resource,struct rlimit *rlim); int setrlimit(int resource,const struct rlimit *rlim); 成功返回0, 失败返回-1. 参数rlim用来
  • 功能描述: 获取或设定资源使用限制。每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值。...int getrlimit(int resource, struct rlimit *rlim); int setrlimit(in
  • getrlimit/setrlimit

    2013-12-23 14:59:06
    int getrlimit(int resource, struct rlimit *rlp); int setrlimit(int resource, const struct rlimit *rlp); 描述 在操作系统中,我们能够通过函数getrlimit()、setrlimit()分别获得、设置每个进程能够...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,671
精华内容 668
关键字:

resource.getrlimit