自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

LXD 2.0 系列(四):資源控制

系統(tǒng) Linux 系統(tǒng)運維
這是 LXD 2.0 系列介紹文章的第四篇。因為 LXD 容器管理有很多命令,因此這篇文章會很長。 如果你想要快速地瀏覽這些相同的命令,你可以嘗試下我們的在線演示!

這是 LXD 2.0 系列介紹文章的第四篇。

  1. LXD 入門
  2. 安裝與配置
  3. 你的***個 LXD 容器

因為 LXD 容器管理有很多命令,因此這篇文章會很長。 如果你想要快速地瀏覽這些相同的命令,你可以嘗試下我們的在線演示!

[[180144]]

可用資源限制

LXD 提供了各種資源限制。其中一些與容器本身相關(guān),如內(nèi)存配額、CPU 限制和 I/O 優(yōu)先級。而另外一些則與特定設(shè)備相關(guān),如 I/O 帶寬或磁盤用量限制。

與所有 LXD 配置一樣,資源限制可以在容器運行時動態(tài)更改。某些可能無法啟用,例如,如果設(shè)置的內(nèi)存值小于當前內(nèi)存用量,但 LXD 將會試著設(shè)置并且報告失敗。

所有的限制也可以通過配置文件繼承,在這種情況下每個受影響的容器將受到該限制的約束。也就是說,如果在默認配置文件中設(shè)置 limits.memory=256MB,則使用默認配置文件(通常是全都使用)的每個容器的內(nèi)存限制為 256MB。

我們不支持資源限制池,將其中的限制由一組容器共享,因為我們沒有什么好的方法通過現(xiàn)有的內(nèi)核 API 實現(xiàn)這些功能。

磁盤

這或許是最需要和最明顯的需求。只需設(shè)置容器文件系統(tǒng)的大小限制,并對容器強制執(zhí)行。

LXD 確實可以讓你這樣做!

不幸的是,這比它聽起來復(fù)雜得多。 Linux 沒有基于路徑的配額,而大多數(shù)文件系統(tǒng)只有基于用戶和組的配額,這對容器沒有什么用處。

如果你正在使用 ZFS 或 btrfs 存儲后端,這意味著現(xiàn)在 LXD 只能支持磁盤限制。也有可能為 LVM 實現(xiàn)此功能,但這取決于與它一起使用的文件系統(tǒng),并且如果結(jié)合實時更新那會變得棘手起來,因為并不是所有的文件系統(tǒng)都允許在線增長,而幾乎沒有一個允許在線收縮。

CPU

當涉及到 CPU 的限制,我們支持 4 種不同的東西:

  • 只給我 X 個 CPU 核心

在這種模式下,你讓 LXD 為你選擇一組核心,然后為更多的容器和 CPU 的上線/下線提供負載均衡。

容器只看到這個數(shù)量的 CPU 核心。

  • 給我一組特定的 CPU 核心(例如,核心1、3 和 5)

類似于***種模式,但是不會做負載均衡,你會被限制在那些核心上,無論它們有多忙。

  • 給我你擁有的 20% 處理能力

在這種模式下,你可以看到所有的 CPU,但調(diào)度程序?qū)⑾拗颇闶褂?20% 的 CPU 時間,但這只有在負載狀態(tài)才會這樣!所以如果系統(tǒng)不忙,你的容器可以跑得很歡。而當其他的容器也開始使用 CPU 時,它會被限制用量。

  • 每測量 200ms,給我 50ms(并且不超過)

此模式與上一個模式類似,你可以看到所有的 CPU,但這一次,無論系統(tǒng)可能是多么空閑,你只能使用你設(shè)置的極限時間下的盡可能多的 CPU 時間。在沒有過量使用的系統(tǒng)上,這可使你可以非常整齊地分割 CPU,并確保這些容器的持續(xù)性能。

另外還可以將前兩個中的一個與***兩個之一相結(jié)合,即請求一組 CPU,然后進一步限制這些 CPU 的 CPU 時間。

除此之外,我們還有一個通用的優(yōu)先級調(diào)節(jié)方式,可以告訴調(diào)度器當你處于負載狀態(tài)時,兩個爭奪資源的容器誰會取得勝利。

