Bagaimana cara mengatur ulimits pada layanan dengan systemd?

29

Bagaimana Anda menetapkan suatu ulimit pada unit layanan systemd?

Pertanyaan stackoverflow ini menjelaskan bahwa systemd mengabaikan sistem ulimits

Seperti apa sintaksis yang akan mengatur ulimit berikut?

ulimit -c
ulimit -v
ulimit -m

[Unit]
Description=Apache Solr
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
SOLR_INSTALL_DIR=/opt/solr
SOLR_ENV=/etc/default/solr.in.sh
RUNAS=solr

SOLR_PID_DIR="/var/solr"
SOLR_HOME="/opt/solr/server/solr"
LOG4J_PROPS="/var/solr/log4j.properties"
SOLR_LOGS_DIR="/opt/solr/server/logs"
SOLR_PORT="8389"

PIDFile=/var/solr/solr-8389.pid
ExecStart=/opt/solr/bin/solr start
ExecStatus=/opt/solr/bin/solr status
ExecStop=/opt/solr/bin/solr stop
Restart=on-failure
User=solr

SuccessExitStatus=143 0

[Install]
WantedBy=multi-user.target
spuder
sumber
1
Cari "Batasi" di man 5 systemd.exec.
Totor

Jawaban:

58

Pemetaan systemd membatasi untuk ulimit

Directive        ulimit equivalent     Unit
LimitCPU=        ulimit -t             Seconds      
LimitFSIZE=      ulimit -f             Bytes
LimitDATA=       ulimit -d             Bytes
LimitSTACK=      ulimit -s             Bytes
LimitCORE=       ulimit -c             Bytes
LimitRSS=        ulimit -m             Bytes
LimitNOFILE=     ulimit -n             Number of File Descriptors 
LimitAS=         ulimit -v             Bytes
LimitNPROC=      ulimit -u             Number of Processes 
LimitMEMLOCK=    ulimit -l             Bytes
LimitLOCKS=      ulimit -x             Number of Locks 
LimitSIGPENDING= ulimit -i             Number of Queued Signals 
LimitMSGQUEUE=   ulimit -q             Bytes
LimitNICE=       ulimit -e             Nice Level 
LimitRTPRIO=     ulimit -r             Realtime Priority  
LimitRTTIME=     No equivalent

Jika suatu ulimit diatur ke 'tidak terbatas', aturlah ke 'tak terbatas' dalam konfigurasi systemd

ulimit -c unlimitedadalah sama dengan LimitCORE=infinity
ulimit -v unlimitedsama LimitAS=infinity
ulimit -m unlimitedadalah sama denganLimitRSS=infinity

Jadi konfigurasi terakhir akan terlihat seperti

[Unit]
Description=Apache Solr
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
WorkingDirectory=/opt/solr/server
User=solr
Group=solr
LimitAS=infinity
LimitRSS=infinity
LimitCORE=infinity
LimitNOFILE=65536
ExecStart=/opt/solr/bin/solr-foo
Restart=on-failure
SuccessExitStatus=143 0
SyslogIdentifier=solr


[Install]
WantedBy=multi-user.target

Dalam kasus khusus ini, saya tidak tahu path java penuh (karena itu berubah berdasarkan jenis server), dan systemd tidak senang tentang path relatif, saya membungkus perintah java dalam skrip bash sederhana yang terletak di /opt/solr/bin/solr-foo

#!/bin/bash

. /opt/solr/bin/solr.in.sh

# Load $JAVA_HOME from 1 of 2 places where it could be defined
# Last one wins
if [[ -f "/etc/profile.d/jdk.sh" ]]; then
  . /etc/profile.d/jdk.sh
fi

if [[ -f "/etc/profile.d/zing.sh" ]]; then
  . /etc/profile.d/zing.sh
fi

exec ${JAVA_HOME}/bin/java -server \
  -Djetty.port=${SOLR_PORT} \
  ${SOLR_JAVA_MEM} \
  ${GC_TUNE} \
  ${GC_LOG_OPTS} \
  -DzkClientTimeout=${ZK_CLIENT_TIMEOUT} \
  -DzkHost=${ZK_HOST} \
  -DSTOP.PORT=7900 \
  -DSTOP.KEY=foobar \
  -Dhost=${SOLR_HOST} \
  -Duser.timezone=${SOLR_TIMEZONE} \
  -Djetty.home=/opt/solr/server \
  -Dsolr.solr.home=${SOLR_HOME} \
  -Dsolr.install.dir=/opt/solr \
  -Dlog4j.configuration=file:/var/solr/log4j.properties \
  -Xss256k \
  -Dbootstrap_conf=true \
  -Dbootstrap_confdir=/opt/solr/server/solr/configsets/foobar/conf \
  -Dcollection.configName=foobar \
  -jar start.jar --module=http
spuder
sumber
Saya tidak akan menyebut itu "final". Masih membutuhkan semua pengaturan yang berantakan seperti RUNASdan SOLR_ENVbaik diperbaiki atau dihapus. Dan kemudian ada semua kehebohan dalam bin/solrskrip shell yang sama sekali tidak perlu di bawah manajer layanan.
JdeBP
Terima kasih telah menunjukkannya. Saya telah memperbarui jawabannya dengan solusi bersih yang menempatkan semua variabel di 1 lokasi dan tidak menggunakan bin/solrskrip yang kembung .
Spuder
Lihat unix.stackexchange.com/a/320319/5132 untuk mengetahui lebih banyak lagi yang dapat diperbaiki, mulai dengan menggunakan execdalam skrip shell.
JdeBP