Ver Feed RSS

minelli

Linux Debian - Comando Ulimit

Avaliação: 3 votos, 5,00 média.
Boa tarde, ao ver que muitos usuários não conhecem o comando ULIMIT vou disponibilizar aqui alguns comentários sobre o mesmo e também como fixar esses dados para que ao iniciar o linux não perca os dados alterados.

Comando Ulimit - Linux Debian

Este texto explica como impôr limites aos utilizadores a nivel de numero de processos em execuçao,
quotas de memoria, quotas de espaço em stack, numero de arquivos abertos, etc. Isto pode ser útil para evitar que o utilizador médio possa crashar o sistema, se bem que estes limites são impostos pela shell que o utilizador está utilizando, e não pelo sistema e portanto o que o tornaria instransponivel.
Eu nunca tinha estudado sobre o assunto, até que meu linux começar apresentar alguns problemas ao rodar o Thunder Cache.
Lendo alguns post´s eu percebi que poderia ser referente a limitações de números de processos e de memória que cada usuario (root, proxy, etc...) podia criar com o ulimit, dependia do shell e não do kernel o que faz com que estas limitações sejam ultrapassadas trocando de shell, lendo sobre ulimits, também descobri que o usuario não pode trocar de shell ultrapassando estes limites sem alterar a sua shell de login, porque mesmo correndo uma nova shell, os limites aplicam-se porque a nova shell é um processo child daquela que impõe os limites, herdando tudo do parent, com exceção do pid. Portando para ultrapassar estes limites o utilizador (usuario) com muitas necessidades em termos de recursos do sistema, tinha de programar uma shell para ele, e coloca-la como a sua shell default, porque o administrador pode aplicar os limites a todas as shell's disponiveis no sistema. Portanto eu cheguei a conclusão que os limites podem ser aplicados e não são fáceis de transpôr.

1.1- Como funcionam os limites

Acima já está uma pequena introdução sobre o funcionamento dos ulimits, mas há muito pra dizer
sobre os ulimit's, por isso o texto não acaba aqui.

O comando ulimit é um built-in command da shell tal como o cd, isto tem que ser assim porque sempre que a shell chama outro programa, como por exemplo o ls, faz um fork e depois um exec, isto porque quando é feito um exec o mapa de memória do processo invocante é substituido pelo mapa de memória do novo processo, o que fazia com que que o novo processo retornasse a shell, porque deixava de existir no momento em que o novo programa começava a existir, o fork o que faz é fazer uma copia exata do mapa de memória do processo invocante (a isto chama-se um child process) e agora este novo mapa de memoria é esmagado com o novo mapa de memoria do novo programa.
Se o cd fosse um comando externo a shell, o que acontecia era que as alterações feitas pelo cd seriam perdidas assim que o processo retornasse, porque as alterações feitas pela child nao afetam o parent. Isto foi uma noção do que é um comando interno (built-in) da shell, isto mostra como é possivel contornar os ulimit's, porque uma vez que é um comando interno da shell só é aplicavel
na propria shell, e se trocarmos de shell, para uma shell que não tenha os ulimits activos pode-se criar e alterar os processos que quisermos.

1.2- Os limites disponiveis

Os limites que podem ser aplicados a cada utlizador (usuario) são os seguintes:

- tamanho de arquivos core
- tamanho do segmento de stack
- tamanho do segmento de dados
- memoria alocavel
- numero máximo de processos
- tamanho de arquivos
- tamanho maximo dos pipes
- numero de filedescriptors (arquivos abertos)
- tempo de utilizacão de cpu
- tamanho maximo de memoria virtual

Eu agora vou explicar tentar explicar as opções a cima.

Core - com esta opçao pode-se definir o tamanho máximo de um arquivo core, e um arquivo core é o
contéudo de memória de um processo que é escrito para um arquivo quando este crasha por alguma razao.

Stack - é o espaço maximo que um utilizador pode ocupar na stack, ou pilha de dados. Para quem não sabe a stack é utilizada para passar parametros nas chamadas de subrotinas, ou para guardar o estado da maquina em sistemas multi-programadas.

Seg. Dados - É o tamanho máximo que o segmento de dados de processos do utilizador (usuário) pode ocupar. Só a titulo de curiosidade um processo tem um mapa de memoria, e este divide-se em zonas, e uma delas é o segmento de dados.

Memoria - É o tamanho máximo de memória que o utilizador (usuário) pode utilizar.

Processos - É o numero maximo de processos que o utilizador (usuário) pode ter, isto é, o numero maximo de programas em execução que o utilizador pode ter, processos child da shell, porque no caso do X-Windows, este numero não tem limite.

Tamanho de Arquivos - É o tamanho maximo que um ficheiro pode ter, claro que isto também é limitado ao espaço livre no sistema de arquivos...

Tamanho Pipes - É o tamanho maximo que um pipe pode ter. Pipe é um mecanismo de
comunicaçao entre processos da mesma familia.

Número Filedescriptor - É o numero maximo de filedescriptors que podem estar abertos.
Filedescriptor é uma ligação entre um processo e um arquivo em disco. De uma forma mais simples
esta opção permite impor um numero máximo de ficheiros abertos.

