背景
在服务器上部署了一套目标检测的程序,做成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 timep = psutil.Process()
while True:cpu_usage = p.cpu_percent(interval=1)if cpu_usage > 50: # 如果CPU使用率超过50%time.sleep(1) # 暂停1秒
二 限制内存使用
使用resource模块来限制内存使用。
python">import resourcedef 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并设置资源限制。
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中。
sudo cgclassify -g memory,cpu:mygroup <pid>
docker 容器限制
docker run --memory="500m" --cpus="0.5" my_python_app
使用systemd服务文件:
如果你的Python程序是通过systemd管理的,可以在服务文件中设置资源限制。
[Service]
ExecStart=/usr/bin/python3 /path/to/your_script.py
MemoryLimit=500M
CPUQuota=50%