How would you set a ulimit on a systemd service unit?
This stackoverflow question explains that systemd ignores system ulimits
What would the syntax look like to set the following ulimits?
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
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
The mappings of systemd limits to 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
If a ulimit is set to ‘unlimited’ set it to ‘infinity’ in the systemd config
ulimit -c unlimited is the same as LimitCORE=infinity
ulimit -v unlimited is the same as LimitAS=infinity
ulimit -m unlimited is the same as LimitRSS=infinity
So a final config would look like
[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
In this particular case, I don’t know the full java path (since it changes based on server type), and systemd isn’t happy about relative paths, I wrap the java command in a simple bash script located at /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
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0