Tempo de CPU - É o tempo maximo que utilizador (usuario) tem para utilizar o CPU, tempo a partir do qual não pode utilizar mais o processador.

Tamanho Memória Virtual - É o tamanho maximo de memoria virtual que o utilizador (usuário) pode utilizar.

1.3- Como estabelecer ulimits nas varias shell's

A forma de estabelecer os limites para cada utilizador (usuário) depende da shell na qual queremos colocar os limites.

SH

A shell sh e as suas derivadas, incluido a bash, vão buscar os parametros para ulimits no /etc/profile, porque é este arquivo que contêm as variaveis de controle do utilizador (usuário), tal como algumas "enviroment variables", e outros aspectos, este arquivo funciona mais ou menos como um programa que é executado em cada vez que um utilizador (uauário) faz login no sistema. Neste arquivo em todas as distros que eu conheço, já existe uma linha
com o comando ulimit, pelo menos em todos as diferentes distros e versões das mesmas que eu conheço, mas também se não estiver, faremos. As outras shell's sao mais ou menos a mesma coisa, por isso eu só vou explicar aquilo que é diferente.

As opções do ulimit para as shell's sh e suas derivadas são as seguintes:

-c : Core file em blocos de 512 bytes
-d : Segmento de dados em Kbytes
-f : tamanho maximo de cada ficheiro em blocos de 512 bytes
-n : numero maximo de filedescriptor + 1
-s : Stack em Kbytes
-t : tempo de CPU em segundos
-v : tamanho maximo de memoria virtual em Kbytes. ?
-m : tamanho maximo de memoria
-u : numero maximo de processos
-p : tamanho para pipes em blocos de 512
-S : Impoe o soft limit
-H : Impoe o hard limit
-a : mostra os limits correntemente aplicados

O tamanho disponivel para pipes não deve ser possivel de mudar, eu pelo menos eu não consegui.

Vou so dar um exemplo de uma configuração, ulimit nas shells derivadas da sh. "ulimit -c 100000 -m 2000 -u 128" Eu acho que estes limites não deixam crashar um sistema e possibilitam o utilizador normal de trabalhar sem se deparar com problemas, caso exista algum que necessite de quotas maiores, é só solicitar ao administrador.

Antes que me esqueça, este comando está no /etc/profile, como já tinha dito antes, se não tiver uma linha com o ulimit no seu /etc/profile, coloque-a de acordo com sua necessidade.

CSH

Esta é a cshell, para quem não sabe. Os limits nesta shell são impostos utilizando o comando limit, em vez de ulimit. Para definir estes limites usa-se o arquivo /etc/csh.login.
Aqui as coisas passam-se de forma muito similar, no que diz respeito ao funcionamento do ulimit, mas existem contudo algumas diferenças. O funcionamento deste comando na cshell é bem mais fixo que nas outras todas. Escrevendo limit, são mostrados os limites correntemente aplicados, para
alterar estes limites escreve-se "limit coredumpsize 10", isto altera o limite do core para 10 kb, as opções são mais directas. As opções disponiveis são as seguintes:

- cputime
- filesize
- datasize
- stacksize
- coredumpsize
- memoryuse
- descriptors
- memorylocked
- maxproc (processos)
- openfiles


Para remover alguma das limitações faz-se "unlimit <limitacao>", por exemplo "unlimit coredumpsize".
Um exemplo, só para completar...

-------
limit coredumpsize 10000
limit memorylocked 2000
limit maxproc 128

-------

Isto tem que ser em várias linhas, se eu meter tudo num comando o comando retornará erro.


KSH

