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盘以检验修复效果。