Wie kann ich für verschiedene Instanzen eines systemd-instanziierten Dienstes unterschiedliche Ressourcenlimits angeben?

Wie kann ich für verschiedene Instanzen eines systemd-instanziierten Dienstes unterschiedliche Ressourcenlimits angeben?

Aus Gründen, die über meine Kompetenz hinausgehen, muss ich mehrere Instanzen eines DB-Servers auf einem physischen Host mit einem Bare-Metal-Betriebssystem ausführen. Außerdem muss ich die physische Speichernutzung jeder Instanz begrenzen.

Ich verwende eine Vorlagen-Unit-Datei, um einige Dutzend Instanzen zu starten. Ich verwende sie, EnvironmentFileum für jede Instanz unterschiedliche Umgebungsvariablen und Befehlszeilenargumente anzugeben.

Ich möchte jedoch auch für jede Instanz ein anderes Speicherlimit angeben können. Soweit ich weiß, funktioniert die Umgebungsvariablensubstitution bei Ressourcenlimitoptionen wie nicht MemoryHigh.

Ich dachte, Drop-In-Dateien wären die Antwort, aber ich konnte kein einziges Beispiel für die Verwendung von Drop-In-Dateien mit einem instanziierten Dienst finden. Gibt es eine Möglichkeit, eine Drop-In-Datei für myservice@1, eine andere Drop-In-Datei für myservice@2usw. zu erstellen?

$ cat /etc/systemd/system/[email protected]

[Unit]
Description=Something
After=syslog.target network.target

[Service]
Type=forking    
EnvironmentFile=/etc/myservice/myservice.%i.env
ExecStart=/usr/bin/myservice $OPTIONS_FROM_ENV
MemoryHigh=4G

[Install]
WantedBy=multi-user.target

Antwort1

Ich glaube, ich habe in dieser Antwort gefunden, wonach ich suche:https://serverfault.com/a/879705/62991

Erstellen Sie einfach ein Drop-In-Verzeichnis mit dem Instanznamen und Sie können dort die Einstellungen genauso überschreiben wie für einen nicht instanziierten Dienst.

Im folgenden Beispiel myservicehaben Instanzen von standardmäßig ein Speicherlimit von 4 GiB, aber myservice@1und myservice@2haben ihre eigenen Einstellungen. Funktioniert gut mit systemd 231 unter Fedora 25.

$ cat /etc/systemd/system/[email protected]
[Unit]
Description=Something
After=syslog.target network.target

[Service]
Type=forking    
EnvironmentFile=/etc/myservice/myservice.%i.env
ExecStart=/usr/bin/myservice $OPTIONS_FROM_ENV
MemoryHigh=4G

[Install]
WantedBy=multi-user.target

$ cat /etc/systemd/system/[email protected]/99-memory.conf
[Service]
MemoryHigh=10G

$ cat /etc/systemd/system/[email protected]/99-memory.conf
[Service]
MemoryHigh=20G

verwandte Informationen