Eu executo um servidor de teste para um software que depende do uso massivo de mqueues (Filas de mensagens POSIX). Eu aumentei os limites para um nível razoável e consegui trabalhar há muito tempo. No entanto, o número de testes (e suas linhas de trabalho) continua aumentando e os testes estão começando a falhar na criação de novas linhas, embora os limites não pareçam estar esgotados.
$ sudo mount -t mqueue none /mnt
$ cat /proc/sys/fs/mqueue/queues_max # maximum mqueue count
65535
$ ls -1 /mnt | wc -l # current mqueue count
8445
$ ulimit -q # maximum bytes in mqueues
819200
$ du -s /mnt # current mqueues size
0 /mnt
Após uma falha na chamada para mq_open()
, errno
está definido como 24 que significa (de acordo com /usr/include/asm-generic/errno-base.h
):
#define EMFILE 24 /* Too many open files */
Portanto, verifiquei o limite de arquivos abertos, mas parece que não está esgotado também.
$ ulimit -n # file descriptors limit
1024
$ lsof -u $(whoami) | wc -l # currently open files
306
Estas verificações estão corretas? Há algo mais que eu deveria verificar?
Analisei Como verificar o uso de ulimit , mas as verificações de uso parecem ser específicos de limites e linhas particulares não são mencionados aqui.
Como o comportamento de "mqueues" foi alterado ao longo do tempo devido a bugs minha versão do kernel é 4.1.13-rt15+
.
Eu mesmo construí o kernel usando o patch em tempo real apropriado sem mais modificações. Eu não mudei o kernel recentemente (quando o problema começou a aparecer).