【taskset详解】

taskset设置cpu亲和力,taskset能够将一个或者多个进程绑定到一个或者多个处理器上运行

参数:

选项:
-a, --all-tasks 在给定 pid 的所有任务(线程)上操作
-p, --pid 在给定 pid 上操作
-c, --cpu-list 以列表格式显示和指定 CPU
-h, --help 显示此帮助
-V, --version 输出版本信息

案例:设置nginx cpu亲合力

在conf/nginx.conf中,

worker_processes 4;用来配置 nginx启动几个工作进程 的,默认为1,而nginx还支持一个名为worker_cpu_affinity的配置项,也就是说nhinx可以为每个工作进程绑定CPU,

worker_cpu_affinity 00000001 00000010 00000100 00001000 ;

这里0001,0010, 0100, 01000是掩码,分别代表第1,2,3,4等四颗cpu核心;

如果要想绑定nginx进程的cpu,首先要查看nginx的进程ID,随后将对应的ID取出来,通过taskset -cp 指定cpu核心数以及进程号即可

# ps -ef | grep nginx    查看nginx的主进程ID号
root 2304 1 0 13:07 ? 00:00:00 nginx: master process nginx

[root@nginx-web02 ~]# taskset -cp 0,2 2304       #设置cpu亲和力,让nginx的主进程跑cpu1和cpu3上面
pid 2304's current affinity list: 0-3     #未绑定之前是跑在所有1-4个cpu上面
pid 2304's new affinity list: 0,2          #绑定之后,只跑在cpu1和cpu3上面

另外我们可以通过taskset  -cp 【进程号】查看某服务的进程ID跑在拿个CPU上面,如下所示

【设置docker容器cpu亲和力】

# docker run -itd --name centosv2 --cpuset-cpus 1-2 49f7960eb7e4     #通过“--cpuset-cpus“参数,让一个容器进程只在cpu2-3上面运行

我们可以在"/sys/fs/cgroup/system.slice/"这个目录查看docker容器生成的绑定cpu核心数

#cat /sys/fs/cgroup/cpuset/system.slice/docker-e5ea5af23654a142518c3076395ff02a6ff2869708b59852abaf84614a70d665.scope/cpuset.cpus
1-2

进程容器测试

可以通过docker exec (容器ID或者名称)taskset -cp (1容器内部第一个编号一般为1),可以看到容器进程与CPU绑定关系,可以认为达到了绑定CPU内核的目的

# docker exec centosv2 taskset -cp 1
pid 1's current affinity list: 1,2

cpu配额控制参数的混合使用

在上面的参数中,cpu-shares控制只发生在容器竞争同一个CPU内核上,如果通过cpuset-cpus制定容器A使用内核0,容器B使用内核1,在主机上只有这两个容器使用对应内核情况,那么cpu-share没有明显效果

cpu-period,cpu-quota这两个参数联合使用,在单核情况下或者的通过cpuset-cpus强制容器使用一个cpu内核的情况下,即使cpu-quota超过cpu-period,也不会让容器使用更多的cpu资源

cpuset-cpus,cpuset-mems只在多核,多内存节点上的服务器有效,并且必须要与实际 的物理配置匹配吗否则无法达到资源控制的目的

例子:测试cpuset-cpus和cpu-shares混合使用运行效果,就需要一个压力测试工具stress来让容器把实例cpu跑满

工具安装部分


stress是linux系统压力测试软件,stress可以测试linux系统cpu,menory,IO,disk的负载

wget http://people.seas.harvard.edu/~apw/stress/stress-1.0.4.tar.gz


tar zxvf stress-1.0.4.tar.gzcd stress-1.0.4


./configure --prefix=/usr/local/stress


make


make install

stress参数详解:

-?  显示帮助信息

-v  显示版本号

-q  不显示运行版本

-n  显示已完成的指令情况

-t   --timeout  N 指定运行 N秒后停止

     --backoff N  等待N微妙后开始运行

-c    产生n个进程,每个进程都会反复不停的计算随机数的平方根,测试CPU

-i    产生n个进程,每个进程反复调用sync(),sync()用于将内存上面的内容写到硬盘上面,测试硬盘磁盘IO

-m  --vm n产生N个进程,每个进程不断调用内存分配malloc和内存释放free  测试内存

      --vm-bytes  B  指定malloc时内存的字节数(默认256MB)

     --vm-hang N  指定在free栈的秒数

-d   -hadd n产生n个执行write和unlink函数的进程

     -hadd-bytes B  指定写的字节数

    --hadd-noclean  不  unlink

# cd /usr/local/stress/

# ./bin/stress -c 2 -i 2 --verbose --timeout 20s     #2个进程,2个IO进程,20秒后停止

[Docker容器cpu资源隔离和限制]---重点内容

 实例1:测试cpuset-cpus和cpus-shares混合使用运行效果,通过stress压力测试容器,将cpu跑满,当cpu跑满后,会不会去其他cpu上去运行呢?如果第一颗cpu跑满后,没有转移到第二颗cpu,那么,说明cgroup资源隔离成功

