Подтвердить что ты не робот

Apache PHP/OSX Mavericks: - не удалось открыть поток: слишком много открытых файлов

Недавно я обновился до OSX Mavericks, и с тех пор я начал получать вышеупомянутую ошибку на моей машине разработки. В коде нет очевидной проблемы (это автоматически созданное приложение Yii). Что произошло в рамках обновления до Mavericks:

  • PHP был обновлен с 5.2.x, который в комплекте с OSX Lion до 5.4.x.
  • Мне пришлось получить Zend Debugger для PHP 5.4, установив Zend Server, подбирая ZendDebugger.so и удаляя Zend Server ( все это, потому что Zend не предоставляет автономную версию своего отладчика для php 5.4.x).

С тех пор я получаю эту проблему после загрузки и перезагрузки веб-сайта несколько раз. После возникновения этой ошибки мой веб-сервер продолжает возвращать ту же ошибку для любого другого приложения, размещенного на localhost. Я должен упомянуть, что статические веб-страницы обслуживаются нормально.

Я видел несколько потоков по этой теме. Большинство из них указывает на проблемы с кодом, где дескрипторы файлов закрываются неправильно, тем самым преодолевая порог ограничения открытого файла. Я также нашел этот поток, который, кажется, предполагает, что это может быть проблемой отладчика zend. Там также отчет об ошибках, поданный для php 5.2.x. Следуя нити здесь, я пробовал следующее:

$ ulimit -a

который сообщает:

open files (-n) 256

Кроме того,

sysctl -a | grep files

возвращает

kern.maxfiles = 12288
kern.maxfilesperproc = 10240
kern.maxfiles: 12288
kern.maxfilesperproc: 10240
kern.num_files: 3248

Еще одна интересная тема предлагает повысить этот предел (в настоящее время 256), используя:

ulimit -n 1024

Я пробовал все, но ничего не работает. Проблема также не всегда воспроизводима.

Мне интересно, что использование ulimit -n 1024 будет влиять на apache, поскольку из того, что я прочитал, это влияет на количество файлов, которые могут открывать оболочки.

Любая помощь приветствуется.

EDIT:

  • Перезапуск apache помогает немного, пока ошибка не встретится снова.
  • Кроме того, помогает оставить веб-сервер на холостом ходу (без определенного интервала).
4b9b3361

Ответ 1

Я, вероятно, страдал от информационной перегрузки. Возможное объяснение предлагается здесь, о котором я также упоминал в своем оригинальном посте. Думаю, я пропустил небольшую деталь, где OP упоминает, что он работает на Mac OSX 10.8.x. Я на 10.9, поэтому я загрузил zenddebugger.so со страницы, и все выглядит хорошо. Не получили ни одного too many open files весь день.

Итак, возможно, это проблема ZendDebugger.

Ответ 2

Бесстыдно украден из http://docs.basho.com/riak/latest/ops/tuning/open-files-limit/#Mac-OS-X

Чтобы проверить текущие ограничения в вашей системе Mac OS X, запустите:

$ launchctl limit maxfiles

Последние два столбца являются мягкими и жесткими пределами соответственно.

Чтобы настроить максимальные пределы открытого файла в OS X 10.7 (Lion) или новее, отредактируйте /etc/launchd.conf и увеличьте пределы для обоих значений.

Например, чтобы установить мягкий предел для 16384 файлов и жесткий предел для 32768 файлов, выполните следующие действия:

Проверить текущие пределы:

$ launchctl limit

    cpu         unlimited      unlimited
    filesize    unlimited      unlimited
    data        unlimited      unlimited
    stack       8388608        67104768
    core        0              unlimited
    rss         unlimited      unlimited
    memlock     unlimited      unlimited
    maxproc     709            1064
    maxfiles    10240          10240

Измените (или создайте) /etc/launchd.conf и увеличьте ограничения. Добавьте строки, которые выглядят следующим образом (используя значения, соответствующие вашей среде):

limit maxfiles 16384 32768

Сохраните файл и перезапустите систему, чтобы новые лимиты вступили в силу. После перезапуска проверьте новые лимиты с помощью команды limitctl limit:

$ launchctl limit

    cpu         unlimited      unlimited
    filesize    unlimited      unlimited
    data        unlimited      unlimited
    stack       8388608        67104768
    core        0              unlimited
    rss         unlimited      unlimited
    memlock     unlimited      unlimited
    maxproc     709            1064
    maxfiles    16384          32768

Ответ 3

Если вы столкнулись с этой проблемой при запуске Apache, вы можете настроить apache для увеличения лимита:

$ sudo vi /usr/sbin/apachectl

найти: ULIMIT_MAX_FILES=""

и измените эту строку на что-то вроде:

ULIMIT_MAX_FILES="ulimit 4096"

Тогда: sudo apachectl restart

Это не будет работать для сценариев CLI. Но добавление ulimit непосредственно к вашему ~/.bash_profile (или эквиваленту) должно работать для этой цели.

Это имеет то преимущество, что вы устанавливаете конкретные лимиты для apache и вашего терминала, не затрагивая другие приложения.

Кроме того, вы должны иметь возможность адаптировать этот метод к другим ОС, заменив ulimit на команду, применимую к этой среде.

Ответ 4

Я столкнулся с тем же вопросом в El Capitain. Нашел статью здесь Я должен должным образом оценить решение. Выполните следующие действия:

Настройка открытых ограничений файлов Чтобы настроить ограничения открытых файлов на общесистемной основе в Yosemite и выше, вам необходимо создать два файла конфигурации. Первый - это список свойств (aka 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-. Перезагрузите систему.

Также рекомендуется установить их для сеанса пользователя в .bashrc и добавить:

ulimit -n 65536
ulimit -u 2048

Надеюсь, что это поможет.

Ответ 5

Относительно ответа на исправление отладчика выше. К сожалению, приведенный выше ответ не будет работать для меня, поскольку он применим к версиям PHP версии 5.4, и я должен ограничиться php 5.3.

Zend выпустила версию 6.3 своего сервера, которая поддерживает php в 5.3. Я немного поиграл с установкой (после того, как я удалил свой ulimit до Apple по умолчанию), чтобы проверить его и не испытываю никаких проблем. Перед обновлением я не мог выполнять отладки php без повышения этого предела.