ti-enxame.com

Existe uma maneira de limitar a quantidade de memória que um processo específico pode usar no Unix?

Eu preciso testar um processo para gerenciamento de memória.

  • Como não tenho a fonte, preciso fazer todos os testes no lado do SO.
  • Eu quero poder dizer algo como limitmemory 400k -p <pid>

Existe uma maneira de fazer isso no unix? Qualquer utilitário unix comum seria excelente.

38
Lazer

ulimit -v, é um shell incorporado, mas deve fazer o que você deseja.

Eu uso isso nos scripts init às vezes:

ulimit -v 128k
command
ulimit -v unlimited

Parece, no entanto, que você deseja maneiras de manipular a memória alocável máxima enquanto o programa está em execução, está correto? Provavelmente algo como renice para manipular a Prioridade.

No entanto, não existe tal ferramenta para o meu conhecimento.

27
polemon

Para definir o limite ao iniciar o programa, use ulimit -v 400, como indicado por polemon . Isso define o limite para o Shell e todos os seus descendentes; portanto, em um script, você pode usar algo como (ulimit -v 400; myprogram) para limitar o escopo.

Se você precisar alterar o limite para um processo em execução, não há utilidade para isso. Você precisa obter o processo para executar a chamada do sistema setrlimit. Isso geralmente pode ser feito com um depurador, embora nem sempre funcione de maneira confiável. Veja como você pode fazer isso com o gdb (não testado; 9 é o valor de RLIMIT_AS no Linux):

gdb -n -pid $pid -batch -x /dev/stdin <<EOF
call setrlimit(9, {409600, -1})
detach
quit
EOF
12

Não tenho muita certeza disso, mas você também pode usar cgroups para limitar o so de memória . A vantagem do cgroups é que você pode controlar os processos que já estão em execução. A propósito, systemd usará o cgroups para controlar os serviços do sistema.

Infelizmente, experimentei um pouco e eles não parecem funcionar muito bem no meu sistema Fedora 13.

11
Cristian Ciupitu

Nos sistemas Linux com kernel> = 2.6.36 e util-linux> = 2.21, você pode usar o comando prlimit para definir os limites de recursos de um processo:

prlimit --rss=400000 --pid <pid>
9
Luca Gibelli

Se você estiver usando o systemd, poderá definir algumas opções adicionais em um .service Arquivo. A lista completa das opções que você pode definir é descrita aqui .

Abaixo está um pequeno exemplo que mostra como usar esse recurso do systemd:

# cat /etc/systemd/system/qbittorrent-nox.service
[Unit]
Description=qbittorrent-nox
Documentation=man:qbittorrent-nox
DefaultDependencies=yes
Requires=media-Kabi.mount
After=media-Kabi.mount network-online.target
Before=multi-user.target
Conflicts=umount.target

[Service]
User=morfik
Group=p2p
Type= simple
RemainAfterExit=no
ExecStart=/usr/bin/qbittorrent-nox
Nice=19
IOSchedulingClass=idle
PrivateNetwork=no
CPUShares=256
MemoryLimit=50M
BlockIOWeight=128
Slice=p2p.slice
StandardError=null
StandardOutput=null

[Install]
WantedBy=multi-user.target

Claro, você não precisa de todas as opções que usei. Se você deseja limitar o uso da memória, adicione MemoryLimit=50M, que limita a 50MiB.

E este é o resultado:

# systemctl status qbittorrent-nox.service
● qbittorrent-nox.service - qbittorrent-nox
   Loaded: loaded (/etc/systemd/system/qbittorrent-nox.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2015-05-07 19:25:20 CEST; 1s ago
     Docs: man:qbittorrent-nox
 Main PID: 21712 (qbittorrent-nox)
   Memory: 9.4M (limit: 50.0M)
   CGroup: /p2p.slice/qbittorrent-nox.service
           └─21712 /usr/bin/qbittorrent-nox

May 07 19:25:20 morfikownia systemd[1]: Started qbittorrent-nox.
May 07 19:25:20 morfikownia systemd[1]: Starting qbittorrent-nox...

Até agora, isso funciona apenas para daemons/serviços do sistema, e você não pode limitar, por exemplo, um firefox processa como um usuário comum dessa maneira. Mas talvez isso vai mudar um dia .

3
Mikhail Morfikov

Existe a função setrlimit () , que permite configurar os limites de um processo em C. Escreva um programa C para chamar setrlimit e depois executar o comando que você deseja limitar. O setrlimit não pode alterar os limites de outros processos.

Felizmente, alguém já escreveu algo semelhante. Pode ser baixado em freshmeat . Eu dei uma olhada rápida no código fonte e parece estar bem. Use o rlimit a seu próprio critério. Observe que o rlimit também não pode alterar os limites de outros processos.

Edit: Gilles propôs um hack agradável com o gdb: Anexe ao processo com o gdb e faça o processo chamar setrlimit. Talvez isso resolvesse o problema para limitar um processo já em execução.

1
nalply

Se você quiser apenas testar e medir o uso de memória do seu programa, consulte time . Você pode medir o uso de recursos do seu programa em muitos aspectos, incluindo os termos de Tempo de CPU e uso de memória. O comando a seguir fornecerá o uso da memória e o tempo de CPU de myProgram:

/usr/bin/time myProgram

(Certifique-se de fornecer o caminho absoluto para distingui-lo do comando de tempo interno do bash.)

Se você apenas deseja limitar os recursos do seu processo, recomendo que você crie um usuário de teste para esta tarefa específica. Limite os recursos desse usuário de acordo com suas necessidades e execute o processo pelo usuário. Parece que, no mundo * nix, o gerenciamento de recursos baseado em usuários é muito mais avançado do que o gerenciamento de recursos baseado em processos.

Você pode checar /etc/security/limits.conf para limitar os recursos de um usuário. Ou você pode usar ulimit depois de fazer login com o usuário a ser limitado.

0
memin