# docker run -itd --name centosv1 --cpuset-cpus 0,1 --cpu-shares 512 49f7960eb7e4 /bin/bash

# docker run -itd --name centosv2 --cpuset-cpus 0,1 --cpu-shares 1024 49f7960eb7e4 /bin/bash

首先分别在容器内部安装scp命令,以便将宿主机的stress工具拷贝进来,在内部压测,例如进入centosv2进行压力测试,先测试一下cpu资源是够隔离,

[root@b4577f900fcc /]# yum install -y openssh-clients    #在容器安装scp命令

[root@b4577f900fcc /]# scp -r root@192.168.2.151:/usr/local/stress ./    #将宿主机的stress路径拷贝到centosv2容器中,以便进行压力测试

[root@b4577f900fcc /]# ./stress/bin/stress -c 2 --verbose --timeout 10m   #指定两个容器内部进程

tar xvf stress-1.0..tar.gz
cd stress-1.0.
./config --prefix=/usr/local/stress
make && make install
ln -s /usr/local/bin/stress /usr/bin/stress
nohup stress -c 2 --verbose --timeout 10m #可在后台运行stress命令,方面查看cpu限制以及配额

ok~上述图中,我们可以看到CPU0和cpu2已经跑满了,只在cpu0和cpu1上面,并未在cpu 2和cpu3运行,说明cpu资源隔离成功

2)下面同时运行centosv1和centosv2两个容器,当时通过--cpuset-cpus设置两个容器只运行在cpu0-1上面,随后通过--cpu-shares进行cpu份额,也就是 centosv2的cpu使用率量是centosv1的两倍,我们可以很清晰的看到,两个容器使用情况,centosv2使用率为66.x%,而centosv1使用量是v2的一半,也就是33.x%,说明--cpu-shares资源限制成功

 

例子2:动态修改,比如说,我现在想将两个容器的cpu份额平均下来,,只需将centosv2的--cpu.shares 1024改成与centosv1相同的512即可

# docker ps | grep centosv2
b4577f900fcc         49f7960eb7e4  "/bin/bash"          2  hours ago  Up  2 hours

# cat /sys/fs/cgroup/cpu,cpuacct/system.slice/docker-b4577f900fcce0451af030dc3fce8f71916a26d59c642a3336ceaee45e5aee22.scope/cpu.shares

将“512”写入cpu.shares中即可,无需重启centosv2容器生效,如果找不到cpu.shares这个文件存放在那个路径,可以通过find / --name “cpu.shares”查看
[root@nginx-web ~]# echo "512" > /sys/fs/cgroup/cpu,cpuacct/system.slice/docker-b4577f900fcce0451af030dc3fce8f71916a26d59c642a3336ceaee45e5aee22.scope/cpu.shares

【Docker内存限制】

docker提供了参数-m ,--memory=“”限制容器内存使用量

例子:允许docker容器使用的内存上线为128M

# cat /sys/fs/cgroup/memory/system.slice/docker-6e014a7e2101b87c84a2b400032e7d2fdbd42035ed2d78742e3f7347409a5a42.scope/memory.limit_in_bytes
134217728

 【DockerI/O限制】

限制硬盘的读写速度

例子:设置容器硬盘的最高读写速度为1MB/s

# docker run -itd --name centosv4 --device-write-bps /dev/sda:1mb 49f7960eb7e4

[root@8bbdbfca2722 /]# time $(dd if=/dev/zero of=f1.txt bs=1M count=1024 &&sync)

1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 2.92801 s, 367 MB/s

real 0m11.933s     #使用11s左右。1秒93M左右
user 0m0.002s
sys 0m1.616s

【Docker磁盘配额】

docker容器默认启动虚拟机,会占用宿主机的资源,默认有两种驱动方式,即DeviceMapper和Overlay2,容器应哦按的rootfs根分区空间是整个宿主机的空间大小;我们都知道,docker共享这宿主机的硬盘空间,有的时候,docker所在的宿主机还有其他的应用服务,也共享者空间,如果docker占用空间无限制的占用宿主机,那么势必会影响该宿主机其他的应用,此时,我们需要对docker的数据所占用的空间进行限制,也就是设置docker磁盘配额

在这里,只有xfs文件系统才能支持目录界级别的磁盘配额功能

# mkfs.xfs -f /dev/sdb

# mount -o uquota,prjquota /dev/sdb /data/

# xfs_quota -x -c 'limit bsoft=10M bhard=10M user_test' /data/    #设置user_test用户为对/data目录的使用空间限制

测试,切换普通用户user_test,使用dd进行磁盘读写测试,写入查过10M的数据文件,看是否限制~

下面used表示用户对/data目录已使用的空间大小

接下来对docker容器的配额~

#vim  /etc/sysconfig/docker

OPTIONS='--storage-opt overlay2.size=10G'

# mkfs.xfs -f /dev/sdb

# mount -o uquota,prjquota /dev/sdb /data/

# cd /var/lib/
# mv docker docker.back/

#ln -s /data_directory/docker/    /var/lib/

#docker pull docker.io/lemonbar/centos6-ssh

