tomcat 报too many open file
时间: 2023-10-19 14:16:25 浏览: 39
"Too many open files" 是因为 Tomcat 打开的文件句柄数量超过了系统限制。这个错误通常发生在 Tomcat 在高并发情况下运行时,尤其是在处理大量文件上传或下载的时候。
解决这个问题的一种方法是增加系统对文件句柄数量的限制。您可以通过修改 `/etc/security/limits.conf` 文件来提高系统对文件句柄数量的限制。例如,您可以添加以下行:
```
* hard nofile 65535
* soft nofile 65535
```
这将把系统中所有用户的硬限制和软限制都设置为 65535。注意,这些更改需要重新登录才能生效。
另外,您也可以在 Tomcat 的 `setenv.sh` 文件中添加以下行,以增加 Tomcat 对文件句柄数量的限制:
```
CATALINA_OPTS="$CATALINA_OPTS -Dfile.encoding=UTF8 -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Xms512M -Xmx1024M -XX:PermSize=256M -XX:MaxPermSize=512M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/tomcat-heap-dump.hprof -XX:ErrorFile=/tmp/tomcat-error.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpBeforeFullGC -XX:HeapDumpPath=/tmp/tomcat-heap-dump.hprof -XX:+HeapDumpOnOutOfMemoryError -XX:+UseGCLogFileRotation -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -Djavax.net.ssl.trustStore=/etc/cacerts/truststore.jks -Djavax.net.ssl.trustStorePassword=changeit -Djavax.net.ssl.keyStore=/etc/cacerts/keystore.jks -Djavax.net.ssl.keyStorePassword=changeit -Djavax.net.ssl.keyPassword=changeit -Dhttp.keepAlive=false -Djava.security.egd=file:/dev/./urandom -Dfile.encoding=UTF-8 -Djava.library.path=/opt/tomcat/lib:/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib"
```
其中的 `-XX:MaxPermSize` 和 `-XX:PermSize` 参数控制了 Tomcat 对 JVM 的永久内存的限制。您可以根据您的需要进行调整。
当然,如果您使用的是系统默认的 Tomcat 包,也可以直接通过修改 `/etc/sysctl.conf` 文件来增加系统对文件句柄数量的限制。例如,您可以添加以下行:
```
fs.file-max = 65535
```
这将把系统中可用的文件句柄数量设置为 65535。修改完成后,您需要重新加载 `/etc/sysctl.conf` 文件:
```
sysctl -p
```
希望这些信息能对您有所帮助!