ubuntu cgroup?ubuntu系统引导

Ubuntu下限制进程使用内存资源的方法(cgroup)

最近由于项目的需要,跑某个程序的时候需要限制其内存资源的使用,例如限制某个进程只能使用1G的内存资源。

这时候有几种可选的方法,一种就是使用限制内存条件的物理机器,比如你限制4G内存那我就用只有4G内存的机子。但是这种情况不方便,也不灵活,如果限制1G,甚至更小的内存资源呢,上哪去找符合这样条件的物理机器呢?因而从硬件上进行限制就非常笨拙,自然而然就想到用软件的方法进行灵活的限制。

之前搜索发现,linux下的ulimit命令可以对shell进程所用资源进行限制,但是发现其中对于内存资源使用的命令"-m"只对linux内核版本2.x的才有效,之后版本的都已经无效的。(怪不得我说跑的时候咋一点作用都没有,也算是替大家踩坑了...)

后来发现还有一种方法就是使用cgroup来对资源进行限制,推荐!!

下面讲一下Ubuntu上使用cgroup限制进程内存的方法:

1、安装命令

2、进入相应的目录,一般会下如下所示的位置中:

3、在该目录下创建自己的组目录

会看到在该目录下面会有很多文件,而我们只需要用到其中memory.limit_in_bytes文件

4、限制内存大小,写入memory.limit_in_bytes文件

这里1G默认单位是B,也就是你写成1*1024*1024也是一样的

5、具体使用

这里test就是上面第3步,我们在/sys/fs/cgroup/memory/目录下自己创建的组目录,然后之后跟上要执行的命令,就可以对执行的命令进行内存资源限制啦!

Cgroup使用介绍

Cgroup,全称为Control Group,是Linux内核提供的资源管理和限制机制,用于对进程进行分组并对其资源进行限制和优先级调整。本文将从七个方面介绍Cgroup的基础知识:简介、安装与挂载、基本操作、日常内存CPU限制用法、其他使用、Cgroup嵌套使用以及注意事项。

一、简介

Cgroup的主要目标是提供一种统一的接口来管理系统资源,包括CPU、内存、磁盘I/O等。其核心组件包括:

- cpu:用于限制cgroup的CPU使用率。

- cpuacct:用于统计cgroup的CPU使用率。

- cpuset:用于绑定cgroup到指定的CPU和NUMAQ节点。

- freezer:用于挂起和恢复cgroup中的所有进程。

- memory:用于统计和限制cgroup的内存使用率。

二、安装与挂载

在Debian/Ubuntu系统上,可以使用以下命令安装Cgroup工具包:

sudo apt-get install cgroup-tools

在RHEL/CentOS系统上,可以使用以下命令安装:

sudo yum install libcgroup-tools

接下来,创建一个挂载点并挂载Cgroup文件系统:

sudo mkdir/sys/fs/cgroup

sudo mount-t cgroup-o none,name=cgroup/sys/fs/cgroup

三、基本操作

1.挂载与创建CGROUP树

创建一颗cgroup树关联所有subsystem,并挂载在/sys/fs/cgroup下(xxx为cgroup树名称):

sudo mount-t cgroup xxx/sys/fs/cgroup

也可以不关联任何subsystem,挂载在其他目录,例如创建名为demo树挂载在~/test_aa/demo目录:

sudo mount-t cgroup-o none,name=demo demo./demo/

查看当前cgroup中的所有进程ID和线程ID:

cgroup.procs

tasks

2.建立子Cgroup

通过在目录中创建文件夹的方式,建立子cgroup。

3.添加进程进入Cgroup

将进程添加到子cgroup中。

4.检查Cgroup状态

使用命令检查cgroup的状态。

5.创建控制组

使用cgcreate命令创建一个新的控制组:

sudo cgcreate-g cpu,memory:my_group

这将在/sys/fs/cgroup目录下创建一个名为my_group的控制组,并关联CPU和内存子系统。

6.添加进程到控制组

使用cgclassify命令将进程添加到控制组中:

sudo cgclassify-g cpu,memory:my_group PID

其中,PID是要添加的进程ID。

7.从控制组中移动进程

使用cgclassify命令将进程从一个控制组移动到另一个控制组:

sudo cgclassify-g cpu,memory:another_group PID

8.删除控制组

使用cgdelete命令删除一个控制组:

