Apache 및 java/tomcat에 "열린 파일이 너무 많습니다". 프로세스 별 제한을 설정하는 방법은 무엇입니까?

Apache 및 java/tomcat에 "열린 파일이 너무 많습니다". 프로세스 별 제한을 설정하는 방법은 무엇입니까?

이 문제는 현재 노드 서버(소형)와 Spring Boot Java 서버(작업용)를 실행하는 프로덕션 Ubuntu 시스템에서 두 번 발생했습니다. 처음 이런 일이 발생했을 때 내 서버가 다운되어 파일의 /proc/sys/fs/file-max808286이 나에게 완전히 합리적이라고 생각했지만 어쨌든 값을 늘렸고 2097152그 이후에 무엇을 했는지 기억이 나지 않았습니다(몇 년 전에는 좋은 일이었습니다). 그 쯤? ) 하지만 아마도 서버를 다시 시작하거나 적어도 내 서비스를 다시 시작하면 문제가 해결될 것입니다. 오늘 나를 괴롭히기 위해 다시 왔습니다. Java 서비스를 다시 시작하면 문제가 일시적으로 해결되었지만 앞으로는 이러한 상황을 피하기 위해 무슨 일이 일어났는지 알고 싶습니다.

  • /etc/security/limits.conf이 파일은 Ubuntu 설치의 기본값이므로 주석 파일일 뿐이므로 여기서 재현할 필요가 없습니다.
  • Java 서비스는 사용자에 의해 실행됩니다 tomcat.
  • 아파치는 에 의해 실행됩니다 root. 그러면 노드 또는 Spring Boot 서비스로 트래픽이 전달됩니다.

내 시스템에서 일부 관련 명령의 결과...

$ ulimit -Sn
1024

$ ulimit -Hn
1048576

$ sudo su tomcat

$ ulimit -Sn
1024

$ ulimit -Hn
1048576

부가 질문, 왜 내 하드 제한이 있나요?/proc/sys/fs/file-max? 에 설정된 값

그런데 이제 프로세스별 한도를 살펴보면 다음과 같은 결과가 나옵니다.

$ cat /proc/<tomcat_java>/limits
Limit                     Soft Limit           Hard Limit           Units     
Max open files            4096                 4096                 files

$ cat /proc/<root_apache>/limits
Limit                     Soft Limit           Hard Limit           Units     
Max open files            8192                 8192                 files     

$ cat /proc/<my_random_process>/limits
Limit                     Soft Limit           Hard Limit           Units     
Max open files            1024                 1048576              files     

무슨 일이죠? 내가 설정한 file-max에 관심을 갖는 유일한 프로세스는 내 자신의 프로세스입니다. (위에서 사용한 "임의" 프로세스는 bash 쉘입니다.) Apache와 Java의 이러한 제한은 어디에서 오는 것입니까? 위의 4096 제한이 초과되었음을 확실히 알 수 있지만(이것이 내 문제일 수 있음) 시스템에서 설정한 제한을 사용하도록 만드는 방법을 모르겠습니다.

이에 대한 도움을 주셔서 감사합니다.

답변1

당신의 문제는 다음과 같습니다systemd를 사용하여 서비스 제한을 설정하는 방법은 무엇입니까?- Apache Tomcat 서버의 시작 스크립트에서 열린 파일 제한 문제를 해결해야 합니다. 예: Ubuntu 시스템이 systemd를 사용한다고 가정하면 다음과 같이 시작 스크립트 파일을 편집하여 tomcat java 프로세스의 열린 파일 제한을 65000으로 늘릴 수 있습니다.

/etc/systemd/system/tomcat.service:

[Unit]
Description=Tomcat Service
After=syslog.target network.target

[Service]
Type=forking
User=tomcat
Group=tomcat
LimitNOFILE = 65000      <---------
....
[Install]
WantedBy=multi-user.target

데몬을 다시 로드하고 Tomcat 서버를 다시 시작합니다...

systemctl daemon-reload
systemctl restart tomcat

확인해 보세요, 그런 것...

pstree -pu |grep tomcat
       |-java(23638,tomcat)-+-{java}(23645)
grep open /proc/23638/limits
Max open files            65000                65000                files

관련 정보