有关 Linux 下 ulimit 和文件句柄数量的笔记。

ulimit 的基本印象

反复用 Open 来打开文件,会提示出一个文件句柄错误:

<pre class="example">open64

: Too many open files

<p>
  这是因为 Linux 的 Open 函数会有一个<a href="http://starsliao.blog.163.com/blog/static/890482010101812220232/">句柄上限</a>:包括软上限和硬上限。
</p></p>

注意细节

对于 ulimit 里做的限定,是指进程同时打开的句柄数量,而不是累加的。

<p>
  所以,我们需要在程序里及时关闭不需要的句柄。
</p>

<p>
  fopen 及 socket 通讯的 accept 等,都会增加 ulimit 里的文件句柄数量。
</p></p>

基本 ulimit 值

其实 ulimit 命令本身就有分软硬设置,加 -H 就是硬,加 -S 就是软。硬上限和软上限的区别是:硬限制是实际的限制,而软限制是 warnning 限制,只会做出 warning。

<p>
  你可以用 ulimit 命令来对这些变量进行查询与修改。比如说,我如果要查询 open 文件句柄的软上限,可以用命令:
</p>

<pre class="src src-shell-script">$ ulimit -Sn

<p>
  要查询 open 文件句柄的硬上限,可以用命令:
</p>

<pre class="src src-shell-script">$ ulimit -Hn

<p>
  我们可以用 ulimit -a 来查看所有限制值:
</p>

<pre class="src src-shell-script">$ ulimit -a

<p>
  在 Linux 下面部署应用的时候,有时候会遇上
</p>

<pre class="example">Socket/File: Can't open so many files

<p>
  的问题,其实就是 Linux 是有文件句柄限制的,而且默认不是很高,一般都是1024。作为一台生产服务器,其实很容易就达到这个数量,因此我们需要把这个值改大一些。
</p>

<p>
  如果需要临时修改这个值,可以用下面的命令来使得 open 打开的文件句柄硬上限为 9999:
</p>

<pre class="src src-shell-script">$ ulimit -SHn 9999

<p>
  可以使用下面的设置来使得文件句柄的软上限为 2048:
</p>

<pre class="src src-shell-script">$ ulimit -SSn 2048

开机启动设置 ulimit 值

如果你需要在开机的时候,就自动设置 ulimit 的值,可以使用下面的方法,在 Ubuntu 下的方法可以查看这里。简单来讲,是这样简单的几个步骤:

<p>
  可以修改下面的配置:
</p>

<pre class="example">/etc/security/limits.conf

<p>
  修改下面两项:
</p>

<pre class="example">* hard nofile 65535
  • soft nofile 65535