使用cgroup限制CPU核数
在性能测试的时候,有的时候需要限制CPU为指定核数,我们很容易想到docker,其实还可以通过cgroup来实现。
关于cgroup
cgroups全称control groups,是Linux内核提供的物理资源隔离机制,通过这种机制,可以实现对Linux进程或者进程组的资源限制、隔离和统计功能。比如可以通过cgroup限制特定进程的资源使用,比如使用特定数目的cpu核数和特定大小的内存,如果资源超限的情况下,会被暂停或者杀掉。
cgroup 和 namespace类似,也是将进程进行分组,但它的目的和namespace不一样,namespace 是为了隔离进程组之间的资源,而cgroup是为了对一组进程进行统一的资源监控和限制。.
限制CPU核数的方法
操作步骤如下:
进入/sys/fs/cgroup/cpuset目录。创建一个新的文件夹,文件夹的名字即为控制组的名字,比如tiger,
[root@mdw tiger]# pwd
/sys/fs/cgroup/cpuset/tiger
[root@mdw tiger]# ls
cgroup.clone_children cpuset.memory_pressure
cgroup.procs cpuset.memory_spread_page
cpuset.cpu_exclusive cpuset.memory_spread_slab
cpuset.cpus cpuset.mems
cpuset.effective_cpus cpuset.sched_load_balance
cpuset.effective_mems cpuset.sched_relax_domain_level
cpuset.mem_exclusive notify_on_release
cpuset.mem_hardwall tasks
cpuset.memory_migrate
先修改cpuset.mems,
[root@mdw tiger]# echo 0 > cpuset.mems
不然的话会报write error: No space left on device错误。
然后修改cpuset.cpus具体的CPU核数,比如限制使用32个核,
[root@mdw tiger]# cat cpuset.cpus
0-31
限制好后,需将将具体限制的进程写入cgroup.procs文件中
比如4462进程,echo 4462 > cgroup.procs即可。
进程fork的子进程会自动加人到cgroup.procs中,进程结束后,会从cgroup.procs中移除。
如果进程还没有结束,怎么移除限制呢?直接删是删不掉的,方法是将这个tiger/cgroup.procs中的进程ID重写到上级sys/fs/cgroup/cpuset/cgroup.procs中既可以从`sys/fs/cgroup/
cpuset/tiger/cgroup.procs`中移除限制。