Inicie um grande número de serviços com o systemd

0

Eu quero começar um grande número (por exemplo, 256) de serviços com o systemd. Felizmente, o systemd oferece fatias que facilitam muito a reutilização da descrição do serviço. Mas iniciar muitos processos de uma só vez mata o sistema, porque todo processo faz alguma computação de inicialização, o que empurra a carga acima de 50.

É possível definir uma cadeia de dependência para todos os serviços com fatias, depois de = service @% (i-1) .service Wants = service @% (i-1) .service? Ou é possível definir algo como um pool de serviços e o systemd gerencia o início dos serviços, ou seja, não executar todos de uma vez, mas iniciar talvez 10 de uma só vez e depois disso o próximo bloco?

    
por jo-so 25.04.2017 / 21:05

2 respostas

1

Eu encontrei uma boa solução usando ExecStartPost .

% systemctl --user cat example@ 
# /home/joerg/.config/systemd/user/[email protected]
[Unit]
Description=Example of service farm; instance %i

[Service]
Type=simple
ExecStart=/bin/sleep 99999
ExecStartPost=/bin/sh -c 'test %i -gt 0 || exit 0 ; systemctl --no-block --user start %p@$((%i - 1))'

% systemctl --user start example@2

% systemctl --user status example.slice
● example.slice
   Loaded: loaded
   Active: active since Thu 2017-04-27 11:04:43 CEST; 27min ago
   CGroup: /user.slice/user-1000.slice/[email protected]/example.slice
           ├─[email protected]
           │ └─19423 /bin/sleep 99999
           ├─[email protected]
           │ └─19420 /bin/sleep 99999
           └─[email protected]
             └─19417 /bin/sleep 99999
    
por 27.04.2017 / 11:52
0

Não, o systemd não suporta uma sintaxe como Wants=service@%(i-1).service? .

No entanto, você pode escrever um script simples que grava 256 arquivos de unidade systemd similares que contêm uma cadeia de dependência explícita. Aqui estão alguns outros padrões a serem considerados:

  1. systemd permite que você defina parâmetros de controle de recursos em tempo de execução, com sintaxe como:

    systemctl --runtime conjunto-propriedade foobar.service CPUShares = 777

Assim, você pode acelerar suas unidades durante a inicialização, para que cada uma use menos CPU. Depois que as coisas se acalmarem, permita que elas usem mais CPU. Isso parece mais difícil do que precisa ser, o que me leva à próxima opção ...

  1. Em man systemd.resource-control , você verá que existe uma opção StartupCPUShares= que é diferente da opção CPUShares= . Eu iria experimentar com a aceleração da CPU com StartupCPUShares= para ver se produz o resultado desejado.

Pessoalmente, usei uma rota de baixa tecnologia para resolver um problema como este. Eu comecei minha série de serviços um de cada vez, com um "sono" entre o início do serviço. Isso usou um pequeno script bash em vez de system , mas funcionou bem o suficiente. Felizmente, eu também não tenho a obrigação de colocar todos os serviços on-line o mais rápido possível.

A próxima iteração do sistema eu provavelmente vou projetar em torno de systemd e gostaria de tentar usar StartupCPUShares= para ver se é uma maneira melhor de resolver o problema.

    
por 25.04.2017 / 21:47

Tags