python 之 资源使用与控制 resource模块

一、背景

2021年做可信计算时,由于甲方给的CPU利用率不能不能超过20%;
目的:我们的程序部署甲方服务器上不能阻碍其甲方服务的正常运行
我们的程序在CPU超过20%时,可以休眠几秒后继续运行
此时需要检测控制服务器的CPU资源使用信息,用于做判断程序是否休眠

resource 模块用于测量和控制程序使用的系统资源的基本机制

二、resource 基本用法
2.1 资源限制
  • resource.RLIM_INFINITY 无限资源的限制
  • resource.getrlimit(resource) 当前资源软硬限制的元组(soft, hard)
  • resource.setrlimit(resource, limits) 设置新的资源消耗限制 limits 两个整数的元组
  • resource.prlimit(pid, resource[, limits])
    setrlimit()将和结合getrlimit()在一个函数中,支持获取和设置任意进程的资源限制
    如果 pid为0,则调用适用于当前进程
    resource和limits与中的含义相同setrlimit(),limits可选
    当没有给出限制时,该函数返回进程pid的资源限制
    当给定限制时,设置进程的资源限制并返回以前的资源限制
    
    import resource
    
    # 进程可用存储区大小
    soft, hard = resource.getrlimit(resource.RLIMIT_AS)
    # 进程最大处理器时间
    soft, hard = resource.getrlimit(resource.RLIMIT_CPU)
    
    # 设置cpu最大处理时间
    resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))
    # 设置进程内存限制,程序运行到没有多余内存时会抛出 MemoryError 异常
    resource.setrlimit(resource.RLIMIT_AS, (size, hard))
    
    resource解释说明
    resource.RLIMIT_AS进程可用存储区大小
    resource.RLIMIT_CPU进程最大处理器时间超出限制SIGXCPU则会向进程发送信号
    resource.RLIMIT_FSIZE进程可创建文件的最大值
    resource.RLIMIT_COREcore文件最大字节
    resource.RLIMIT_DATA进程堆的最大大小数据段最大长度
    resource.RLIMIT_MEMLOCK可锁定在内存中的最大地址空间使用mlock能否在存储器中锁定最长字节数
    resource.RLIMIT_NOFILE当前进程的最大打开文件数
    resource.RLIMIT_NPROC当前进程可创建的最大进程数
    resource.RLIMIT_RSS供给进程的最大驻存集的字节长度
    resource.RLIMIT_STACK当前进程调用栈的最大长度
    resource.RLIMIT_OFILE-
    resource.RLIMIT_VMEM进程占用的最大映射内存区域
    resource.RLIMIT_MSGQUEUE分配给POSIX 消息队列的字节数
    resource.RLIMIT_NICE进程 nice 级别的上限
    resource.RLIMIT_RTPRIO实时优先级的上限
    resource.RLIMIT_RTTIME实时优先级的上限
    resource.RLIMIT_SIGPENDING进程可能排队的信号数
    resource.RLIMIT_SBSIZE用户使用的套接字缓冲区的最大大小
    resource.RLIMIT_SWAP该用户 ID 的所有进程保留或使用的交换空间的最大大小
    resource.RLIMIT_NPTS用户标识创建的伪终端的最大数量
    resource.RLIMIT_KQUEUES用户 ID 创建的最大 kqueue 数
2.2 资源使用
resource.getpagesize() 获取页面大小: 返回系统页面中的字节数

resource.getrusage(who) 由who参数指定的当前进程或其子进程消耗的资源
import resource

# 资源使用状况:请求调用进程消耗的资源,进程中所有线程使用的资源总和
sor = resource.getrusage(resource.RUSAGE_SELF)

# 已终止和等待的调用进程的子进程消耗的请求资源
sor = resource.getrusage(resource.RUSAGE_CHILDREN)

# 当前进程和子进程消耗的资源 并非在所有系统上都可用
sor = resource.getrusage(resource.RUSAGE_BOTH)

# 当前线程消耗的资源 可能并非在所有系统上都可用
sor = resource.getrusage(resource.RUSAGE_THREAD)

