播放框架 scala - 打开的文件太多 - 如何在生产中
Play framework scala - too many open files - how to in production
在下文中,我使用 Play framework 2.4.0 和 Scala 2.11.7。
我正在强调一个简单的 Gatling 播放应用程序,在 60 秒内注入 5000 名用户,几秒钟后,播放服务器 returns 如下:
"Failed to accept a connection." 和 "java.io.IOException: Too many open files in system"。
这是关联的堆栈跟踪:
22:52:48.943 [application-akka.actor.default-dispatcher-12] INFO play.api.Play$ - Application started (Dev)
22:53:08.939 [New I/O server boss #17] WARN o.j.n.c.s.nio.AbstractNioSelector - Failed to accept a connection.
java.io.IOException: Too many open files in system
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) ~[na:1.8.0_45]
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422) ~[na:1.8.0_45]
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250) ~[na:1.8.0_45]
at org.jboss.netty.channel.socket.nio.NioServerBoss.process(NioServerBoss.java:100) [netty-3.10.3.Final.jar:na]
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:337) [netty-3.10.3.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerBoss.run(NioServerBoss.java:42) [netty-3.10.3.Final.jar:na]
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) [netty-3.10.3.Final.jar:na]
at org.jboss.netty.util.internal.DeadLockProofWorker.run(DeadLockProofWorker.java:42) [netty-3.10.3.Final.jar:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_45]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_45]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45]
我想这是由于系统ulimit
造成的(是否可以确认?),如果是这样,我的问题如下:
生产环境如何处理这种错误?这是通过ulimit -n <high_value>
设置一个高值吗?
最简单的检查方法是:
cat /proc/PID/limits
您将看到:
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
...
Max open files 1024 1024 files
...
要查看当前 shell,您可以随时:
ulimit -a
并得到
...
open files (-n) 1024
...
最好通过 /etc/security/limits.conf 在系统范围内进行更改
但是您可以使用 ulimit -n 仅更改当前 shell.
就如何处理这种情况而言,除了拥有足够的文件描述符外别无选择。把它调高,如果它命中,就会有泄漏或者你在为 facebook 工作。在生产中,我相信一般建议是 16k。
在下文中,我使用 Play framework 2.4.0 和 Scala 2.11.7。
我正在强调一个简单的 Gatling 播放应用程序,在 60 秒内注入 5000 名用户,几秒钟后,播放服务器 returns 如下:
"Failed to accept a connection." 和 "java.io.IOException: Too many open files in system"。
这是关联的堆栈跟踪:
22:52:48.943 [application-akka.actor.default-dispatcher-12] INFO play.api.Play$ - Application started (Dev)
22:53:08.939 [New I/O server boss #17] WARN o.j.n.c.s.nio.AbstractNioSelector - Failed to accept a connection.
java.io.IOException: Too many open files in system
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) ~[na:1.8.0_45]
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422) ~[na:1.8.0_45]
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250) ~[na:1.8.0_45]
at org.jboss.netty.channel.socket.nio.NioServerBoss.process(NioServerBoss.java:100) [netty-3.10.3.Final.jar:na]
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:337) [netty-3.10.3.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerBoss.run(NioServerBoss.java:42) [netty-3.10.3.Final.jar:na]
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) [netty-3.10.3.Final.jar:na]
at org.jboss.netty.util.internal.DeadLockProofWorker.run(DeadLockProofWorker.java:42) [netty-3.10.3.Final.jar:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_45]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_45]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45]
我想这是由于系统ulimit
造成的(是否可以确认?),如果是这样,我的问题如下:
生产环境如何处理这种错误?这是通过ulimit -n <high_value>
设置一个高值吗?
最简单的检查方法是:
cat /proc/PID/limits
您将看到:
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
...
Max open files 1024 1024 files
...
要查看当前 shell,您可以随时:
ulimit -a
并得到
...
open files (-n) 1024
...
最好通过 /etc/security/limits.conf 在系统范围内进行更改 但是您可以使用 ulimit -n 仅更改当前 shell.
就如何处理这种情况而言,除了拥有足够的文件描述符外别无选择。把它调高,如果它命中,就会有泄漏或者你在为 facebook 工作。在生产中,我相信一般建议是 16k。