SystemD를 사용하여 Solr 실행 : 구성된 제한 사항과 다른 런타임에 적용되는 사용자 제한 사항 (ulimit)


2

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"사용자로 직접 solr을 실행하면 (SystemD는 사용하지 않음) 작동합니다.

Solr 서버를 직접 실행할 때 런타임에 적용된 사용자 제한이 SystemD에서 실행할 때 사용한 것과 다른 이유는 무엇입니까 ???


"내가 구성한 것과는 다릅니다"– 어, 어디에서 구성 했습니까? 당신은 이것에 대해 전혀 언급하지 않았습니다.
grawity

@grawity 잘 나는 "solr"사용자로 로그인 한 ulimit -u를 실행할 때 볼 수있는 것을 의미했다. 이것들은 "I configured"(마지막 콘솔 스 니펫 참조)입니다. 콘솔에 "무제한"이 표시됩니다. 다른 랜드에서 SystemD를 사용하여 Solr 서버를 실행할 때 65000 이하임을 알리는 경고가 표시됩니다. 질문을 편집 한 경우 여전히 확실하지 않은 경우 알려주십시오.
otonglet

답변:


3

서비스에 대한 제한을 구성하는 올바른 방법은 .service단위 파일 자체 에서 수행하는 것입니다. 매개 변수를 사용하십시오 LimitNOFILE=.

[Service]
LimitNOFILE=infinity
LimitNPROC=infinity

"사용자 계정"은 Linux에서 다소 모호한 개념입니다. 완전한 대화식 로그인 프로세스는 환경 변수 설정, PAM 세션 열기, UID / GID 변경, 로그인 모드에서 쉘 시작 및 / etc / profile 실행 등 여러 독립적 인 단계로 구성됩니다.

이러한 단계의 대부분은 서비스에 적용되지 않습니다. 서비스 시작은 Linux에서 "로그인"을 구성하지 않으므로 PAM이 호출 되지 않습니다 . 서비스 구성 (systemd 또는 데몬 자체 구성에서)에 User = 매개 변수를 지정하면 한 가지만 수행합니다. UID / GID를 지정한 값으로 변경하십시오.

/etc/security/limits.conf, PAM이 필요하기 때문에 제한 이 적용되지 않으며 명령 /etc/profile이 실행되지 않습니다 (쉘이 필요함).


어떤 제한이 적용되는지 디버깅하기 위해가 /proc/<pid>/limits있습니다.
Harald
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.