Esta é a korn shell, pelo que eu consegui descodificar, a korn shell vai buscar as suas enviroment
variables, no /etc/profile, tal como as sh's, mas é necessário ter muito cuidado com isto, porque os
parametros do ulimit diferem das sh's para a ksh, isto é um problema que pode ser chato ou não, dependendo se todos os utilizadores (usuários) do sistema usam a mesma shell ou não, no caso em que tem utilizadores (usuários) a usar tanto sh's como ksh, arrumem uma configuraçao de ulimit que dê para as duas shell, coloquem todos os utilizadores para usar a mesma shell (ou sh's ou ksh, porque a cshell nao dá conflitos), ou então usem uma configuração de ulimit que dê erro na kshell e que não dê erro na sh, e outra que dê erro na sh e que não dê erro na ksh, para que possam aplicar limites às duas, porque a que dá erro é ignorada sendo aplicada a que não dá erro, mas é a unica que eu me lembrei, devido ao meu pequeno grau de conhecimentos da korn shell. Quem tiver uma melhor solução para este problema agradecia que mandasse um email.
A opção que limita os processos por cada utilizador é "p" em vez de "u" como nas sh's. Acho que não há mais nada a dizer a não ser que não se pode colocar tudo numa linha, tem que se fazer um comando por linha:

-----------------
ulimit -c 100000
ulimit -m 2000
ulimit -p 128

-----------------

NOTA
====

Atencão que estes limites aplicam-se a todos os utilizadores (usuários) do sistema incluindo o root, a solução para não obrigar o root a cumprir estes limites, é utilizar o arquivo de configuraçao do root, o .bash_profile, .bash_login ou .profile. No caso da cshell deve ser o .csh.login ou alguma assim do género.


1.4- Fim

Isso é tudo, se quiserem mandar reclamações, críticas, sugestões, mandem-nas para
[email protected]
Espero que ajude a todos compreender como funciona o ULIMIT.

Atualizado 15-05-2010 em 08:57 por minelli

Categorias
Artigos , Linux

Comentários

Página 1 de 3 123 ÚltimoÚltimo
  1. Avatar de stevens144
    usei esse comando no meu thunder e ajudou mto nao travou mais
  2. Avatar de minelli
    Sim Stevens devido ao alto número de processos, é recomendável alterar os valores default.
  3. Avatar de adsumus
    ola, estou muito satisfeito pelas explicacaoes sobre as regras do ulimit, mas depois de varios testes nao consegui acertar onde colocar a linha do ulimit dentro do profile, abaixo segue as linhas existentes na atual configuracao. se alguem puder me ajudar dizendo onde a linha "ulimit -c 100000 -m 2000 -u 128" vai agradeco, quero fazer um teste aqui pra ver se e isso emsmo que ta fazendo o thunder travar as vezes. obrigado.

    dentro do etc/profile esta assim

    # /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
    # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

    if [ "`id -u`" -eq 0 ]; then
    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    else
    PATH="/usr/local/bin:/usr/bin:/bin:/usr/games"
    fi

    if [ "$PS1" ]; then
    if [ "$BASH" ]; then
    PS1='\u@\h:\w\$ '
    else
    if [ "`id -u`" -eq 0 ]; then
    PS1='# '
    else
    PS1='$ '
    fi
    fi
    fi

    export PATH

    umask 022
  4. Avatar de minelli
    Citação Postado originalmente por adsumus
    ola, estou muito satisfeito pelas explicacaoes sobre as regras do ulimit, mas depois de varios testes nao consegui acertar onde colocar a linha do ulimit dentro do profile, abaixo segue as linhas existentes na atual configuracao. se alguem puder me ajudar dizendo onde a linha "ulimit -c 100000 -m 2000 -u 128" vai agradeco, quero fazer um teste aqui pra ver se e isso emsmo que ta fazendo o thunder travar as vezes. obrigado.

    dentro do etc/profile esta assim

    # /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
    # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

    if [ "`id -u`" -eq 0 ]; then
    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    else
    PATH="/usr/local/bin:/usr/bin:/bin:/usr/games"
    fi

    if [ "$PS1" ]; then
    if [ "$BASH" ]; then
    PS1='\u@\h:\w\$ '
    else
    if [ "`id -u`" -eq 0 ]; then
    PS1='# '
    else
    PS1='$ '
    fi
    fi
    fi

    export PATH

    umask 022
    Olá amigo agradeço e fico feliz por ter vindo ler, aprender e ter ajudado-o.
    Você deve colocar da seguinte forma em baixo da ultima linha que no seu caso é a umask 022 então deverá ficar assim:

    Código :
    linhas anteriores do arquivo ....
    umask 022
    ulimit -c 100000
    ulimit -m 2000
    ulimit -u 128
    ulimit -n 8192
    Lembre-se você deve adaptar os valores de acordo com seu servidor.

    Peço que se possivel agradeça o post no Tópico do Lucino por favor.
    Atualizado 27-06-2009 em 02:59 por minelli
  5. Avatar de adsumus
    bom dia, depois de umas modificacoes nas linhas do profile nas regras comecou a dar esse mansagem na hora de reconfigurar, dai voltei as configuracaoes pra ver se podia ser algum comando errado que setei mas continua a dar essa linha depois que reinicio as configuracaoes, alguem sabe me dizer oque pode ser?obrigado

    2009/05/20 09:57:48| ALERT: setresuid: (11) Resource temporarily unavailable
  6. Avatar de adsumus
    quanto ao topico acima, ja solucionei, tinha errado uma letra no comando e ja consegui resolver, obrigado
  7. Avatar de minelli
    Desculpe a demora mas estava viajando, mas se resolveu blz.
  8. Avatar de Josue Guedes
    Grato pelas dicas, muito importante, eu ainda não tinha lido nada sobre o assunto.
  9. Avatar de ThallesSantiago
    Show de Artigo Minelli, alem de ajudar com os travamentos do Thunder, mais promove o usuário a ter a oportunidade de otimizar seu Linux de acordo com sua nescessidade.
    Atualizado 25-06-2009 em 18:44 por ThallesSantiago (colocação de palavra não de forma errada)
  10. Avatar de ThallesSantiago
    Rodrigo, esse codigo quer dizer o q exatamente ulimit -Hsn 16384?

    -H : Impoe o hard limit
    -S : Impoe o soft limit
    -n : numero maximo de filedescriptor + 1 ???

    ou seja, quer dizer q esses 3 itens ganham o valor de 16384?
    Vlw!
Página 1 de 3 123 ÚltimoÚltimo

+ Enviar Comentário