# 用户模式下的时间(其它参数如下)
print(sor.ru_utime)
序号函数描述
0ru_utime用户模式下的时间
1ru_stime系统模式下的时间
2ru_maxrss最大驻留集大小
3ru_ixrss共享内存大小
4ru_idrss非共享堆栈大小
5ru_isrss非共享堆栈大小
6ru_minflt不需要 I/O 的页面错误
7ru_majflt需要 I/O 的页面错误
8ru_nswap换出数量
9ru_inblock块输入操作
10ru_oublock块输出操作
11ru_msgsnd已发送消息
12ru_msgrcv收到的消息
13ru_nsignals收到的信号
14ru_nvcsw自愿上下文切换
15ru_nivcsw非自愿上下文切换

官方文档

三、限制进程的CPU处理时间和内存使用量
import signal
import resource
import os

# 限制 CPU 时间
def time_exceeded(signo, frame):
    # 超时时打印提示信息并引发 SystemExit 异常,以终止脚本
    print("CPU exceeded...")
    raise SystemExit(1)

def set_max_runtime(seconds):
    # 获取当前 CPU 时间的软限制和硬限制
    soft, hard = resource.getrlimit(resource.RLIMIT_CPU)
    # 设置软限制为指定的时间,硬限制不变
    resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))
    # 安装一个信号处理程序来处理超时信号 SIGXCPU
    signal.signal(signal.SIGXCPU, time_exceeded)

# 限制内存使用量
def set_max_memory(size):
    # 获取当前内存使用量的软限制和硬限制
    soft, hard = resource.getrlimit(resource.RLIMIT_AS)
    # 设置软限制为指定的大小,硬限制不变
    resource.setrlimit(resource.RLIMIT_AS, (size, hard))
  • set_max_runtime 函数通过调用 resource 模块中的 getrlimit 和 setrlimit 函数来限制 Python 进程的 CPU 时间。函数首先调用 getrlimit 函数获取当前 CPU 时间的软限制和硬限制,然后将软限制设置为指定的时间,将硬限制保持不变。最后,该函数调用 signal 模块中的 signal 函数,安装一个处理超时信号 SIGXCPU 的信号处理程序,该处理程序在超时时打印一条提示信息并引发 SystemExit 异常以终止脚本。

  • set_max_memory 函数同样使用 getrlimit 和 setrlimit 函数来限制 Python 进程的内存使用量。该函数首先调用 getrlimit 函数获取当前内存使用量的软限制和硬限制,然后将软限制设置为指定的大小,将硬限制保持不变。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
使用Python自带的`http.client`模块可以更方便地进行HTTP请求和响应的处理,以下是使用模块来获取目标网站的响应报文,并解析出资源对象序列及对应的大小序列的示例代码: ```python import http.client # 建立与目标网站的连接 conn = http.client.HTTPConnection('www.gzhu.edu.cn') # 发送HTTP GET请求 conn.request('GET', '/') # 获取响应报文 response = conn.getresponse() content_length = response.getheader('Content-Length') # 获取资源对象序列及对应的大小序列 resource_objects = [] size_list = [] content_length = int(content_length) if content_length else None while content_length is None or content_length > 0: data = response.read(1024) if not data: break size = len(data) if content_length is not None: content_length -= size resource_objects.append(data) size_list.append(size) # 输出结果 for i in range(len(resource_objects)): print('Resource object:', i+1) print(resource_objects[i]) print('Size:', size_list[i]) print() ``` 该代码使用`http.client.HTTPConnection()`方法建立与目标网站的连接,并使用`request()`方法发送HTTP GET请求。然后使用`getresponse()`方法获取响应报文,并使用`getheader()`方法获取响应报文头中的`Content-Length`字段,以便在后面解析响应报文时计算剩余数据的长度。 解析响应报文的方式与之前的方法类似,使用`read()`方法读取响应报文中的数据,并计算每个资源对象的大小。需要注意的是,如果响应报文中没有`Content-Length`字段,则需要在读取每个资源对象时判断是否已经读取完毕。 最后使用`for`循环输出每个资源对象及其对应的大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风华浪浪

讨个老婆本呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值