Linux中通过cgroups限制进程的资源(cgroups v1)

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

文章目录

1. 安装和配置cgroups

2. 创建cgroup

3. 设置资源限制

1)CPU限制

2)内存限制

4. 将Java进程加入到cgroup

5. 监控cgroup

6. 持久化

7. 删除cgroup

8. 注意事项

 


在Linux系统中,cgroups(Control Groups)是一种可以对一组进程进行细粒度资源控制的机制,包括对CPU、内存、磁盘I/O等资源的限制。通过cgroups,你可以限制、记录和隔离资源在一组进程中的使用,非常适合用于对多个Java进程进行资源限制。

cgroups分V1版本和V2版本,查看版本的命令如下:

mount | grep cgroup

cgroup 层级结构:

  • 在 cgroup v1 中,每个子系统(如 cpu、memory)是独立挂载的,所以你可以分别在 /sys/fs/cgroup/cpu/ 和 /sys/fs/cgroup/memory/ 下创建自己的层级结构。
  • 在 cgroup v2(Unified Hierarchy) 中,所有子系统统一在一个挂载点下管理,此时你不能分别写入不同的路径,而是需要通过控制文件来启用不同子系统。

如下操作指南,若无特殊说明,都是在cgroup v1中执行(cgroup v2的操作详见:Linux中通过cgroups限制进程的资源(cgroups v2))。

下面是如何使用cgroups来限制多个Java进程的资源:

1. 安装和配置cgroups

大多数现代Linux发行版已经默认安装了cgroups。你可以通过检查cat /proc/cgroups命令来确认是否已安装。

如果需要手动安装,可以通过包管理器安装相应的工具:

#在Debian或Ubuntu系统上
sudo apt-get update
sudo apt-get install -y cgroup-tools

#在CentOS或OpenEuler系统上
sudo yum install -y libcgroup libcgroup-tools

2. 创建cgroup

假设我们要为Java进程创建一个名为 my_group 的cgroup,并且主要关注CPU和内存的限制。

#同时配置cpu和内存,这里的my_group可以任意命名
sudo cgcreate -g cpu,memory:/my_group

#若只配置cpu,这里的my_group可以任意命名
sudo cgcreate -g cpu:/my_group

3. 设置资源限制

1)CPU限制

要限制分配给该组的所有进程的CPU使用率,主要设置cpu.cfs_period_us和cpu.cfs_quota_us 这两个参数。

参数说明

  • cpu.cfs_period_us:定义了 CPU 时间片的周期长度,单位是微秒(μs)。默认值通常是 100000 微秒(即 100 毫秒)。
  • cpu.cfs_quota_us:定义了在这个周期内,cgroup 可以获得的 CPU 时间量,单位也是微秒(μs)。-1:表示没有 CPU 时间限制,即 cgroup 中的进程可以无限使用 CPU 时间。0:通常表示该 cgroup 被完全剥夺 CPU 时间,但这并不是一个推荐的设置,因为可能会导致进程无法运行。

对于单核CPU:

例如,如果你想将CPU使用率限制为50%(假设只有一个CPU核心),可以这样做:

echo 100000 > /sys/fs/cgroup/cpu/my_group/cpu.cfs_period_us
echo 50000 > /sys/fs/cgroup/cpu/my_group/cpu.cfs_quota_us

这里,100000微秒(即100毫秒)是周期长度,50000微秒(即50毫秒)是每个周期内允许的最大运行时间,这相当于50%(50毫秒 / 100毫秒)的CPU使用率。

对于多核CPU:
例如,系统有4个CPU核心,你有一个Java应用程序,希望将其 CPU 使用率限制为 30%,可以这样做:

echo 100000 > /sys/fs/cgroup/cpu/my_group/cpu.cfs_period_us
echo 120000 > /sys/fs/cgroup/cpu/my_group/cpu.cfs_quota_us

这里,100000微秒(即100毫秒)是周期长度,120000微秒(即120毫秒)是每个周期内允许的最大运行时间,这相当于30%(120000微秒 = 30% * 100000微秒 * 4核)的CPU使用率。

2)内存限制

为了限制内存使用量,可以设置memory.limit_in_bytes参数。例如,限制内存使用不超过1GB:

echo 1073741824 > /sys/fs/cgroup/memory/my_group/memory.limit_in_bytes

4. 将Java进程加入到cgroup

假设你已经启动了一个Java进程,可以通过其进程ID,即PID,将其添加到新创建的cgroup中:

echo 进程ID | sudo tee /sys/fs/cgroup/cpu/my_group/cgroup.procs
echo 进程ID | sudo tee /sys/fs/cgroup/memory/my_group/cgroup.procs

sudo cgclassify -g memory:my_group 进程ID
sudo cgclassify -g cpu:my_group 进程ID

如果你想要在启动Java应用时直接将其放入cgroup,可以使用cgexec命令:

sudo cgexec -g cpu,memory:my_group java -jar your_application.jar

同理,如果你想要在执行shell脚本文件时直接将其放入cgroup,可以使用cgexec命令:

sudo cgexec -g cpu,memory:my_group /home/test/data/scripts/test.sh > /dev/null 2>&1 &

5. 监控cgroup

你可以监控cgroup内的资源使用情况,例如查看内存使用情况:

cat /sys/fs/cgroup/memory/my_group/memory.usage_in_bytes

单位是字节(Bytes)

或者查看CPU使用情况:

cat /sys/fs/cgroup/cpu/my_group/cpuacct.usage

单位是纳秒(ns) 

6. 持久化

实际上,配置的cgroups并不会自动持久化,主机重启就失效了

要解决这个问题,你可以编写一个启动脚本,在系统启动时重新创建 cgroups,并将其添加到 ​​​​/etc/rc.local​​​​ 或使用 systemd 的单位文件来确保脚本随系统启动而运行。

首先,编写脚本 :vi /home/test/data/scripts/create_my_group.sh

#!/bin/bash
sudo cgcreate -g cpu:my_group
sudo echo 100000 >  /sys/fs/cgroup/cpu/my_group/cpu.cfs_period_us
sudo echo 640000 > /sys/fs/cgroup/cpu/my_group/cpu.cfs_quota_us #16核,40%

接着,添加到/etc/rc.local:vi /etc/rc.local

/home/test/data/scripts/create_my_group.sh

,执行命令crontab -e来配置crontab(推荐)

@reboot /home/test/data/scripts/create_my_group.sh

,利用 systemd 的特性,在 ​​​​/etc/systemd/system/​​​​ 目录下,创建名为 create_my_group.service单位文件:vi /etc/systemd/system/​​​​create_my_group.service,该单元文件可以在系统启动时创建所需的 cgroups。

[Unit]
Description=Create cgroup my_group
After=network.target

[Service]
User=root
Type=oneshot
ExecStart=/bin/bash -c "/home/test/data/scripts/create_my_group.sh > /dev/null 2>&1"

[Install]
WantedBy=multi-user.target

7. 删除cgroup

#同时删除cpu和内存,这里的my_group可以任意命名
sudo cgdelete -g cpu,memory:/my_group

#若只删除cpu,这里的my_group可以任意命名
sudo cgdelete -g cpu:/my_group

8. 注意事项

  • 在生产环境中应用这些设置之前,请确保充分测试,以避免不必要的服务中断。
  • 不同的Java应用可能有不同的资源需求,因此可能需要为不同的应用设置不同的cgroup。
  • 当调整资源限制时,应考虑到系统的整体性能和稳定性。

 

 

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

乌托邦的逃亡者

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值