更改Erlang文件句柄限制?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更改Erlang文件句柄限制?相关的知识,希望对你有一定的参考价值。

我遇到了Erlang OTP + Cowboy应用程序的问题,该应用程序不允许我同时打开足够的文件。

如何更改BEAM中允许的打开文件句柄数?

潜在地,我需要同时打开大约500个小文本文件,但似乎文件限制为224.我从这个小测试程序获得了224的值:

-module(test_fds).
-export([count/0]).

count() -> count(1, []).

count(N, Fds) ->
  case file:open(integer_to_list(N), [write]) of
    {ok, F} ->
      count(N+1, [F| Fds]);

    {error, Err} ->
      [ file:close(F) || F <- Fds ],
      delete(N-1),
      {Err, N}
  end.

delete(0) -> ok;
delete(N) -> 
  case file:delete(integer_to_list(N)) of
    ok         -> ok;
    {error, _} -> meh
  end,

delete(N-1).

这给了

$ erl
Erlang/OTP 20 [erts-9.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [kernel-poll:false]

Eshell V9.2  (abort with ^G)
1> c(test_fds).     
{ok,test_fds}
2> test_fds:count().
{emfile,224}
3> 

这似乎是一个Erlang问题,而不是Mac OSX问题,因为从命令行,我得到:

$ sysctl -h kern.maxfiles
kern.maxfiles: 49,152
$ sysctl -h kern.maxfilesperproc
kern.maxfilesperproc: 24,576
答案

打开文件描述符的数量很可能受到shell的限制。您可以通过在调用ulimit -n 1000之前在shell中运行erl(或更多)来增加它。在我的系统上,默认值为7168,您的脚本可以在返回emfile之前打开7135文件。这是我使用不同的ulimit值运行脚本的输出:

$ ulimit -n 64; erl -noshell -eval 'io:format("~p~n", [test_fds:count()]), erlang:halt()'
{emfile,32}
$ ulimit -n 128; erl -noshell -eval 'io:format("~p~n", [test_fds:count()]), erlang:halt()'
{emfile,96}
$ ulimit -n 256; erl -noshell -eval 'io:format("~p~n", [test_fds:count()]), erlang:halt()'
{emfile,224}
$ ulimit -n 512; erl -noshell -eval 'io:format("~p~n", [test_fds:count()]), erlang:halt()'
{emfile,480}

erl很可能在开始评估我们的代码之前打开32个文件描述符,这解释了ulimit和输出中32的恒定差异。

以上是关于更改Erlang文件句柄限制?的主要内容,如果未能解决你的问题,请参考以下文章

获取 badarith,[erlang,'+',[error,0],[],同时使用 Erlang 片段在 TSUNG 中执行算术运算

如何在erlang中应用热代码交换功能作为补丁?

文件句柄

我在哪里更改此 Python 代码片段以将临时文件保存在 tmp 文件夹中?

如何获得最大打开文件句柄的软限制

Linux中如何解除最大进程数和最大文件句柄打开数限制?