ubuntu使用cgroup限制page cache大小

起因

起因是使用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 ./${你需要运行的程序} [参数]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值