Memory

如何找出允許使用多少記憶體 lxc 容器?

  • November 15, 2015

我正在嘗試ansible將 InnoDB 緩衝池大小設置為可用記憶體的某個百分比。但是ansible_memtotal_mbfree報告主機有多少記憶體。如何確定容器內部有多少可用記憶體?容器名稱事先不知道。

UPD我正在執行 debian jessie,並將cgroup_enable=memory參數傳遞給核心。

host
====

# lxc-checkconfig
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.16.0-4-amd64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

# grep cgroup /var/lib/lxc/sta/config
lxc.cgroup.memory.limit_in_bytes = 1000M

# mount | grep memory
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)

# cd /sys/fs/cgroup/memory

# cat memory.limit_in_bytes
18446744073709551615

# cat lxc/sta/memory.limit_in_bytes
1048576000


container
=========

$ cat /proc/self/cgroup
9:perf_event:/lxc/sta
8:blkio:/
7:net_cls,net_prio:/lxc/sta
6:freezer:/lxc/sta
5:devices:/
4:memory:/
3:cpu,cpuacct:/
2:cpuset:/lxc/sta
1:name=systemd:/user.slice/user-0.slice/session-10304.scope/system.slice/ssh.service

# mount | grep memory
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)

# cd /sys/fs/cgroup/memory

# cat memory.limit_in_bytes
18446744073709551615

# cat lxc/sta/memory.limit_in_bytes
1048576000

tl;博士

cat /sys/fs/cgroup/memory$(cat /proc/self/cgroup | grep memory | cut -d: -f3)/memory.limit_in_bytes

或者

cat $(mount | grep cgroup | grep memory | cut -d' ' -f3)$(cat /proc/self/cgroup | grep memory | cut -d: -f3)/memory.limit_in_bytes

如果您的預設容器配置允許來自容器內的主機 cgroup 資訊(基於 lxc.mount.auto 設置),您可以簡單地解析 cgroup 資訊,如下所示

從 /proc/self/cgroup 檢查您的 cgroup 資訊

root@my-firefox:/# grep memory /proc/self/cgroup 
4:memory:/cv/my-firefox

現在根據您的 cgroup 掛載點(可以從 /proc/mounts 中找到),驗證記憶體限製文件內容

root@my-firefox:/# cd /sys/fs/cgroup/memory/cv/my-firefox/
root@my-firefox:/sys/fs/cgroup/memory/cv/my-firefox# cat memory.limit_in_bytes 
268435456

在我上面的例子中,cgroup root 被掛載,/sys/fs/cgroup所以使用該資訊和附加路徑/memory/cv/my-firefox,我可以查詢為容器設置的所有記憶體限制

本例限制為 256M

PS:free & ansible_memtotal_mb 是基於主機的,它們不支持容器。我不知道 ansible,但我認為它會具有類似於 puppet 中的事實,您可以在其中編寫自定義事實來收集此資訊

引用自:https://unix.stackexchange.com/questions/242718