OS X Yosemite - 打开的文件过多

OS X Yosemite - 打开的文件过多

我最近从 Mavericks 升级到了 Yosemite……头痛随之而来

我很确定我的问题在于我可以打开的文件数量-但我不知道如何解决它我也确信我已经阅读了有关创建/etc/sysctl.conf文件和/etc/launchd.conf文件的所有文章/提示

为了清楚起见,它们目前的样子是这样的 nb(我甚至不确定这些是否是正确的命令 - 我几乎尝试了所有的东西和所有的组合。即:更高的值,更低的值,删除命令,添加命令)

/etc/launchd.conf

limit maxfiles 16384 32768
limit maxproc 1000 2000

/etc/sysctl.conf

# Turn up maxproc
kern.maxproc=2048
# Turn up the maxproc per user
kern.maxprocperuid=512

我也尝试过增加我的 ulimit 值 - 无论是全局的还是本地的,对于我当前的会话...都不好

ulimit -a

-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         0
-v: address space (kbytes)          unlimited
-l: locked-in-memory size (kbytes)  unlimited
-u: processes                       709
-n: file descriptors                4096

好的 - 这就是我最初头痛的地方...我的数据库(通过 homebrew 安装的 percona-server 5.6.21-69.0)开始阻塞和死亡,并且在 mysql-error.log 中充满了错误too many files open

2014-10-21 15:19:50 5190 [ERROR] /usr/local/Cellar/percona-server/5.6.21-69.0/bin/mysqld: Can't open file: './ie/tokenorder_products.frm' (errno: 24 - Too many open files)
2014-10-21 15:19:50 5190 [ERROR] /usr/local/Cellar/percona-server/5.6.21-69.0/bin/mysqld: Can't open file: './ie/tokenorders.frm' (errno: 24 - Too many open files)
2014-10-21 15:19:50 5190 [ERROR] /usr/local/Cellar/percona-server/5.6.21-69.0/bin/mysqld: Can't open file: './ie/tsdevices.frm' (errno: 24 - Too many open files)
2014-10-21 15:19:50 5190 [ERROR] /usr/local/Cellar/percona-server/5.6.21-69.0/bin/mysqld: Can't open file: './ie/tsracks.frm' (errno: 24 - Too many open files)
2014-10-21 15:19:50 5190 [ERROR] /usr/local/Cellar/percona-server/5.6.21-69.0/bin/mysqld: Can't open file: './ie/v_classunity_classlist.frm' (errno: 24 - Too many open files)
2014-10-21 15:20:48 5190 [ERROR] Error in accept: Too many open files

这是我最初开始尝试通过“提高”我的 ulimit、maxfiles、maxproc 等来解决该问题的地方...

最终,我感到很沮丧,于是继续前进,稍后再回过头来解决这个问题。然后我尝试了一遍sudo gem install nokogiri 又一遍,但总是失败,并出现同样的错误(多次重复出现 builder.rb 无法构建 gem 原生扩展的错误,然后是一堆重复的堆栈跟踪日志要点

nokogiri 安装错误 nokogiri 安装错误

我尝试/搜索了许多不同的方法来解决这个问题(例如:附加标志等)。令人惊奇的是 - 当我开始认为这个问题与打开的文件/进程数量有关时,我在top安装 gem 时进行了检查......我对所发现的东西感到非常惊讶

顶部期间gem install nokogiri sudo gem 安装 nokogiri

看起来我的进程一直在分叉,这对于我之前的图片中的这一行来说是有意义的(参见“nokogiri 安装错误图片”)

sh: fork: Resource temporarily unavailable

所以我有点想不通了,但我真的不知道如何调试文件数量了?

更新

好吧,我设法安装了 nokogiri。不幸的是,我不确定是什么修复了这个问题,因为我试过很多方法。但我认为这与重新安装 ruby​​ 有关。然而,我仍然遇到同样的问题,我的数据库抱怨打开的文件过多当我使用任何类型的、不是很小的数据库时。

答案1

/etc/launchd.conf根据大量 Google 查询和 SO 建议修改文件似乎对我在 Yosemite (10.10) 中不起作用。经过多次更改/重启/测试组合后,最终起作用的是修改/etc/sysctl.conf文件(如果不存在则创建)。

这就是我必须投入才能让它发挥作用的东西

kern.maxfiles=65536
kern.maxfilesperproc=65536

我不确定是否kern.maxfiles需要在那里,但是当我把它放在那里时我仍然遇到同样的问题,当我添加它时一切kern.maxfilesperproc都开始工作。

答案2

要在 Mac OS X Yosemite 中根据系统范围调整打开文件限制,您必须创建两个配置文件。第一个是属性列表 (又名 plist) 文件,其中/Library/LaunchDaemons/limit.maxfiles.plist包含以下 XML 配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
    <dict>
      <key>Label</key>
        <string>limit.maxfiles</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxfiles</string>
          <string>65536</string>
          <string>65536</string>
        </array>
       <key>RunAtLoad</key>
        <true/>
      <key>ServiceIPC</key>
        <false/>
    </dict>
  </plist>

这会将打开文件数限制设置为 65536。第二个 plist 配置文件应存储在/Library/LaunchDaemons/limit.maxproc.plist以下内容中:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple/DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
    <dict>
      <key>Label</key>
        <string>limit.maxproc</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxproc</string>
          <string>2048</string>
          <string>2048</string>
        </array>
      <key>RunAtLoad</key>
        <true />
      <key>ServiceIPC</key>
        <false />
    </dict>
  </plist>

这两个 plist 文件必须由 拥有root:wheel并具有权限-rw-r--r--。默认情况下,此权限应已到位,但您可以通过运行 来确保它们已到位sudo chmod 644 <filename>。虽然上述步骤将导致系统范围的打开文件限制在重新启动时正确设置,但您可以通过运行 手动应用它们launchctl limit

除了在系统级别设置这些限制之外,我们还建议在会话级别进行设置,方法是将以下行附加到bashrcbashprofile或类似文件中:

ulimit -n 65536
ulimit -u 2048

与 plist 文件一样,您的 bashrc 或类似文件也应具有-rw-r--r--权限。此时,您可以重新启动计算机并在终端中输入 ulimit -n。如果您的系统配置正确,您应该会看到 maxfiles 已设置为 65536。

来源:http://docs.basho.com/riak/latest/ops/tuning/open-files-limit/

答案3

Yosemite 上的默认值似乎是 12K 和 10K:

$ sysctl -a | grep kern.maxfiles
kern.maxfiles: 12288
kern.maxfilesperproc: 10240

仅设置kern.maxfiles似乎/etc/sysctl.conf解决了我的问题。/etc/sysctl.conf文件:

kern.maxfiles=24576

相关内容