#docker run -itd --name test02 --privileged efd998bd6817

tasksetCPU亲和力&docke容器资源限制的更多相关文章

  1. Docker 容器资源限制

    Docker 容器资源限制 默认情况下,一个容器并没有资源限制,并且该容器可以使用内核调度的所有资源.Docke提供了在启动容器时设置一些参数来控制该容器使用的内存.CPU和IO. 内存 OOME:在 ...

  2. docker网络-如何让外部网络访问容器资源

    docker网络-如何让外部网络访问容器资源 安装httpd 服务: docker:/root# docker exec -it f63b2633d146 bash bash-4.1# yum ins ...

  3. 四:(之九_容器资源限制)Dockerfile语法梳理和实践

    9 容器资源限制 9.1 Virtualbox :工具操作 9.2 内存限制 docker --help  只限定memory bytes,则memory-swap默认与其存储相同. 资源限制生效: ...

  4. 超大规模商用 K8s 场景下,阿里巴巴如何动态解决容器资源的按需分配问题?

    作者 | 张晓宇(衷源)  阿里云容器平台技术专家 关注『阿里巴巴云原生』公众号,回复关键词"1010",可获取本文 PPT. 导读:资源利用率一直是很多平台管理和研发人员关心的话 ...

  5. Docker 0x07: Docke 容器网络

    目录 Docke 容器网络 Container Network Model (CNM) 具体项目中代码对象有哪些 Implementations实现的网络(直接英文版) Libnetwork incl ...

  6. docker容器资源配额控制_转

    转自:docker容器资源配额控制 ■ 文/ 天云软件 容器技术团队 docker通过cgroup来控制容器使用的资源配额,包括CPU.内存.磁盘三大方面,基本覆盖了常见的资源配额和使用量控制. cg ...

  7. Kubernetes 学习22 kubernetes容器资源需求资源限制及HeapSter(翻车章节)

    一.概述 1.接下来介绍在k8s上运行pod对象时我们如何去监控我们系统级的资源指标以及业务级别的资源指标.数据如何获取和监控.在此之前先介绍一下Pod对象的资源请求和资源限制.即容器的资源需求和资源 ...

  8. docker stats监控容器资源消耗

    在容器的使用过程中,如果能及时的掌握容器使用的系统资源,无论对开发还是运维工作都是非常有益的.幸运的是 docker 自己就提供了这样的命令:docker stats. 默认输出 docker sta ...

  9. Docker(十九)-Docker监控容器资源的占用情况

    启动一个容器并限制资源 启动一个centos容器,限制其内存为1G ,可用cpu数为2 [root@localhost ~]# docker run --name os1 -it -m 1g --cp ...

随机推荐

  1. python操作三大主流数据库(11)redis的安装和简单使用

    命令参考文档:http://www.redis.cn/topics/introduction.html 1.安装及配置官网https://redis.io中文网站:http://www.redis.c ...

  2. windows 中java开发环境搭建

    安装jdk1.6 1.下载tomcat服务器 2. 解压缩tomcat  * 不要使用含有空格和中文目录 3.启动tomcat之前 配置 JAVA_HOME 环境变量 ------ 配置JDK安装路径 ...

  3. why should the parameter in copy construction be a reference

    if not, it will lead to an endless loop!!! # include<iostream> using namespace std; class A { ...

  4. 运输层TCP/UDP

    UDP:用户数据报协议 客户不与服务器建立连接,它只管用函数sendto给服务器发送数据报,此函数要求目的地址(服务器)作为其参数.类似的,服务器不从客户接受连接,它只管调用函数recvfrom,等待 ...

  5. 模块 -- 序列化 hashlib sha logging (加密 加盐 )

    模块:  一个py文件就是一个模块 模块分类: 1:内置模块,登录模块,时间模块,sys模块,os模块等等 2: 扩展模块, 3:自定义模块,自己写的py文件 python 开发效率之高:python ...

  6. 基于MVC 的Quartz.Net组件实现的定时执行任务调度

    新建mvc项目之后,首先引用Quartz组件.工具-->NuGet包管理器-->管理解决方案的 NuGet包管理器 组件安装完成. Quartz.Net一个最简单任务至少包括三部分实现:j ...

  7. grep,find

    grep是强大的文本搜索工具,他可以对文件逐行查看,如果找到匹配的模式,就可以打印出包含次模式的所有行,并且支持正则表达式 find查找文件的grep是来查找字符串的,文件的内容 grep 文件的内容 ...

  8. C# Excel行高、列宽、合并单元格、单元格边框线、冻结

    private _Workbook _workBook = null;private Worksheet _workSheet = null;private Excel.Application _ex ...

  9. Oauth2.0 QQ&微信&微博实现第三方登陆

    一.写在前面 目前对于大多数的App或Web网站都支持有第三方登陆这个功能,用户可使用 QQ/ 微信/ 微博 帐号快速登录你的网站,降低注册门槛,为你的网站带来海量新用户.最近在新项目上刚好用到了,在 ...

  10. mysql5.7设置简单密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

    注:本文来源于<  mysql5.7设置简单密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy r ...