Como descobrir quanta memória o contêiner lxc pode consumir?

3

Estou tentando fazer com que ansible defina o tamanho do conjunto de buffers do InnoDB como uma porcentagem da memória disponível. Mas ansible_memtotal_mb e free reportam quanta memória o host possui . Como descubro quanta memória está disponível no container? O nome do contêiner não é conhecido antecipadamente.

UPD Estou executando o debian jessie e o parâmetro cgroup_enable=memory para o kernel.

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
    
por x-yuri 13.11.2015 / 00:00

1 resposta

3

tl; dr

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

ou

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

Se a sua configuração de contêiner padrão permitir informações do cgroup do host de dentro do contêiner (com base na configuração lxc.mount.auto), você poderá simplesmente analisar as informações do cgroup como mostrado abaixo

Verifique suas informações do cgroup em / proc / self / cgroup

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

Agora, com base no seu ponto de montagem do cgroup (pode localizar isso em / proc / mounts), verifique o conteúdo do arquivo de limite de memória

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

No meu caso acima, o cgroup root foi montado em /sys/fs/cgroup , então com essa informação e o caminho de anexação /memory/cv/my-firefox , eu poderia consultar todos os limites de memória definidos para o contêiner

Neste caso, o limite é de 256M

PS: gratuito & ansible_memtotal_mb são baseados em host e não são compatíveis com o contêiner. Eu não estou ciente de ansible, mas eu suponho que teria algo semelhante aos fatos no fantoche, onde você poderia escrever um fato personalizado para coletar essa informação

    
por 13.11.2015 / 03:52