¿Cómo especificar diferentes límites de recursos para diferentes instancias de un servicio instanciado por systemd?

¿Cómo especificar diferentes límites de recursos para diferentes instancias de un servicio instanciado por systemd?

Por razones superiores a mi nivel salarial, necesito ejecutar varias instancias de un servidor de base de datos en un host físico con un sistema operativo básico. También necesito limitar el uso de memoria física de cada instancia.

Estoy usando un archivo de unidad de plantilla para iniciar algunas docenas de instancias. Lo estoy usando EnvironmentFilepara especificar diferentes variables de entorno y argumentos de línea de comando para cada instancia.

Sin embargo, también quiero poder especificar un límite de memoria diferente para cada instancia. AFAICT, la sustitución de variables de entorno no funciona para opciones de límite de recursos como MemoryHigh.

Pensé que los archivos directos serían la respuesta, pero no pude dar un solo ejemplo del uso de archivos directos con un servicio instanciado. ¿Hay alguna forma de crear un archivo desplegable para myservice@1, un archivo desplegable diferente para myservice@2, etc.?

$ 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

Respuesta1

Creo que encontré lo que estaba buscando en esta respuesta:https://serverfault.com/a/879705/62991

Simplemente cree un directorio desplegable con el nombre de la instancia y podrá anular la configuración allí como lo haría con un servicio sin instancias.

En el siguiente ejemplo, las instancias de myservicetienen un límite de memoria de 4 GiB de forma predeterminada, pero myservice@1tienen myservice@2su propia configuración. Funciona bien con systemd 231 en 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

información relacionada