起因
起因是使用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 | 解释 |
---|---|
cpu | cpu权重 |
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)
-
安装cgroup
$ sudo apt install cgroup-tools
-
进入memory子系统的目录(以下步骤需要使用root用户)
$ cd /sys/fs/cgroup/memory
-
在该目录新建文件夹即可创建一个进程组
$ 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
-
修改配置文件,则该进程组使用的内存不会超过1GB,page cache的大小包括在内。
$ cd test $ echo 1G > memory.limit_in_bytes
-
运行
$ cgexec -g memory:test ./${你需要运行的程序} [参数]
续:限制cpu核心数
-
进入cpuset子系统的目录(以下步骤需要使用root用户)
$ cd /sys/fs/cgroup/cpuset
-
在该目录新建文件夹即可创建一个进程组
$ mkdir test
-
修改配置文件,则该进程组使用的内存不会超过1GB,page cache的大小包括在内。
$ cd test $ echo 0-7 > cpuset.cpus
注意:必须同时指定内存,否者运行时会报错
可以通过
numactl --hardware
查看numa中cpu对应的内存,如我的机器1:有1个numa节点,32个核都对应内存节点node 0available: 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
-
运行(cpuset和memory同时限制)
$ cgexec -g cpuset,memory:test ./${你需要运行的程序} [参数]