Ambiente:
Estou usando um CentOS-7 como hipervisor para executar vários LXCs em libvirt
. Cada contêiner executa uma instalação mínima do CentOS-7 com FreePBX reduzido (Asterisco, Apache, MySQL + bits).
Sintomas:
São 16 containers rodando sem problemas. Quando eu começo mais um, ele começa, mas depois que o 17º contêiner começa, não consigo fazer systemctl start/restart/stop <anything>
em NENHUM dos contêineres:
[root@test-lxc ~]# systemctl restart dnsmasq
Error: Too many open files
Diagnósticos:
Os seguintes diagnósticos e contagens são feitos enquanto o 17º LXC está em execução e systemctl restart blabla
está falhando:
Posso ssh em qualquer LXC e executar os comandos mais básicos, por exemplo, ls, etc. Suspeito que o limite de alguma forma afete apenas o arquivo systemd
.
Estou tentando entender onde/por que atingi o limite.
[root@lxc-hypervisor]# sysctl fs.file-nr
fs.file-nr = 29616 0 12988463
Isso não foi ajustado, é exatamente o que aconteceu com a instalação padrão. Igual ao valor máximo (último) acima = 12988463 é relatado pelo hypervisor e também dentro de cada LXC. O primeiro valor muito semelhante, pouco abaixo de 30.000, também é relatado em cada LXC.
Quando tento contar os descritores de arquivo em todo o processo dentro de cada LXC, recebo na ordem 400 ~ 500 em cada LXC.
for pid in $( ls /proc/ | grep -E -e "^[0-9][0-9]*\$" ); do
ls -l /proc/${pid}/fd/ 2> /dev/null | wc -l
done
A soma totaliza cerca de 9000 (9k) sem o hipervisor propriamente dito. Quando executo isso no hipervisor, geralmente obtenho valores suspeitosamente próximos de pouco mais de 10.000, por exemplo, 10.005.
Questões:
Q1. De onde o limite é definido ou herdado?
Q2. Por que o limite afeta systemctl start/stop/restart blah
os comandos, mas ainda posso ssh em LXCs, executar comandos como scripts bash com loops que bifurcam muito, embora como root.
Q3. Como ajustar os limites para permitir a execução de mais LXCs. Pelo que entendi, a RAM e outros recursos não são o limite.
Eu li muitos artigos e respostas sobre o assunto dos limites do descritor de arquivo, mas não consigo ver onde meu sistema atinge os limites.
Qualquer outra informação relevante também é bem-vinda.
Acredito que você não esteja atingindo um limite global, mas um limite inotify . Isso seria visto em contêineres executando o systemd porque o systemd usa o recurso inotify para sua contabilidade, mas o host também seria afetado. Os contêineres que não usam systemd (nem inotify ) provavelmente não seriam afetados.
Se apenas contêineres não rootless (ou seja: root no contêiner é o verdadeiro root ) estiverem em uso, o usuário root se tornará o gargalo. Ter vários contêineres usando o mesmo mapeamento de usuário sem raiz também criaria esse gargalo para o usuário raiz desse contêiner (mas não afetaria o host). O padrão é 128, muito pouco para uso de contêineres.
O CentOS7 (ou Rocky9) não inclui nenhuma configuração padrão para isso com o LXC. As distribuições baseadas em Debian incluem este arquivo no host:
/etc/sysctl.d/30-lxc-inotify.conf
:Portanto, você deve fazer o mesmo criando esse arquivo no host. Para efeito imediato (no hospedeiro):