使用 SystemD 运行 Solr:运行时应用的用户限制(ulimit)与配置的限制不同

使用 SystemD 运行 Solr:运行时应用的用户限制(ulimit)与配置的限制不同

我正在尝试将 solr 作为 SystemD 服务运行。当我启动该服务时,我收到此警告,然后 solr 服务器停止。

jun 22 16:20:07 solr_start[1488]: *** [WARN] ***  Your Max Processes Limit is currently 14972.
jun 22 16:20:07 solr_start[1488]: It should be set to 65000 to avoid operational disruption.
jun 22 16:20:07 solr_start[1488]: If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh
jun 22 16:20:09 solr_start[1488]: Warning: Available entropy is low. As a result, use of the UUIDField, SSL, or any other features that require
jun 22 16:20:09 solr_start[1488]: RNG might not work properly. To check for the amount of available entropy, use 'cat /proc/sys/kernel/random/entropy_avail'.
jun 22 16:20:14 solr_start[1488]: [146B blob data]
jun 22 16:20:14 solr_start[1488]: Started Solr server on port 8983 (pid=1579). Happy searching!
jun 22 16:20:15 solr_stop[1680]: Sending stop command to Solr running on port 8983 ... waiting up to 180 seconds to allow Jetty process 1579 to stop gracefully.

我检查了代码https://github.com/apache/lucene-solr/blob/master/solr/bin/solr#L1509。我可以看到 solr 对 ulimit -u 和 ulimit -n 运行检查。

奇怪的是,我确保 SystemD 将以“solr”用户运行 solr 服务器。

[Unit]
Description=Apache SOLR
After=syslog.target network.target remote-fs.target nss-lookup.target systemd-journald-dev-log.socket
Before=multi-user.target
[Service]
User=solr
#PIDFile=/mnt/solrdata/solr-8983.pid
Environment=SOLR_INCLUDE=/opt/solr/bin/solr.in.sh
ExecStart=/opt/solr/bin/solr_start
ExecStop=/opt/solr/bin/solr_stop
#Restart=on-failure
[Install]
WantedBy=multi-user.target​

并且这个“solr”用户(我专门配置来运行Solr服务器)可以创建无限数量的进程并打开无限数量的文件。

[solr@xxx ~]# ulimit -n
unlimited
[root@xxx ~]# ulimit -u
unlimited

当 SystemD 启动 solr 时,我看到它使用了正确的用户(我配置的“solr”用户)。但我看到了上述错误。

当我直接使用“solr”用户(不使用 SystemD)运行 solr 时,它可以工作。

为什么我自己运行 Solr 服务器时运行时应用的用户限制与 SystemD 运行时使用的用户限制不同???

答案1

配置服务限制的正确方法是在.service单元文件本身内进行配置。使用参数LimitNOFILE=和类似的。

[Service]
LimitNOFILE=infinity
LimitNPROC=infinity

“用户帐户”在 Linux 中是一个有些模糊的概念。完整的交互式登录过程由几个独立的步骤组成 - 设置环境变量、打开 PAM 会话、更改 UID/GID、以登录模式启动 shell 并让其运行 /etc/profile...

其中大部分步骤不适用于服务。在 Linux 中,启动服务并不构成“登录”,因此例如 PAM 是不是调用。当您在服务配置中指定 User= 参数时(无论是在 systemd 中,还是在守护进程自己的配置中),它只会做一件事:将 UID/GID 更改为您指定的 UID/GID。

这意味着/etc/security/limits.conf不会应用任何限制(因为这需要 PAM),并且/etc/profile不会运行任何命令(这需要 shell)。

相关内容