docker高級應用(CPU與內存資源限制)

mfbz0886 8年前發布 | 68K 次閱讀 Docker

來自: http://www.jixuege.com/?id=55

本篇講的就是利用docker本身的參數進行CPU與內存資源的限制。

1、內存限制

默認docker內存限制可以使用-m參數進行限制,但如果只使用-m參數,不添加其他的,那么內存限制不會限制死,比如-m 256m內存,那么容器里程序可以跑到2*256m后才會被殺死。

原因就是:源碼里 memory.memsw.limit_in_bytes 值是被設置成我們指定的內存參數的2倍。

源碼地址: https://github.com/docker/libcontainer/blob/v1.2.0/cgroups/fs/memory.go#L39

內容:

// By default, MemorySwap is set to twice the size of RAM.
    // If you want to omit MemorySwap, set it to `-1'.
    if d.c.MemorySwap != -1 {
      if err := writeFile(dir, "memory.memsw.limit_in_bytes", strconv.FormatInt(d.c.Memory*2, 10)); err != nil {
        return err
      }

測試一下:

限制內存為2G

#  docker run --privileged -d  --cpuset-cpus="0,1" -m 2048m --name java101 javatest2:8 /sbin/init

docker exec -it d3e2982e6a7d bash</pre>

進入容器使用stress進行內存測試。

安裝stress

stress是一個壓力測試工具,可測試服務器負載情況

安裝命令:

# rpm -Uvh http://pkgs.repoforge.org/stress/stress-1.0.2-1.el7.rf.x86_64.rpm

使用stress進行測試

[root@60fcca8ba4db ~]# stress --vm 1 --vm-bytes 4089M --vm-hang 0
這個命令是跑4089M的內存

參數說明:

--vm-bytes B   指定malloc時內存的字節數(默認256MB)

--vm-hang N 指定在free前的秒數

--vm 1 產生1個進程,每個進程不斷調用內存分配malloc和內存釋放free函數

[root@60fcca8ba4db ~]# stress --vm 1 --vm-bytes 4089M --vm-hang 0
stress: info: [674] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [674] (420) <-- worker 675 got signal 9
stress: WARN: [674] (422) now reaping child worker processes
stress: FAIL: [674] (456) failed run completed in 37s

可以看到程序死了,查看原因

[root@60fcca8ba4db ~]# cat /var/log/messages 
Mar 21 15:27:52 60fcca8ba4db kernel: Task in /system.slice/docker-60fcca8ba4dbd08c6f064e0bd7be2887bdb301c49360a8386f28bce9bee2201e.scope killed as a result of limit of /system.slice/docker-60fcca8ba4dbd08c6f064e0bd7be2887bdb301c49360a8386f28bce9bee2201e.scope
Mar 21 15:27:52 60fcca8ba4db kernel: memory: usage 2097152kB, limit 2097152kB, failcnt 368074
Mar 21 15:27:52 60fcca8ba4db kernel: memory+swap: usage 3827916kB, limit 9007199254740991kB, failcnt 0
Mar 21 15:27:52 60fcca8ba4db kernel: kmem: usage 0kB, limit 9007199254740991kB, failcnt 0
Mar 21 15:27:52 60fcca8ba4db kernel: Memory cgroup stats for /system.slice/docker-60fcca8ba4dbd08c6f064e0bd7be2887bdb301c49360a8386f28bce9bee2201e.scope: cache:2516KB rss:2094636KB rss_huge:0KB mapped_file:2444KB swap:1730764KB inactive_anon:527536KB active_anon:1569412KB inactive_file:56KB active_file:20KB unevictable:0KB
Mar 21 15:27:52 60fcca8ba4db kernel: [ pid ]   uid  tgid total_vm      rss nr_ptes swapents oom_score_adj name
Mar 21 15:27:52 60fcca8ba4db kernel: [ 1057]     0  1057    10208       94      24      143             0 systemd
Mar 21 15:27:52 60fcca8ba4db kernel: [ 1079]     0  1079    11252      631      23       55             0 systemd-journal
Mar 21 15:27:52 60fcca8ba4db kernel: [ 1091]     0  1091    10540        9      20      229         -1000 systemd-udevd
Mar 21 15:27:52 60fcca8ba4db kernel: [ 1191]     0  1191    20638        1      42      213         -1000 sshd
Mar 21 15:27:52 60fcca8ba4db kernel: [ 1193]     0  1193    57518      219      42      441             0 rsyslogd
Mar 21 15:27:52 60fcca8ba4db kernel: [ 1194]    81  1194     6615       41      18       41          -900 dbus-daemon
Mar 21 15:27:52 60fcca8ba4db kernel: [ 1203]     0  1203    80863        0      81     4219             0 firewalld
Mar 21 15:27:52 60fcca8ba4db kernel: [ 1204]     0  1204     6599       30      16       45             0 systemd-logind
Mar 21 15:27:52 60fcca8ba4db kernel: [ 1210]     0  1210    31583        4      18      151             0 crond
Mar 21 15:27:52 60fcca8ba4db kernel: [ 2191]     0  2191    34288       22      68      295             0 sshd
Mar 21 15:27:52 60fcca8ba4db kernel: [ 2194]     0  2194     2943       21      11       79             0 bash
Mar 21 15:27:52 60fcca8ba4db kernel: [ 4536]     0  4536    31357        1      17       59             0 anacron
Mar 21 15:27:52 60fcca8ba4db kernel: [ 5706]     0  5706    27508        0      10       30             0 agetty
Mar 21 15:27:52 60fcca8ba4db kernel: [ 8006]     0  8006     1815        0       8       24             0 stress
Mar 21 15:27:52 60fcca8ba4db kernel: [ 8007]     0  8007  1048600   519080    1858   427304             0 stress
Mar 21 15:27:52 60fcca8ba4db kernel: Memory cgroup out of memory: Kill process 8007 (stress) score 877 or sacrifice child
Mar 21 15:27:52 60fcca8ba4db kernel: Killed process 8007 (stress) total-vm:4194400kB, anon-rss:2076316kB, file-rss:4kB
Mar 21 15:27:52 60fcca8ba4db root: [euid=root]:root pts/0 Mar 21 14:40 (192.168.7.173):[/root]2016-03-21 15:27:15 rootstress --vm 1 --vm-bytes 4089M --vm-hang 0
Mar 21 15:30:01 60fcca8ba4db systemd: Started Session 35096 of user root.
Mar 21 15:30:01 60fcca8ba4db systemd: Starting Session 35096 of user root.

顯示內存使用超過2倍限制的內存,所以進行oom kill掉stress的進程,但容器不會死,仍然能正常運行。

但如果你想寫死內存,可以使用

-m 2048m --memory-swap=2048m
這樣就直接限制死,只要程序內存使用超過1024m,那么就會被oom給kill。

2、CPU限制

目前CPU限制可以使用綁定到具體的線程,或者是在綁定線程基礎上對線程資源權重分配。

綁定線程可以使用參數--cpuset-cpus=7 ,分配線程呢可以使用參數-c 來給權重

例如:

docker run --privileged -d -c 1024 --cpuset-cpus="4,5" -m 2048m --name java52 javatest2:8 /sbin/init
</div>

 本文由用戶 mfbz0886 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!