python程序对服务器cpu和内存资源占用的管理。

背景

在服务器上部署了一套目标检测的程序,做成while true 的轮询检测数据更新的定时任务。

结果没想到那台服务器还有一套可视化程序要给领导演示看,结果演示的时候平台各种报错。

然后通过top查看了一下资源利用率发现python的程序cpu 130。(其他机器上我看都是100 ,这个服务器不知道为啥是130左右超频么?)

所以寻思给程序加个资源占用的限制,跑慢一点没关系。思路为代码中加限制或者操作系统层面加限制。

代码中设置适用于需要更细粒度的控制,并且不依赖于操作系统特性的情况。

服务器上设置则更适合于生产环境,因为它利用了操作系统提供的资源管理工具,更加灵活和强大。

记录一下解决方案。各位可测试使用。

一 限制cpu使用

1.使用os.nice()函数来调整进程的优先级。例如,将优先级设置为较低的值可以降低进程的CPU占用率

python 复制代码
import os
os.nice(10)  # 将优先级设置为10(范围是-20到19,默认为0)

2.使用psutil库来监控和限制CPU使用率。

python 复制代码
import psutil
import time

p = psutil.Process()
while True:
    cpu_usage = p.cpu_percent(interval=1)
    if cpu_usage > 50:  # 如果CPU使用率超过50%
        time.sleep(1)  # 暂停1秒

二 限制内存使用

使用resource模块来限制内存使用。

python 复制代码
import resource

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

limit_memory(500 * 1024 * 1024)  # 限制最大内存使用为500MB

三 在服务器上设置

使用cgroups:

cgroups(控制组)是一种Linux内核功能,用于限制、记录和隔离进程组的资源使用(如CPU、内存、磁盘I/O等)。

创建一个新的cgroup并设置资源限制。

bash 复制代码
sudo cgcreate -g memory,cpu:mygroup
echo "500M" | sudo tee /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes
echo "50" | sudo tee /sys/fs/cgroup/cpu/mygroup/cpu.shares

将你的Python进程添加到这个cgroup中。

bash 复制代码
sudo cgclassify -g memory,cpu:mygroup <pid>

docker 容器限制

bash 复制代码
docker run --memory="500m" --cpus="0.5" my_python_app

使用systemd服务文件:

如果你的Python程序是通过systemd管理的,可以在服务文件中设置资源限制。

bash 复制代码
[Service]
ExecStart=/usr/bin/python3 /path/to/your_script.py
MemoryLimit=500M
CPUQuota=50%
相关推荐
JavaPub-rodert4 分钟前
一道go面试题
开发语言·后端·golang
6<77 分钟前
【go】静态类型与动态类型
开发语言·后端·golang
H13469489037 分钟前
华为服务器系统备份,想要备份华为服务器系统可以怎么操作?
运维·服务器·负载均衡
wangjun51591 小时前
linux,物理机、虚拟机,同时内外网实现方案;物理机与虚拟机互通网络;
linux·服务器·网络
杰克崔1 小时前
分析sys高问题的方法总结
linux·运维·服务器
带娃的IT创业者1 小时前
《Python实战进阶》No39:模型部署——TensorFlow Serving 与 ONNX
pytorch·python·tensorflow·持续部署
Bruce-li__1 小时前
深入理解Python asyncio:从入门到实战,掌握异步编程精髓
网络·数据库·python
九月镇灵将1 小时前
6.git项目实现变更拉取与上传
git·python·scrapy·scrapyd·gitpython·gerapy
车载小杜1 小时前
基于指针的线程池
开发语言·c++
沐知全栈开发1 小时前
Servlet 点击计数器
开发语言