Продолжение вот этого поста . Вообще, писать обвязку для Javaписьных приложений — дело изначально неблагодарное. Но в случае с кассандрой меня сильно расстроило, что конфиги одной только Java-машины размазаны по семи разным файлам, где поди ж найди нужный тебе параметр. Поэтому я заморочился и переделал это всё безобразие на "чистый" systemd. Количество конфигов удалось сократить до двух файлов. Чтобы не рвать ленту, уберу под кат. Первый — "/etc/systemd/system/cassandra.service". [Unit] Description=Cassandra After=network.target [Service] RuntimeDirectory=cassandra LogsDirectory=cassandra PIDFile=/run/cassandra/cassandra.pid ExecStartPre=/usr/bin/sh -c 'ENV=/run/cassandra/cas4.env; mkdir -p /run/cassandra; echo date=$(/usr/bin/date +%%s) > $ENV; echo -n cp= >> $ENV; /usr/bin/find /usr/share/cassandra/lib/ /usr/share/cassandra/ -maxdepth 1 -name *.jar -printf %%p: >> $ENV' EnvironmentFile=-/run/cassandra/cas4.env EnvironmentFile=/etc/default/cassandra User=cassandra Group=cassandra Type=simple ExecStart=/usr/bin/numactl --interleave=all /usr/lib/jvm/java-11-openjdk-amd64/bin/j ava $JVM_OPTS ${JVM_ON_OUT_OF_MEMORY_ERROR_OPT} $cassandra_parms -cp ${cp}"/etc/cassandra" -XX:HeapDumpPath=/var/lib/cassandra/java _${date}.hprof -XX:ErrorFile=/var/lib/cassandra/hs_err_$ {date}.log org.apache.cassandra.service.CassandraDa emon StandardOutput=journal StandardError=journal LimitNOFILE=100000 LimitMEMLOCK=infinity LimitNPROC=32768 LimitAS=infinity #Restart =always TimeoutStopSec=180 SuccessExitStatus=143 [Install] WantedBy=multi-user.target Второй — "/etc/default/cassandra". MALLOC_ARENA_MAX=4 LD_PRELOAD=/usr/lib/x86_64-linux-gnu/lib jemalloc.so.2 JVM_OPTS= \ -Djava.rmi.server.hostname=192.168.1.2 \ -Xms2G \ -Xmx2G \ -Dcassandra.libjemalloc=/usr/lib/x86_64-l inux-gnu/libjemalloc.so.2 \ -Djava.library.path=/usr/share/cassandra/l ib/sigar-bin \ -Dcassandra.unsafe_aggressive_sstable_ex piration=true \ -ea \ -da:net.openhft... \ -XX:+UseThreadPriorities \ -XX:+HeapDumpOnOutOfMemoryError \ -Xss256k \ -XX:+AlwaysPreTouch \ -XX:-UseBiasedLocking \ -XX:+UseTLAB \ -XX:+ResizeTLAB \ -XX:+UseNUMA \ -XX:+PerfDisableSharedMem \ -Djava.net.preferIPv4Stack=true \ -Djdk.attach.allowAttachSelf=true \ --add-exports java.base/jdk.internal.misc=ALL-UNNAMED \ --add-exports java.base/jdk.internal.ref=ALL-UNNAMED \ --add-exports java.base/sun.nio.ch=ALL-UNNAMED \ --add-exports java.management.rmi/com.sun.jmx.remote.i nternal.rmi=ALL-UNNAMED \ --add-exports java.rmi/sun.rmi.registry=ALL-UNNAMED \ --add-exports java.rmi/sun.rmi.server=ALL-UNNAMED \ --add-exports java.sql/java.sql=ALL-UNNAMED \ --add-opens java.base/java.lang.module=ALL-UNNAMED \ --add-opens java.base/jdk.internal.loader=ALL-UNNAME D \ --add-opens java.base/jdk.internal.ref=ALL-UNNAMED \ --add-opens java.base/jdk.internal.reflect=ALL-UNNAM ED \ --add-opens java.base/jdk.internal.math=ALL-UNNAMED \ --add-opens java.base/jdk.internal.module=ALL-UNNAME D \ --add-opens java.base/jdk.internal.util.jar=ALL-UNNA MED \ --add-opens jdk.management/com.sun.management.intern al=ALL-UNNAMED \ -Xlog:gc=info,heap*=trace,age*=debug,saf epoint=info,promotion*=trace:file=/var/l og/cassandra/gc.log:time,uptime,pid,tid,l evel:filecount=10,filesize=10485760 \ -Dio.netty.tryReflectionSetAccessible=tr ue \ -XX:CompileCommandFile=/etc/cassandra/ho tspot_compiler \ -javaagent:/usr/share/cassandra/lib/jamm-0.3.2.j ar \ -Dcom.sun.management.jmxremote.authentic ate=true \ -Dcom.sun.management.jmxremote.password.f ile=/etc/cassandra/jmxremote.password \ -Dcom.sun.management.jmxremote.access.fi le=/etc/cassandra/jmxremote.access \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcassandra.jmx.remote.port=7199 \ -Dcom.sun.management.jmxremote.rmi.port=7 199 \ -XX:+UseShenandoahGC \ -XX:+UseStringDeduplication \ -XX:+ClassUnloadingWithConcurrentMark \ -XX:+UnlockExperimentalVMOptions \ -XX:ShenandoahUnloadClassesFrequency=100 # Quotes are mandatory here JVM_ON_OUT_OF_MEMORY_ERROR_OPT="-XX:OnOu tOfMemoryError=kill -9 %p" cassandra_parms= \ -Dlogback.configurationFile=logback.xml \ -Dcassandra.logdir=/var/log/cassandra \ -Dcassandra.storagedir=/var/lib/cassandr a \ -Dcassandra-pidfile=/run/cassandra/cassa ndra.pid Те или иные конкретные настройки Java-машины являются вопросом вкусов, о которых, как известно, спорят. Я их тут больше привёл как концепт, а не как почву для холивара. Вообще, если совсем-совсем по-хорошему, надо было писать для systemd два взаимозависимых unit-а. В одном только генерировать EnvironmentFile, который потом засасывать из другого сервиса и запускать собственно Java-машину. Но мне было лень, поэтому пускай пока будет так. Можете ещё что-нибудь раскритиковать, мне будет приятно. Всем понятных читаемых конфигов.