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 2 de 3 PrimeiroPrimeiro 123 ÚltimoÚltimo
  1. Avatar de minelli
    Citação Postado originalmente por 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!
    Bom quanto ao o que exatamente quer dizer acho que a resposta já está nos itens da sua pergunta se traduzir fica mais fácil:
    -H Impõe Limite de Hardware
    -S Impõe Limite de Software
    -n Número Maximo de FileDescriptor +1
    Essa parte parece estar nem explicado, caso precise de mais informações o GOOGLE é uma boa opção foi assim que aprendi a maioria do que sei.
    Eu utilizo o Linux Debian e nele não é possivel executar desta forma, terá de executar um a um.
  2. Avatar de ThallesSantiago
    Foi como imaginei, mais o estranho é que achei um valor meio alto pra tais quisitos.
    vlw pela resposta!
  3. Avatar de minelli
    Citação Postado originalmente por ThallesSantiago
    Foi como imaginei, mais o estranho é que achei um valor meio alto pra tais quisitos.
    vlw pela resposta!
    Estranho ver vc dizer isso sendo que por padrão os valores de Hardware e Software são unlimited traduzindo são configurados por padrão sem limite.
  4. Avatar de int21
    Mato a pau Minelli, vc é o cabra!
  5. Avatar de FernandodeDeus
    Citação Postado originalmente por minelli
    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
    Aqui é o unico lugar a se alterar ou tem que fazer alteraçõe em outros lugares? e como adequar esses parametros com mer servidor? posso tomar essas medidas como padrão e implementar aqui? Como aqui eu tenho apenas 2 GB memoria setei ulimit -m 2000 em ulimit -m 1000. Vou testar.
    Atualizado 29-07-2009 em 08:41 por FernandodeDeus
  6. Avatar de lucianosds
    Muito bom este teu artigo. Parabéns pela didática e por compartilhar este precioso conhecimento.
  7. Avatar de stevens144
    Se vc perceber o comando Ulimit -n 16384 (ou qqlr numero) so vai funcionar enquanto a maquina estiver ligada, se vc reiniciar ele vai voltar ao normal, faça o teste. E nao adianta colocar no rc.local que nao fixa. E agora ein?! rsrsrs.

    **Isso no caso do Ubuntu-Server

    *** não é mto dificil de descobrir como fixar.... rsrs
    Atualizado 29-07-2009 em 16:07 por stevens144
  8. Avatar de minelli
    Citação Postado originalmente por stevens144
    Se vc perceber o comando Ulimit -n 16384 (ou qqlr numero) so vai funcionar enquanto a maquina estiver ligada, se vc reiniciar ele vai voltar ao normal, faça o teste. E nao adianta colocar no rc.local que nao fixa. E agora ein?! rsrsrs.

    **Isso no caso do Ubuntu-Server

    *** não é mto dificil de descobrir como fixar.... rsrs
    Olá amigo,
    No Ubuntu nunca testei mas deve ser a mesma coisa essas alterações para ficarem fixadas devem ser colocadas dentro do arquivo "profile" sendo o caminho /etc/profile .
  9. Avatar de minelli
    Citação Postado originalmente por int21
    Mato a pau Minelli, vc é o cabra!
    Agradeço parceiro, mas ainda estou no inicio da caminhada, rsss.....
  10. Avatar de loganbravo
    Como descubro a melhor customização desses parametros para meu servidor? obrigado
Página 2 de 3 PrimeiroPrimeiro 123 ÚltimoÚltimo

+ Enviar Comentário