Ultimamente, tive um EAGAIN
erro com algum código assíncrono que me fez dar uma olhada nas ulimit
configurações. Embora eu entenda claramente certos limites, como nofile
, outros ainda são bastante confusos para mim.
É muito fácil encontrar recursos sobre como configurá-los, mas não consegui encontrar nenhum artigo explicando exatamente do que se trata cada configuração e como isso pode afetar o sistema.
Definição retirada /etc/security/limits.conf
não é realmente auto-explicativa:
- core - limits the core file size (KB)
- data - max data size (KB)
- fsize - maximum filesize (KB)
- memlock - max locked-in-memory address space (KB)
- nofile - max number of open files
- rss - max resident set size (KB)
- stack - max stack size (KB)
- cpu - max CPU time (MIN)
- nproc - max number of processes
- as - address space limit (KB)
- maxlogins - max number of logins for this user
- maxsyslogins - max number of logins on the system
- priority - the priority to run user process with
- locks - max number of file locks the user can hold
- sigpending - max number of pending signals
- msgqueue - max memory used by POSIX message queues (bytes)
- nice - max nice priority allowed to raise to values: [-20, 19]
- rtprio - max realtime priority
- chroot - change root to directory (Debian-specific)
Então, eu ficaria feliz se alguém pudesse me esclarecer sobre essas configurações importantes do Linux!
O erro que enfrento é realmente:
{ [Error: spawn mediainfo EAGAIN]
code: 'EAGAIN',
errno: 'EAGAIN',
syscall: 'spawn mediainfo',
path: 'mediainfo',
spawnargs:
[ '--Output=XML',
'/home/buzut/testMedia' ],
cmd: 'mediainfo --Output=XML /home/buzut/testMedia' }
De acordo com a definição em gnu.org :
Uma operação que bloquearia foi tentada em um objeto que tem o modo sem bloqueio selecionado. Tentar a mesma operação novamente bloqueará até que alguma condição externa torne possível ler, escrever ou conectar (qualquer que seja a operação).
Entendo que o EAGAIN
erro se refere a um recurso temporariamente indisponível. Não seria sensato definir todos os parâmetros como unlimited
. Assim, eu entenderia a implicação de quais parâmetros identificar o bloqueio e ajustar - ulimit
configurações, meu código ou ambos - de acordo.
Aqui estão meus limites atuais:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 127698
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 64000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 127698
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Fiz minha lição de casa e (quase) descobri o que cada opção faz. Além disso, observei que há mais opções
/etc/security/limits.conf
do que aparecem comulimit -a
. Portanto, apenas documentei o último aqui. Claro, todos estão convidados a enriquecer esta resposta!tamanho do arquivo principal (blocos, -c)
O tamanho máximo dos arquivos principais criados. O dump principal é um instantâneo do sistema (RAM + chave de contexto + registros do processador).
https://en.wikipedia.org/wiki/Core_dump
tamanho do segmento de dados (kbytes, -d)
O tamanho máximo do segmento de dados de um processo. um segmento de dados é uma parte de um arquivo de objeto ou o espaço de endereço virtual correspondente de um programa que contém variáveis estáticas inicializadas.
https://en.wikipedia.org/wiki/Data_segment
prioridade de agendamento (-e)
A prioridade máxima de escalonamento ("nice") que um processo pode receber.
https://en.wikipedia.org/wiki/Scheduling_%28computing%29
tamanho do arquivo (blocos, -f)
O tamanho máximo dos arquivos gravados pelo shell e seus filhos.
sinais pendentes (-i)
Conjunto de sinais que estão pendentes para entrega ao thread de chamada.
https://unix.stackexchange.com/questions/197600/what-are-pending-signals
memória máxima bloqueada (kbytes, -l)
O tamanho máximo que pode ser bloqueado na memória. O bloqueio de memória garante que a memória esteja sempre na RAM e nunca seja movida para o disco de troca.
https://stackoverflow.com/questions/9818755/why-would-we-need-to-lock-a-processs-address-space-in-ram
tamanho máximo da memória (kbytes, -m)
Quanta memória um processo tem atualmente na memória principal (RAM), em oposição a quanta memória virtual o processo tem no total.
https://en.wikipedia.org/wiki/Resident_set_size
arquivos abertos (-n)
O número máximo de descritores de arquivos abertos. Um descritor de arquivo é um indicador abstrato usado para acessar um arquivo ou outro recurso de entrada/saída, como um canal ou soquete de rede.
https://en.wikipedia.org/wiki/File_descriptor
Descritores de arquivo de lista: http://www.cyberciti.biz/tips/linux-procfs-file-descriptors.html
tamanho do tubo (512 bytes, -p)
Tamanho do buffer interno do tubo. Consulte a seção "capacidade do tubo" em http://man7.org/linux/man-pages/man7/pipe.7.html
Filas de mensagens POSIX (bytes, -q)
O número máximo de bytes em filas de mensagens POSIX. As filas de mensagens POSIX permitem que os processos troquem dados na forma de mensagens.
http://linux.die.net/man/7/mq_overview
Filas de mensagens em geral https://en.wikipedia.org/wiki/Message_queue
prioridade em tempo real (-r)
A prioridade máxima de agendamento em tempo real. Um encadeamento de prioridade em tempo real nunca pode ser interrompido por interrupções do timer e é executado em uma prioridade mais alta do que qualquer outro encadeamento no sistema.
https://stackoverflow.com/questions/1663993/what-is-the-realtime-setting-for-for-process-priority
tamanho da pilha (kbytes, -s)
O tamanho máximo da pilha. O tamanho da pilha é uma região reservada da memória usada para armazenar a localização das chamadas de função para permitir que as instruções de retorno retornem ao local correto.
https://en.wikipedia.org/wiki/Stack-based_memory_allocation
tempo de CPU (segundos, -t)
A quantidade máxima de tempo de CPU em segundos.
https://en.wikipedia.org/wiki/CPU_time
máximo de processos de usuário (-u)
O número máximo de processos que um usuário pode iniciar ou bifurcar.
https://en.wikipedia.org/wiki/Process_%28computing%29
Este comando mostra quantos processos cada usuário está usando atualmente:
ps h -Led -o user | sort | uniq -c | sort -n
memória virtual (kbytes, -v)
A quantidade máxima de memória virtual disponível para o shell. A memória virtual mapeia os endereços de memória usados por um programa, chamados de endereços virtuais, em endereços físicos na memória do computador.
https://en.wikipedia.org/wiki/Virtual_memory
bloqueios de arquivo (-x)
O bloqueio de arquivo é um mecanismo que restringe o acesso a um arquivo de computador, permitindo apenas um usuário ou processo de acesso em um momento específico.
https://en.wikipedia.org/wiki/File_locking
Como você não mencionou qual é o seu problema exato com limitação no Linux, seria difícil corrigi-lo. Você usa
ulimit -a
para verificar todas as suas limitações no sistema operacional. Além disso, você pode alterar todas as limitações que possui (você pode diminuí-las, não aumentá-las, exceto que o root pode fazer qualquer coisa). Tente verificarman ulimit
para descobrir qual opção você precisa alterar.