ubuntu使用cgroup限制page cache大小

本文介绍了如何使用cgroup来限制Linux系统上的进程组所使用的内存及CPU资源,特别是针对pagecache无限制增长的问题,提供了具体的配置步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

起因

起因是使用ycsb做固态盘的对比实验时,由于两块盘在不同的机器上,而两台机器的内存分别16GB和128GB,导致性能无法对齐。造成该现象的主要原因是page cache会无限制增长,因此经过大量读之后,128GB内存的机器甚至会将整个数据库加载进page cache中。

linux支持使用echo 3 > /proc/sys/vm/drop_caches直接清空page cache,或通过设置参数加快page cache的page回收,但无法直接限制page cache的大小,尤其是一个进程组的page cache大小。

cgroup是一个有效解决方案。

介绍

cgroup将进程分组,可以对一组进程进行统一的资源监控和限制。可以限制的资源包括以下,每种资源称作一个subsystem:

subsystem解释
cpucpu权重
cpuacct统计cgroups中进程的cpu使用报告
cpuset多核系统中,设定cgroups中进程能访问的CPU节点和内存节点
blkio限制进程组的块设备IO
memory限制进程组的内存使用量,包括page cache
devices可以控制进程能够访问某些设备
freezer挂起或者恢复cgrops中进程
net_cls可以标记cgroups中进程的网络数据包,然后可以使用tc(traffic control)对数据包进程控制
ns可以使不同cgroups下面的进程使用不同的namespace

使用

环境:ubuntu 18.04 / linux 5.4.0-124-generic

Ubuntu下限制进程使用内存资源的方法(cgroup) - 百度文库 (baidu.com)

  1. 安装cgroup

    $ sudo apt install cgroup-tools
  2. 进入memory子系统的目录(以下步骤需要使用root用户)

    $ cd /sys/fs/cgroup/memory
  3. 在该目录新建文件夹即可创建一个进程组

    $ mkdir test

    该文件夹内将自动生成配置文件

    # 演示
    root@ubuntu-Super-Server:/sys/fs/cgroup/memory/test# ls
    cgroup.clone_children  memory.kmem.failcnt             memory.kmem.tcp.limit_in_bytes      memory.max_usage_in_bytes        memory.soft_limit_in_bytes  notify_on_release
    cgroup.event_control   memory.kmem.limit_in_bytes      memory.kmem.tcp.max_usage_in_bytes  memory.move_charge_at_immigrate  memory.stat                 tasks
    cgroup.procs           memory.kmem.max_usage_in_bytes  memory.kmem.tcp.usage_in_bytes      memory.numa_stat                 memory.swappiness
    memory.failcnt         memory.kmem.slabinfo            memory.kmem.usage_in_bytes          memory.oom_control               memory.usage_in_bytes
    memory.force_empty     memory.kmem.tcp.failcnt         memory.limit_in_bytes               memory.pressure_level            memory.use_hierarchy
  4. 修改配置文件,则该进程组使用的内存不会超过1GB,page cache的大小包括在内。

    $ cd test
    $ echo 1G > memory.limit_in_bytes
  5. 运行

    $ cgexec -g memory:test ./${你需要运行的程序} [参数]

续:限制cpu核心数

  1. 进入cpuset子系统的目录(以下步骤需要使用root用户)

    $ cd /sys/fs/cgroup/cpuset
  2. 在该目录新建文件夹即可创建一个进程组

    $ mkdir test
  3. 修改配置文件,则该进程组使用的内存不会超过1GB,page cache的大小包括在内。

    $ cd test
    $ echo 0-7 > cpuset.cpus

    注意:必须同时指定内存,否者运行时会报错

    可以通过numactl --hardware查看numa中cpu对应的内存,如我的机器1:有1个numa节点,32个核都对应内存节点node 0

    available: 1 nodes (0)
    node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
    node 0 size: 15919 MB
    node 0 free: 2068 MB

    而机器2:有两个numa节点,16个核中每8个核对应一个内存节点

    available: 2 nodes (0-1)
    node 0 cpus: 0 1 2 3 4 5 6 7
    node 0 size: 64090 MB
    node 0 free: 54078 MB
    node 1 cpus: 8 9 10 11 12 13 14 15
    node 1 size: 64480 MB
    node 1 free: 62107 MB

    设置mems:

    $ echo 0 > cpuset.mems

  4. 运行(cpuset和memory同时限制)

    $ cgexec -g cpuset,memory:test ./${你需要运行的程序} [参数]