sudo cgdelete cpu,memory:my_group

四、日常内存CPU限制用法

1.限制CPU使用率

创建一个控制组,并设置CPU使用率限制:

sudo cgcreate-g cpu:cpu_limit

echo 10000>/sys/fs/cgroup/cpu/cpu_limit/cpu.cfs_quota_us

echo 200000>/sys/fs/cgroup/cpu/cpu_limit/cpu.cfs_period_us

将进程添加到控制组中:

sudo cgclassify-g cpu:cpu_limit PID

限制前后,CPU占用率对比:

未限制前:CPU占用率波动在20~45%之间

限制后:CPU占用率波动在10~23%之间,滑动/点击操作时应用出现卡顿

2.限制内存使用量

创建一个控制组,并设置内存使用量限制为300MB:

sudo cgcreate-g memory:mem_limit

echo$((300 1024 1024))>/sys/fs/cgroup/memory/mem_limit/memory.limit_in_bytes

将进程添加到控制组中:

sudo cgclassify-g memory:mem_limit PID

五、其他使用

1.限制磁盘I/O速率

创建一个控制组,并设置磁盘I/O限制为10MB/s:

sudo cgcreate-g blkio:io_limit

echo"8:0$(10 1024 1024)">/sys/fs/cgroup/blkio/io_limit/blkio.throttle.read_bps_device

将进程添加到控制组中:

sudo cgclassify-g blkio:io_limit PID

2.限制网络带宽

创建一个控制组,并设置网络带宽限制为1Mbps:

sudo cgcreate-g net_cls:net_limit

echo 0x10000>/sys/fs/cgroup/net_cls/net_limit/net_cls.classid

使用tc命令配置网络限制:

sudo tc qdisc add dev eth0 root handle 1: htb

sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit

sudo tc filter add dev eth0 parent 1: protocol ip prio 1 handle 1: cgroup

将进程添加到控制组中:

sudo cgclassify-g net_cls:net_limit PID

六、Cgroup的嵌套使用

Cgroup支持嵌套使用,即在一个控制组内创建子控制组。例如:

-创建名为parent_group的控制组:

sudo cgcreate-g cpu,memory:parent_group

-在其中创建两个子控制组:

sudo cgcreate-g cpu,memory:parent_group/child_group1

sudo cgcreate-g cpu,memory:parent_group/child_group2

可以为每个子控制组分别设置资源限制和优先级。

七、额外需要注意的内容

欢迎点赞分享,搜索关注【鹅厂架构师】公众号,一起探索更多业界领先产品技术。

Ubuntu下U盘显示read-only,无法向U盘中复制文件以及创建路径

Ubuntu下,当您发现U盘显示只读文件系统(Read-Only),即无法进行新建文件、文件夹或向U盘复制文件等操作时,系统提示的“只读文件系统”问题,通常是因为U盘的文件系统信息出现错误。在这种情况下,格式化U盘可解决问题,但会丢失所有数据。幸运的是,您可以尝试以下步骤修复U盘而不丢失数据。

首先,打开命令行终端,执行以下指令:

df-h/ sudo df-h

通过此指令,您可以看到所有已挂载硬盘和U盘的信息。从输出中,您将找到U盘的文件系统和挂载点,例如:

文件系统容量已用可用已用%挂载点

udev 3.9G 0 3.9G 0%/dev

tmpfs 786M 9.6M 776M 2%/run

/dev/sda5 272G 137G 121G 54%/

tmpfs 3.9G 208M 3.7G 6%/dev/shm

tmpfs 5.0M 4.0K 5.0M 1%/run/lock

tmpfs 3.9G 0 3.9G 0%/sys/fs/cgroup

tmpfs 786M 92K 786M 1%/run/user/1000

/dev/sdb1 284G 217G 68G 77%/media/admin/MyUDisk

从输出中找到U盘的文件系统(如/dev/sdb1)和挂载点(如/media/admin/MyUDisk),继续执行以下命令:

sudo umount/media/admin/MyUDisk

在卸载U盘后,切勿立即拔出U盘。

sudo dosfsck-v-a/dev/sdb1

请注意,这里的/dev/sdb1仅为示例,请根据实际情况调整。执行此命令后,请耐心等待,因为执行时间可能从几秒钟到几分钟不等。完成执行后,重新挂载U盘以检验修复效果。

阅读剩余
THE END