玩 scala 框架 - 太多打开的文件 - 如何在生产中

1 production scala playframework

下面,我使用 Play 框架 2.4.0 和 Scala 2.11.7。

我正在强调使用 Gattle 的简单播放应用程序,在 60 秒内注入 5000 个用户,几秒钟后,播放服务器返回以下内容:

“无法接受连接。” 和“java.io.IOException:系统中打开的文件太多”。

这是相关的堆栈跟踪:

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$1.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]
Run Code Online (Sandbox Code Playgroud)

我想这是由于ulimit系统的原因(是否可以确认这一点?),如果是这样,我的问题如下:

在生产环境中如何管理这种错误?这是通过设置一个高值来实现的吗ulimit -n <high_value>

nka*_*dwa 5

最简单的检查方法是:

猫 /proc/PID/限制

你会看见:

Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
...
Max open files            1024                 1024                 files
...
Run Code Online (Sandbox Code Playgroud)

要查看当前的 shell,您始终可以:

ulimit -a

并得到

...
open files                      (-n) 1024
...
Run Code Online (Sandbox Code Playgroud)

最好通过 /etc/security/limits.conf 在系统范围内更改它,但您可以使用 ulimit -n 仅更改当前 shell。

就如何处理这种情况而言,除了拥有足够的文件描述符之外,别无选择。把它设置得高一些,如果它击中了,就会出现泄漏,或者你在 Facebook 工作。在生产中,我相信一般建议是16k。