<think>好的,用户想在Ubuntu使用cgroup,需要教程、配置和示例。首先,我需要回忆关于cgroupUbuntu上的基本知识。记得cgroupLinux内核功能,用于资源管理,Ubuntu可能通过cgroup-tools或libcgroup包来提供支持。 首先,用户可能需要安装相关软件包。根据引用[1],安装命令是sudo apt-get install cgroup-bin。不过现在可能更常用的是cgroup-tools,所以应该建议安装cgroup-tools。然后启动服务,用sudo service cgconfig start,这个在引用[1]也提到了。 接下来,配置部分。可能需要创建一个cgroup,比如限制CPU或内存。比如,创建一个名为my_group的组,然后设置参数。引用[3]中的例子是关于CPU核的限制,可以借鉴。比如用cpuset.cpus来限制CPU核心,或者用cpu.shares来分配CPU权重。 用户可能需要具体的示例。比如限制某个进程的内存使用,可以用memory子系统。创建cgroup,设置memory.limit_in_bytes,然后将进程的PID写入tasks文件。此外,使用cgcreate、cgset等命令会更方便,这些属于cgroup-tools的一部分。 另外,用户可能想知道如何持久化配置,避免重启后丢失。这可能需要编辑/etc/cgconfig.conf文件,添加群组和参数,这样服务启动时会自动加载。 还要注意权限问题,可能需要使用sudo,或者配置适当的权限让普通用户也能管理cgroup。这部分可能需要提到修改/etc/cgconfig.conf中的权限设置。 最后,结合用户提供的引用内容,引用[3]提到了Docker容器使用cgroup的情况,可以说明cgroup在容器中的应用,比如Docker自动配置cgroups参数。这可能帮助用户理解实际应用场景。 总结步骤:安装工具、启动服务、创建和配置cgroup、示例(CPU、内存限制)、持久化配置、权限管理、结合Docker的示例。同时确保引用正确的来源,如引用[1]、[3]中的命令和示例。</think>### Ubuntucgroups配置与使用指南 #### 一、环境准备 1. 安装cgroup工具包 ```bash sudo apt-get install cgroup-tools libcgroup1 # 安装核心组件[^1] ``` 2. 启动cgroup服务 ```bash sudo systemctl start cgconfig.service # 启动资源配置守护进程 ``` #### 二、基础配置示例 1. **创建CPU限制组** ```bash sudo cgcreate -g cpu:/web_server # 创建名为web_server的控制组 sudo cgset -r cpu.shares=512 web_server # 设置CPU相对权重为512[^3] ``` 2. **内存限制配置** ```bash sudo cgcreate -g memory:/database sudo cgset -r memory.limit_in_bytes=2G database # 限制最大内存2GB ``` #### 三、进程绑定演示 ```bash # 将Nginx进程加入控制组 pid=$(pgrep nginx | head -1) sudo cgclassify -g cpu,memory:/web_server $pid # 同时应用CPU和内存限制 ``` #### 四、永久化配置 编辑`/etc/cgconfig.conf`实现重启保留: ```conf group web_app { cpu { cpu.shares = 768; } memory { memory.limit_in_bytes = 1.5G; } } ``` 执行`sudo systemctl restart cgconfig.service`激活配置[^1] #### 五、Docker集成示例 创建容器时自动应用cgroups限制: ```bash docker run -it --cpuset-cpus="0-1" --memory="1g" ubuntu # 限制使用0-1号CPU核心和1GB内存 ``` #### 六、验证配置 ```bash # 查看CPU限制 cat /sys/fs/cgroup/cpu/web_server/cpu.shares # 检查内存限制 cat /sys/fs/cgroup/memory/database/memory.limit_in_bytes ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值