简体   繁体   中英

sbt-native-packager fails with “Too many open files in system” when mapping a directory

I have an sbt-based project. Universal packaging plugin is enabled with

.enablePlugins(JavaAppPackaging)

and additional directories are mapped like this:

mappings in Universal ++= directory("public")

I tried to build the package with dist command on multiple machines (running OS X and Linux) it always fails with the following trace:

    Could not create file [...omitted...]/target/streams/compile/$global/$global/discoveredMainClasses/datajava.io.IOException: Too many open files in system
            at sbt.ErrorHandling$.translate(ErrorHandling.scala:10)
            at sbt.IO$.touch(IO.scala:196)
            at sbt.std.Streams$$anon$3$$anon$2.make(Streams.scala:129)
            at sbt.std.Streams$$anon$3$$anon$2.binary(Streams.scala:116)
            at sbt.SessionVar$$anonfun$persist$1.apply(SessionVar.scala:27)
            at sbt.SessionVar$$anonfun$persist$1.apply(SessionVar.scala:26)
            at sbt.std.Streams$class.use(Streams.scala:75)
            at sbt.std.Streams$$anon$3.use(Streams.scala:100)
            at sbt.SessionVar$.persist(SessionVar.scala:26)
            at sbt.SessionVar$.persistAndSet(SessionVar.scala:21)
            at sbt.Project$RichTaskSessionVar$$anonfun$storeAs$1$$anonfun$apply$5.apply(Project.scala:563)
            at sbt.Project$RichTaskSessionVar$$anonfun$storeAs$1$$anonfun$apply$5.apply(Project.scala:563)
            at sbt.SessionVar$$anonfun$1$$anonfun$apply$1.apply(SessionVar.scala:40)
            at sbt.SessionVar$$anonfun$1$$anonfun$apply$1.apply(SessionVar.scala:40)
            at scala.Function$$anonfun$chain$1$$anonfun$apply$1.apply(Function.scala:24)
            at scala.Function$$anonfun$chain$1$$anonfun$apply$1.apply(Function.scala:24)
            at scala.collection.IndexedSeqOptimized$class.foldl(IndexedSeqOptimized.scala:51)
            at scala.collection.IndexedSeqOptimized$class.foldLeft(IndexedSeqOptimized.scala:60)
            at scala.collection.mutable.ArrayBuffer.foldLeft(ArrayBuffer.scala:47)
            at scala.collection.TraversableOnce$class.$div$colon(TraversableOnce.scala:138)
            at scala.collection.AbstractTraversable.$div$colon(Traversable.scala:105)
            at scala.Function$$anonfun$chain$1.apply(Function.scala:24)
            at sbt.EvaluateTask$.applyResults(EvaluateTask.scala:387)
            at sbt.EvaluateTask$.liftedTree1$1(EvaluateTask.scala:361)
            at sbt.EvaluateTask$.run$1(EvaluateTask.scala:358)
            at sbt.EvaluateTask$.runTask(EvaluateTask.scala:378)
            at sbt.Aggregation$$anonfun$3.apply(Aggregation.scala:64)
            at sbt.Aggregation$$anonfun$3.apply(Aggregation.scala:62)
            at sbt.EvaluateTask$.withStreams(EvaluateTask.scala:314)
            at sbt.Aggregation$.timedRun(Aggregation.scala:62)
            at sbt.Aggregation$.runTasks(Aggregation.scala:71)
            at sbt.Aggregation$$anonfun$applyTasks$1.apply(Aggregation.scala:32)
            at sbt.Aggregation$$anonfun$applyTasks$1.apply(Aggregation.scala:31)
            at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:61)
            at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:61)
            at sbt.Aggregation$$anonfun$evaluatingParser$4$$anonfun$apply$5.apply(Aggregation.scala:153)
            at sbt.Aggregation$$anonfun$evaluatingParser$4$$anonfun$apply$5.apply(Aggregation.scala:152)
            at sbt.Act$$anonfun$sbt$Act$$actParser0$1$$anonfun$sbt$Act$$anonfun$$evaluate$1$1$$anonfun$apply$10.apply(Act.scala:244)
            at sbt.Act$$anonfun$sbt$Act$$actParser0$1$$anonfun$sbt$Act$$anonfun$$evaluate$1$1$$anonfun$apply$10.apply(Act.scala:241)
            at sbt.Command$.process(Command.scala:93)
            at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:96)
            at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:96)
            at sbt.State$$anon$1.process(State.scala:184)
            at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:96)
            at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:96)
            at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
            at sbt.MainLoop$.next(MainLoop.scala:96)
            at sbt.MainLoop$.run(MainLoop.scala:89)
            at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:68)
            at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:63)
            at sbt.Using.apply(Using.scala:24)
            at sbt.MainLoop$.runWithNewLog(MainLoop.scala:63)
            at sbt.MainLoop$.runAndClearLast(MainLoop.scala:46)
            at sbt.MainLoop$.runLoggedLoop(MainLoop.scala:30)
            at sbt.MainLoop$.runLogged(MainLoop.scala:22)
            at sbt.StandardMain$.runManaged(Main.scala:54)
            at sbt.xMain.run(Main.scala:29)
            at xsbt.boot.Launch$$anonfun$run$1.apply(Launch.scala:109)
            at xsbt.boot.Launch$.withContextLoader(Launch.scala:128)
            at xsbt.boot.Launch$.run(Launch.scala:109)
            at xsbt.boot.Launch$$anonfun$apply$1.apply(Launch.scala:35)
            at xsbt.boot.Launch$.launch(Launch.scala:117)
            at xsbt.boot.Launch$.apply(Launch.scala:18)
            at xsbt.boot.Boot$.runImpl(Boot.scala:41)
            at xsbt.boot.Boot$.main(Boot.scala:17)
            at xsbt.boot.Boot.main(Boot.scala)
    Caused by: java.io.IOException: Too many open files in system
            at java.io.UnixFileSystem.createFileExclusively(Native Method)
            at java.io.File.createNewFile(File.java:1012)
            at sbt.IO$$anonfun$1.apply$mcZ$sp(IO.scala:196)
            at sbt.IO$$anonfun$1.apply(IO.scala:196)
            at sbt.IO$$anonfun$1.apply(IO.scala:196)
            at sbt.ErrorHandling$.translate(ErrorHandling.scala:10)
            at sbt.IO$.touch(IO.scala:196)
            at sbt.std.Streams$$anon$3$$anon$2.make(Streams.scala:129)
            at sbt.std.Streams$$anon$3$$anon$2.binary(Streams.scala:116)
            at sbt.SessionVar$$anonfun$persist$1.apply(SessionVar.scala:27)
            at sbt.SessionVar$$anonfun$persist$1.apply(SessionVar.scala:26)
            at sbt.std.Streams$class.use(Streams.scala:75)
            at sbt.std.Streams$$anon$3.use(Streams.scala:100)
            at sbt.SessionVar$.persist(SessionVar.scala:26)
            at sbt.SessionVar$.persistAndSet(SessionVar.scala:21)
            at sbt.Project$RichTaskSessionVar$$anonfun$storeAs$1$$anonfun$apply$5.apply(Project.scala:563)
            at sbt.Project$RichTaskSessionVar$$anonfun$storeAs$1$$anonfun$apply$5.apply(Project.scala:563)
            at sbt.SessionVar$$anonfun$1$$anonfun$apply$1.apply(SessionVar.scala:40)
            at sbt.SessionVar$$anonfun$1$$anonfun$apply$1.apply(SessionVar.scala:40)
            at scala.Function$$anonfun$chain$1$$anonfun$apply$1.apply(Function.scala:24)
            at scala.Function$$anonfun$chain$1$$anonfun$apply$1.apply(Function.scala:24)
            at scala.collection.IndexedSeqOptimized$class.foldl(IndexedSeqOptimized.scala:51)
            at scala.collection.IndexedSeqOptimized$class.foldLeft(IndexedSeqOptimized.scala:60)
            at scala.collection.mutable.ArrayBuffer.foldLeft(ArrayBuffer.scala:47)
            at scala.collection.TraversableOnce$class.$div$colon(TraversableOnce.scala:138)
            at scala.collection.AbstractTraversable.$div$colon(Traversable.scala:105)
            at scala.Function$$anonfun$chain$1.apply(Function.scala:24)
            at sbt.EvaluateTask$.applyResults(EvaluateTask.scala:387)
            at sbt.EvaluateTask$.liftedTree1$1(EvaluateTask.scala:361)
            at sbt.EvaluateTask$.run$1(EvaluateTask.scala:358)
            at sbt.EvaluateTask$.runTask(EvaluateTask.scala:378)
            at sbt.Aggregation$$anonfun$3.apply(Aggregation.scala:64)
            at sbt.Aggregation$$anonfun$3.apply(Aggregation.scala:62)
            at sbt.EvaluateTask$.withStreams(EvaluateTask.scala:314)
            at sbt.Aggregation$.timedRun(Aggregation.scala:62)
            at sbt.Aggregation$.runTasks(Aggregation.scala:71)
            at sbt.Aggregation$$anonfun$applyTasks$1.apply(Aggregation.scala:32)
            at sbt.Aggregation$$anonfun$applyTasks$1.apply(Aggregation.scala:31)
            at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:61)
            at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:61)
            at sbt.Aggregation$$anonfun$evaluatingParser$4$$anonfun$apply$5.apply(Aggregation.scala:153)
            at sbt.Aggregation$$anonfun$evaluatingParser$4$$anonfun$apply$5.apply(Aggregation.scala:152)
            at sbt.Act$$anonfun$sbt$Act$$actParser0$1$$anonfun$sbt$Act$$anonfun$$evaluate$1$1$$anonfun$apply$10.apply(Act.scala:244)
            at sbt.Act$$anonfun$sbt$Act$$actParser0$1$$anonfun$sbt$Act$$anonfun$$evaluate$1$1$$anonfun$apply$10.apply(Act.scala:241)
            at sbt.Command$.process(Command.scala:93)
            at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:96)
            at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:96)
            at sbt.State$$anon$1.process(State.scala:184)
            at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:96)
            at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:96)
            at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
            at sbt.MainLoop$.next(MainLoop.scala:96)
            at sbt.MainLoop$.run(MainLoop.scala:89)
            at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:68)
            at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:63)
            at sbt.Using.apply(Using.scala:24)
            at sbt.MainLoop$.runWithNewLog(MainLoop.scala:63)
            at sbt.MainLoop$.runAndClearLast(MainLoop.scala:46)
            at sbt.MainLoop$.runLoggedLoop(MainLoop.scala:30)
            at sbt.MainLoop$.runLogged(MainLoop.scala:22)
            at sbt.StandardMain$.runManaged(Main.scala:54)
            at sbt.xMain.run(Main.scala:29)
            at xsbt.boot.Launch$$anonfun$run$1.apply(Launch.scala:109)
            at xsbt.boot.Launch$.withContextLoader(Launch.scala:128)
            at xsbt.boot.Launch$.run(Launch.scala:109)
            at xsbt.boot.Launch$$anonfun$apply$1.apply(Launch.scala:35)
            at xsbt.boot.Launch$.launch(Launch.scala:117)
            at xsbt.boot.Launch$.apply(Launch.scala:18)
            at xsbt.boot.Boot$.runImpl(Boot.scala:41)
            at xsbt.boot.Boot$.main(Boot.scala:17)
            at xsbt.boot.Boot.main(Boot.scala)
    [error] Could not create file [...omitted...]/target/streams/compile/$global/$global/discoveredMainClasses/datajava.io.IOException: Too man
    y open files in system
    [error] Use 'last' for the full log.

