184 variáveis de ambiente demais?

4

Estou tentando encontrar a causa de alguma falha no sistema operacional e estou preocupado com as variáveis de ambiente.

O software que me foi entregue coloca uma quantidade incrivelmente alta de variáveis de ambiente no usuário .profile .

Quando digito set | wc , o resultado é 9571 bytes de comprimento! Existem 184 entradas. Para mim, isso parece excessivamente grande, mas não tenho nada explícito para apontar e dizer "isso está errado porque xyz".

Não vejo nada na documentação ulimit que fala sobre o tamanho total da variável do ambiente, mas estou preocupado. Eu não estou preocupado com a utilização geral da memória (há o suficiente para fazer o que eu preciso), mas estou preocupado em ultrapassar alguns limites internos e causar comportamento estranho no sistema operacional (provavelmente não é pertinente à pergunta que estou fazendo, mas o "comportamento estranho" é que as filas de memória compartilhada não estão me devolvendo todos os dados que eu ponho no outro lado. Estou ficando em torno de 5% fora ).

Cada script que é iniciado, cada shell executado e cada binário que é executado obtém uma cópia completa e individual das variáveis de ambiente, e eu acho que o 9k é muito grande. Isso deve ser uma preocupação ou estou preocupado com nada?

Eu estou rodando em um sistema x86 QNX 6.4.1 Neutrino embutido com meio gig de RAM.

    
por kmort 11.04.2014 / 17:30

2 respostas

6

When I type set | wc the result is 9571 bytes long!

Supondo que você tenha esse número correto, ele é de fato pequeno , provavelmente porque você está usando o QNX. Em um sistema desktop normal, é muito maior. Aqui está o que eu recebo no fedora 20:

> set | wc --bytes
133195

133 kB. Eu não contei as entradas como muitas delas são originadas funções ( git parece instalar um monte deles), mas eu skim-los e não parece ser nada desagradável. Alguns kB no máximo são de coisas personalizadas por mim.

I am worried about overrunning some internal limit and causing odd behavior in the OS

Eu duvido muito que isso seja possível porque a falta de verificação de limites indicaria um erro muito significativo na implementação - evitar que alguém apenas escreva uma variável longa para injetar dados na memória deve ter sido uma preocupação básica. Além disso, como você diz, 9kB não é nada inteligente. Eu presumo que essas pesquisas sejam feitas com uma tabela de hash, portanto, o número de entradas não prejudicaria o desempenho.

    
por 11.04.2014 / 20:00
2

set relata não apenas variáveis de ambiente, mas também variáveis de shell e, em algumas shells, funções. Use env | wc -c para obter o tamanho do ambiente.

O tamanho do ambiente é indiretamente limitado pelo tamanho máximo dos argumentos para execve (que consiste no ambiente mais os argumentos da linha de comando). Você pode obter o valor aplicável desse limite com getconf ARG_MAX .

3849 bytes não parecem particularmente altos. POSIX diz que o limite pode ser tão baixo quanto 4096 bytes, mas com 512MB de RAM, seu sistema não é de baixo custo e é provável que seja configurado para permitir muito mais. Em qualquer caso, se esse limite foi atingido, então execve falharia; isso não tem nada a ver com filas de memória compartilhada.

    
por 12.04.2014 / 20:06