內(nèi)存

內(nèi)存聽起來很簡單,就是給我多少 MB 的內(nèi)存!

它絕對可以那么簡單。 我們支持這種限制以及基于百分比的請求,比如給我 10% 的主機內(nèi)存!

另外我們在上層支持一些額外的東西。 例如,你可以選擇在每個容器上打開或者關(guān)閉 swap,如果打開,還可以設(shè)置優(yōu)先級,以便你可以選擇哪些容器先將內(nèi)存交換到磁盤!

內(nèi)存限制默認是“hard”。 也就是說,當內(nèi)存耗盡時,內(nèi)核將會開始殺掉你的那些進程。

或者,你可以將強制策略設(shè)置為“soft”,在這種情況下,只要沒有別的進程的情況下,你將被允許使用盡可能多的內(nèi)存。一旦別的進程想要這塊內(nèi)存,你將無法分配任何內(nèi)存,直到你低于你的限制或者主機內(nèi)存再次有空余。

網(wǎng)絡(luò) I/O

網(wǎng)絡(luò) I/O 可能是我們看起來最簡單的限制,但是相信我,實現(xiàn)真的不簡單!

我們支持兩種限制。 ***個是對網(wǎng)絡(luò)接口的速率限制。你可以設(shè)置入口和出口的限制,或者只是設(shè)置“***”限制然后應(yīng)用到出口和入口。這個只支持“橋接”和“p2p”類型接口。

第二種是全局網(wǎng)絡(luò) I/O 優(yōu)先級,僅當你的網(wǎng)絡(luò)接口趨于飽和的時候再使用。

塊 I/O

我把最古怪的放在***。對于用戶看起來它可能簡單,但有一些情況下,它的結(jié)果并不會和你的預(yù)期一樣。

我們在這里支持的基本上與我在網(wǎng)絡(luò) I/O 中描述的相同。

你可以直接設(shè)置磁盤的讀寫 IO 的頻率和速率,并且有一個全局的塊 I/O 優(yōu)先級,它會通知 I/O 調(diào)度程序更傾向哪個。

古怪的是如何設(shè)置以及在哪里應(yīng)用這些限制。不幸的是,我們用于實現(xiàn)這些功能的底層使用的是完整的塊設(shè)備。這意味著我們不能為每個路徑設(shè)置每個分區(qū)的 I/O 限制。

這也意味著當使用可以支持多個塊設(shè)備映射到指定的路徑(帶或者不帶 RAID)的 ZFS 或 btrfs 時,我們并不知道這個路徑是哪個塊設(shè)備提供的。

這意味著,完全有可能,實際上確實有可能,容器使用的多個磁盤掛載點(綁定掛載或直接掛載)可能來自于同一個物理磁盤。

這就使限制變得很奇怪。為了使限制生效,LXD 具有猜測給定路徑所對應(yīng)塊設(shè)備的邏輯,這其中包括詢問 ZFS 和 btrfs 工具,甚至可以在發(fā)現(xiàn)一個文件系統(tǒng)中循環(huán)掛載的文件時遞歸地找出它們。

這個邏輯雖然不***,但通常會找到一組應(yīng)該應(yīng)用限制的塊設(shè)備。LXD 接著記錄并移動到下一個路徑。當遍歷完所有的路徑,然后到了非常奇怪的部分。它會平均你為相應(yīng)塊設(shè)備設(shè)置的限制,然后應(yīng)用這些。

這意味著你將在容器中“平均”地獲得正確的速度,但這也意味著你不能對來自同一個物理磁盤的“/fast”和一個“/slow”目錄應(yīng)用不同的速度限制。 LXD 允許你設(shè)置它,但***,它會給你這兩個值的平均值。

它怎么工作?

除了網(wǎng)絡(luò)限制是通過較舊但是良好的“tc”實現(xiàn)的,上述大多數(shù)限制是通過 Linux 內(nèi)核的 cgroup API 來實現(xiàn)的。