Passing -XX:-MaxFDLimit option to JVM didn't do any difference.

The version of sbt is 0.13.9, sbt-native-packager is 1.1.1 (latest, also used v1.0.6).

So it this a bug or I just have to many files in that directories?

As far as I see you have some problems with underlying opertaion system:

 Caused by: java.io.IOException: Too many open files in system at java.io.UnixFileSystem.createFileExclusively(Native Method) 

Try to tweak max allowed open files settings in Linux. For example here are some commands:

If you are getting error “Too many open files (24)” then your application/command/script is hitting max open file limit allowed by linux. You need to increase open file limit as below:

Increase limit Per-User Limit

Open file: /etc/security/limits.conf

Paste following towards end:

 *  
\nhard nofile 500000 \n* soft nofile 500000 root hard nofile 500000 root soft nofile 500000

500000 is fair number. I am not sure what is max limit but 999999 (Six-9) worked for me once as far as I remember.

Once you save file, you may need to logout and login again.

pam-limits

I read at many places that an extra step is neede for limit to change for daemon processes. I did not need following yet, but if above changes are not working for you, you may give this a try.

Open /etc/pam.d/common-session

Add following line:

 session required \npam_limits.so  
System-Wide Limit

Set this higher than user-limit set above.

Open /etc/sysctl.conf

Add following:

 fs.file-max = \n2097152  

Run:

 sysctl -p  

Above will increase “total” number of files that can remain open system-wide.

Verify New Limits

Use following command to see max limit of file descriptors:

 cat /proc/sys/fs/file-max  

Hard Limit

 ulimit \n-Hn  

Soft Limit

 ulimit -Sn  

if you are logged in as root:

Check limit for other user

Just replace www-data by linux username you wish to check limits for:

 su - www-data -c \n'ulimit -aHS' -s '/bin/bash'  
Check limits of a running process:

Find process-id (PID):

 ps aux | \ngrep process-name  

Suppose, XXX is PID, then run following commands to check limits:

 cat /proc/XXX/limits  

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM