taskset命令
taskset設定cpu親和力,task可以將一個或多個進程綁定到一個或多個處理器上運行。
參數:
-c,--cpu-list 以列表格式顯示和指定 cpu
-p,--pid 在已經存在的 pid 上操做linux
設置只在1和2號cpu運行sshd進程程序
nginx
[root@apenglinux-002 ~]# taskset -cp 1,2 914 pid 914's current affinity list: 0-3 pid 914's new affinity list: 1,2
查看id爲1的進程在哪一個cpu上運行docker
[root@apenglinux-002 ~]# taskset -cp 1 pid 1's current affinity list: 0-3
設置 nginx cpu親和力centos
在 conf/nginx.conf 中,有以下一行:
worker_processes 1;
這裏用來配置nginx啓動幾個工做進程,默認爲1.而nginx還支持一個名爲worker_cpu_affinity的配置項,也就是說,nginx能夠爲每一個工做進程綁定cpu。以下配置:
worker_processes 3;
worker_cpu_affinity 0010 0100 1000
這裏0010 0100 1000是掩碼,分別表明第二、三、4顆cpu核心。
重啓nginx後,3個工做進程就能夠各自用各自的cpu了。bash
物理機一共用16個核心,建立的容器只能用0、一、2這三個內核服務器
[root@apenglinux-002 ~]# docker run -itd --name cpu1 --cpuset-cpus 0-2 centos eefe1ff3e567082c2d2d888911b239cfdc3407230f6c727ead05dfcf13368406 [root@apenglinux-002 ~]# cat /sys/fs/cgroup/cpuset/docker/eefe1ff3e567082c2d2d888911b239cfdc3407230f6c727ead05dfcf13368406/cpuset.cpu cpuset.cpu_exclusive cpuset.cpus [root@apenglinux-002 ~]# cat /sys/fs/cgroup/cpuset/docker/eefe1ff3e567082c2d2d888911b239cfdc3407230f6c727ead05dfcf13368406/cpuset.cpus 0-2
進入容器測試ssh
經過docker exec <容器id或名字> taskset -c -p 1(容器內部第一個進程編號通常爲1),能夠看到容器中進程與cpu內核的綁定關係,能夠認爲達到了綁定cpu內核的目的。curl
[root@apenglinux-002 ~]# docker exec cpu1 taskset -cp 1 pid 1's current affinity list: 0-2
cpu配額控制參數的混合使用ide
在上面這些參數中,cpu-shares控制只發生在容器競爭同一個內核的時間片時,若是經過cpuset-cpus指定容器A使用內核0,容器B只是用內核1,在主機上只有這兩個容器使用對應內核的狀況,它們各自用所有的內核資源,cpu-shares沒有明顯效果。函數
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。stress 能夠測試Linux系統 cpu/memory/IO/disk的負載。
注:也可使用epel源中的stress-xxx.rpm
下載頁:
源碼編譯安裝 stress
[root@apenglinux-002 ~]# curl -O http://people.seas.harvard.edu/~apw/stress/stress-1.0.4.tar.gz [root@apenglinux-002 ~]# tar zxvf stress-1.0.4.tar.gz [root@apenglinux-002 stress-1.0.4]# ./configure --prefix=/usr/local/stree && make -j 4 && make -j 4 install
stress參數解釋
-? 顯示幫助信息
-v 顯示版本號
-q 不顯示運行信息
-n 顯示已完成的指令狀況
-t --timeout N 指定運行N秒後中止
-t --backoff N 等待N微秒後開始運行
-c 產生n個進程 每一個進程都反覆不停的計算隨機數的平方根
-i 產生n個進程 每一個進程反覆調用 sync(),sync()用於將內存上的內容寫到硬盤上
-m --vm n 產生n個進程,每一個進程不斷調用內存分配 malloc 和內存釋放 free函數
-m --vm-bytes B 指定malloc時內存的字節數(默認256MB)
-m --vm-hang N 指定在free棧的秒數
-d --hadd n 產生n個執行 write 和 unlink 函數的進程
-d --hadd-bytes B 指定寫的字節數
-d --hadd-noclean 不unlink
產生1個cpu進程,1個io進程,20秒後中止運行
[root@apenglinux-002 stress-1.0.4]# cd /usr/local/stree/ [root@apenglinux-002 stree]# ./bin/stress -c 1 -i 1 --verbose --timeout 20s
查看
測試 cpuset-cpus 和 cpu-shares 混合使用運行效果
須要一個壓縮力測試工具 stress 來讓容器實例把cpu跑滿。當跑滿後,會不會去其餘cpu上運行。若是沒有在其餘cpu上運行,說明 cgroup 資源限制成功。
建立兩個容器實例
[root@apenglinux-002 stree]# docker run -itd --name cpu2 --cpuset-cpus 0,1 --cpu-shares 512 centos /bin/bash 52f6079b005cffb29623bc279ea1f831efae1d620fdfb499757b2fbdb1103780 [root@apenglinux-002 stree]# docker run -itd --name cpu3 --cpuset-cpus 0,1 --cpu-shares 1024 centos /bin/bash 11a738511c2b9df5b3fbb803d03935d681db390dddda13119da0f34cf942b0b3
進入 cpu2,使用stress測試進程是否是隻在cpu 0,1上運行
[root@apenglinux-002 stree]# docker exec -it cpu2 /bin/bash [root@52f6079b005c /]# yum install openssh-clients -y [root@52f6079b005c /]# scp -r root@192.168.221.20:/usr/local/stree ./ [root@52f6079b005c /]# /stree/bin/stress -c 2 --verbose --timeout 10m
在物理機上使用 top 按 1 查看,每一個cpu使用狀況
進入 cpu3,使用stress測試進程是否是隻在cpu 0,1上運行
[root@apenglinux-002 ~]# docker exec -it cpu3 /bin/bash [root@11a738511c2b /]# yum install openssh-clients -y [root@11a738511c2b /]# scp -r root@192.168.221.20:/usr/local/stree ./ [root@11a738511c2b /]# /stree/bin/stress -c 2 --verbose --timeout 10m
容器cpu2,cpu3同時開啓兩個進程,看看cpu使用狀況
注:兩個容器只在cpu0,1上運行,cpu3是cpu2使用cpu的2倍。說明 --cpu-shares限制資源成功。
動態修改,將cpu3的--cpu-shares改成512