LXD 在啟動時會檢測你在內(nèi)核中啟用了哪些 cgroup,并且將只應(yīng)用你的內(nèi)核支持的限制。如果你缺少一些 cgroup,守護進程會輸出警告,接著你的 init 系統(tǒng)將會記錄這些。

在 Ubuntu 16.04 上,默認情況下除了內(nèi)存交換審計外將會啟用所有限制,內(nèi)存交換審計需要你通過swapaccount = 1這個內(nèi)核引導(dǎo)參數(shù)來啟用。

應(yīng)用這些限制

上述所有限制都能夠直接或者用某個配置文件應(yīng)用于容器。容器范圍的限制可以使用:

  1. lxc config set CONTAINER KEY VALUE 

或?qū)τ谂渲梦募O(shè)置:

  1. lxc profile set PROFILE KEY VALUE 

當指定特定設(shè)備時:

  1. lxc config device set CONTAINER DEVICE KEY VALUE 

或?qū)τ谂渲梦募O(shè)置:

  1. lxc profile device set PROFILE DEVICE KEY VALUE 

有效配置鍵、設(shè)備類型和設(shè)備鍵的完整列表可以看這里。

CPU

要限制使用任意兩個 CPU 核心可以這么做:

  1. lxc config set my-container limits.cpu 2 

要指定特定的 CPU 核心,比如說第二和第四個:

  1. lxc config set my-container limits.cpu 1,3 

更加復(fù)雜的情況還可以設(shè)置范圍:

  1. lxc config set my-container limits.cpu 0-3,7-11 

限制實時生效,你可以看下面的例子:

  1. stgraber@dakara:~$ lxc exec zerotier -- cat /proc/cpuinfo | grep ^proces 
  2. processor : 0 
  3. processor : 1 
  4. processor : 2 
  5. processor : 3 
  6. stgraber@dakara:~$ lxc config set zerotier limits.cpu 2 
  7. stgraber@dakara:~$ lxc exec zerotier -- cat /proc/cpuinfo | grep ^proces 
  8. processor : 0 
  9. processor : 1 

注意,為了避免完全混淆用戶空間,lxcfs 會重排 /proc/cpuinfo 中的條目,以便沒有錯誤。

就像 LXD 中的一切,這些設(shè)置也可以應(yīng)用在配置文件中:

  1. stgraber@dakara:~$ lxc exec snappy -- cat /proc/cpuinfo | grep ^proces 
  2. processor : 0 
  3. processor : 1 
  4. processor : 2 
  5. processor : 3 
  6. stgraber@dakara:~$ lxc profile set default limits.cpu 3 
  7. stgraber@dakara:~$ lxc exec snappy -- cat /proc/cpuinfo | grep ^proces 
  8. processor : 0 
  9. processor : 1 
  10. processor : 2 

要限制容器使用 10% 的 CPU 時間,要設(shè)置下 CPU allowance:

  1. lxc config set my-container limits.cpu.allowance 10% 

或者給它一個固定的 CPU 時間切片:

  1. lxc config set my-container limits.cpu.allowance 25ms/200ms 

***,要將容器的 CPU 優(yōu)先級調(diào)到***:

  1. lxc config set my-container limits.cpu.priority 0 

內(nèi)存

要直接應(yīng)用內(nèi)存限制運行下面的命令:

  1. lxc config set my-container limits.memory 256MB 

(支持的后綴是 KB、MB、GB、TB、PB、EB)

要關(guān)閉容器的內(nèi)存交換(默認啟用):

  1. lxc config set my-container limits.memory.swap false 

告訴內(nèi)核首先交換指定容器的內(nèi)存:

  1. lxc config set my-container limits.memory.swap.priority 0 

如果你不想要強制的內(nèi)存限制:

  1. lxc config set my-container limits.memory.enforce soft 

磁盤和塊 I/O

不像 CPU 和內(nèi)存,磁盤和 I/O 限制是直接作用在實際的設(shè)備上的,因此你需要編輯原始設(shè)備或者屏蔽某個具體的設(shè)備。

要設(shè)置磁盤限制(需要 btrfs 或者 ZFS):

  1. lxc config device set my-container root size 20GB 

比如:

  1. stgraber@dakara:~$ lxc exec zerotier -- df -h / 
  2. Filesystem                        Size Used Avail Use% Mounted on 
  3. encrypted/lxd/containers/zerotier 179G 542M  178G   1% / 
  4. stgraber@dakara:~$ lxc config device set zerotier root size 20GB 
  5. stgraber@dakara:~$ lxc exec zerotier -- df -h / 
  6. Filesystem                       Size  Used Avail Use% Mounted on 
  7. encrypted/lxd/containers/zerotier 20G  542M   20G   3% / 

要限制速度,你可以:

  1. lxc config device set my-container root limits.read 30MB 
  2. lxc config device set my-container root.limits.write 10MB 

或者限制 IO 頻率:

  1. lxc config device set my-container root limits.read 20Iops 
  2. lxc config device set my-container root limits.write 10Iops 

***你在一個過量使用的繁忙系統(tǒng)上,你或許想要:

  1. lxc config set my-container limits.disk.priority 10 

將那個容器的 I/O 優(yōu)先級調(diào)到***。

網(wǎng)絡(luò) I/O

只要機制可用,網(wǎng)絡(luò) I/O 基本等同于塊 I/O。

比如:

  1. stgraber@dakara:~$ lxc exec zerotier -- wget http://speedtest.newark.linode.com/100MB-newark.bin -O /dev/null 
  2. --2016-03-26 22:17:34-- http://speedtest.newark.linode.com/100MB-newark.bin 
  3. Resolving speedtest.newark.linode.com (speedtest.newark.linode.com)... 50.116.57.237, 2600:3c03::4b 
  4. Connecting to speedtest.newark.linode.com (speedtest.newark.linode.com)|50.116.57.237|:80... connected. 
  5. HTTP request sent, awaiting response... 200 OK 
  6. Length: 104857600 (100M) [application/octet-stream] 
  7. Saving to'/dev/null' 
  8. /dev/null 100%[===================>] 100.00M 58.7MB/s in 1.7s  
  9. 2016-03-26 22:17:36 (58.7 MB/s) - '/dev/null' saved [104857600/104857600] 
  10. stgraber@dakara:~$ lxc profile device set default eth0 limits.ingress 100Mbit 
  11. stgraber@dakara:~$ lxc profile device set default eth0 limits.egress 100Mbit 
  12. stgraber@dakara:~$ lxc exec zerotier -- wget http://speedtest.newark.linode.com/100MB-newark.bin -O /dev/null 
  13. --2016-03-26 22:17:47-- http://speedtest.newark.linode.com/100MB-newark.bin 
  14. Resolving speedtest.newark.linode.com (speedtest.newark.linode.com)... 50.116.57.237, 2600:3c03::4b 
  15. Connecting to speedtest.newark.linode.com (speedtest.newark.linode.com)|50.116.57.237|:80... connected. 
  16. HTTP request sent, awaiting response... 200 OK 
  17. Length: 104857600 (100M) [application/octet-stream] 
  18. Saving to'/dev/null' 
  19. /dev/null 100%[===================>] 100.00M 11.4MB/s in 8.8s  
  20. 2016-03-26 22:17:56 (11.4 MB/s) - '/dev/null' saved [104857600/104857600] 

這就是如何將一個千兆網(wǎng)的連接速度限制到僅僅 100Mbit/s 的!

和塊 I/O 一樣,你可以設(shè)置一個總體的網(wǎng)絡(luò)優(yōu)先級:

  1. lxc config set my-container limits.network.priority 5 

獲取當前資源使用率

LXD API 可以導(dǎo)出目前容器資源使用情況的一點信息,你可以得到:

  • 內(nèi)存:當前、峰值、目前內(nèi)存交換和峰值內(nèi)存交換
  • 磁盤:當前磁盤使用率
  • 網(wǎng)絡(luò):每個接口傳輸?shù)淖止?jié)和包數(shù)。

另外如果你使用的是非常新的 LXD(在寫這篇文章時的 git 版本),你還可以在lxc info中得到這些信息:

  1. stgraber@dakara:~$ lxc info zerotier 
  2. Name: zerotier 
  3. Architecture: x86_64 
  4. Created: 2016/02/20 20:01 UTC 
  5. Status: Running 
  6. Type: persistent 
  7. Profiles: default 
  8. Pid: 29258 
  9. Ips: 
  10.  eth0: inet 172.17.0.101 
  11.  eth0: inet6 2607:f2c0:f00f:2700:216:3eff:feec:65a8 
  12.  eth0: inet6 fe80::216:3eff:feec:65a8 
  13.  lo: inet 127.0.0.1 
  14.  lo: inet6 ::1 
  15.  lxcbr0: inet 10.0.3.1 
  16.  lxcbr0: inet6 fe80::f0bd:55ff:feee:97a2 
  17.  zt0: inet 29.17.181.59 
  18.  zt0: inet6 fd80:56c2:e21c:0:199:9379:e711:b3e1 
  19.  zt0: inet6 fe80::79:e7ff:fe0d:5123 
  20. Resources: 
  21.  Processes: 33 
  22.  Disk usage: 
  23.   root: 808.07MB 
  24.  Memory usage: 
  25.   Memory (current): 106.79MB 
  26.   Memory (peak): 195.51MB 
  27.   Swap (current): 124.00kB 
  28.   Swap (peak): 124.00kB 
  29.  Network usage: 
  30.   lxcbr0: 
  31.    Bytes received: 0 bytes 
  32.    Bytes sent: 570 bytes 
  33.    Packets received: 0 
  34.    Packets sent: 0 
  35.   zt0: 
  36.    Bytes received: 1.10MB 
  37.    Bytes sent: 806 bytes 
  38.    Packets received: 10957 
  39.    Packets sent: 10957 
  40.   eth0: 
  41.    Bytes received: 99.35MB 
  42.    Bytes sent: 5.88MB 
  43.    Packets received: 64481 
  44.    Packets sent: 64481 
  45.   lo: 
  46.    Bytes received: 9.57kB 
  47.    Bytes sent: 9.57kB 
  48.    Packets received: 81 
  49.    Packets sent: 81 
  50. Snapshots: 
  51.  zerotier/blah (taken at 2016/03/08 23:55 UTC) (stateless) 

總結(jié)

LXD 團隊花費了幾個月的時間來迭代我們使用的這些限制的語言。 它是為了在保持強大和功能明確的基礎(chǔ)上同時保持簡單。

實時地應(yīng)用這些限制和通過配置文件繼承,使其成為一種非常強大的工具,可以在不影響正在運行的服務(wù)的情況下實時管理服務(wù)器上的負載。

更多信息

LXD 的主站在: https://linuxcontainers.org/lxd

LXD 的 GitHub 倉庫: https://github.com/lxc/lxd

LXD 的郵件列表: https://lists.linuxcontainers.org

LXD 的 IRC 頻道: #lxcontainers on irc.freenode.net

如果你不想在你的機器上安裝LXD,你可以在線嘗試下。

責任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2016-07-29 14:12:21

2017-03-06 14:00:22

LXD 2.0LXDLinux

2017-03-08 18:00:10

LXD 2.0LinuxOpenStack

2017-03-08 10:40:14

LXD 2.0JujuLinux

2017-02-27 19:27:52

LXDDockerLinux

2017-01-12 15:37:34

LinuxLXD 2.0鏡像管理

2017-03-07 16:41:03

LXD 2.0Linux實時遷移

2017-03-09 16:32:03

LXD 2.0Linux調(diào)試

2016-08-22 21:41:37

LXDLinux容器管理器

2016-08-24 15:12:41

LXDLinux容器

2017-02-05 14:52:42

2022-08-30 08:43:11

Spring權(quán)限控制

2015-09-24 15:45:21

青云QingCloud

2011-01-20 10:33:30

Postfix

2009-07-27 16:37:42

ASP.NET主機

2022-08-15 08:42:46

權(quán)限控制Spring

2022-08-30 08:36:13

Spring權(quán)限控制

2022-08-30 08:55:49

Spring權(quán)限控制

2022-08-15 08:45:21

Spring權(quán)限控制

2022-08-30 08:50:07

Spring權(quán)限控制
點贊
收藏

51CTO技術(shù)棧公眾號