Назад | Перейти на главную страницу

Самба застряла максимум на 1024 открытых файлах

Я использую файловый сервер Samba Ubuntu 10.04 (lucid). У меня есть клиент Windows 7, который открывает большое количество файлов, одновременно копируя тысячи крошечных файлов. Он получает сообщение об ошибке «Слишком много открытых файлов», после чего подождите несколько секунд и нажмите «Повторить попытку», чтобы возобновить загрузку.

Я нашел ряд ссылок, в которых говорится об увеличении количества открытых файлов, доступных Samba, для решения проблемы. Я думаю, что это отличная идея, и я отчаянно пытаюсь ее реализовать ... но что бы я ни делал, он отказывается открывать более 1024 файлов, и проблема с копированием никуда не исчезнет!

Вот что я пробовал:

Я установил ulimit -n 25000.

Я также установил /etc/security/limits.conf на:

* soft nofiles 25000
* hard nofiles 65000
root soft nofiles 25000
root hard nofiles 65000

Я убедился, что в /etc/security/limits.d нет ничего, что переопределяло бы все это.

Я проверил, что sysctl fs.file-max = 199468 более чем достаточно.

Я не могу найти профилей apparmor, которые могут мешать самбе.

Я добавил limit nofile 25000 65000 раздел в /etc/init/smbd.conf

Я установил max open files = 50000 в smb.conf и подтвердил, что он вступает в силу через файлы журнала samba:

[2011/10/28 01:30:16,  0] smbd/open.c:151(fd_open)
  Too many open files, unable to open more!  smbd's max open files = 50000
[2011/10/28 01:30:18,  0] lib/sysquotas.c:426(sys_get_quota)
  sys_path_to_bdev() failed for path [.]!
[2011/10/28 01:30:18,  0] lib/sysquotas.c:426(sys_get_quota)
  sys_path_to_bdev() failed for path [.]!
[2011/10/28 01:30:18,  0] smbd/open.c:151(fd_open)
  Too many open files, unable to open more!  smbd's max open files = 50000
[2011/10/28 01:30:19,  0] smbd/open.c:151(fd_open)
  Too many open files, unable to open more!  smbd's max open files = 50000
[2011/10/28 01:30:20,  0] smbd/open.c:151(fd_open)
  Too many open files, unable to open more!  smbd's max open files = 50000

Я подтвердил, что проблема возникает, когда около 1000 файлов открываются с помощью lsof | wc -l на диске, чтобы дать мне приблизительное количество. Независимо от того, что я меняю, всегда стоит 1000, когда появляется кнопка «Повторить попытку» и копирование прерывается. Как только он упадет ниже 1000, вы можете нажать «Попробовать еще раз», и копирование возобновится.

Очевидно, это ошибка в Windows 7 или Samba, мне все равно, все, что меня волнует, - это ее исправить. Почему моя Samba не открывает более 1000 файлов, как я прошу, разными способами? Есть ли другие ограничения, которые мне нужно изменить?

Изменить: у symcbean было хорошее предложение. Вот результаты вставки ulimit -a > /tmp/samba-ulimits в раздел предварительного сценария /etc/init/smb.conf

time(seconds)        unlimited
file(blocks)         unlimited
data(kbytes)         unlimited
stack(kbytes)        10240
coredump(blocks)     0
memory(kbytes)       unlimited
locked memory(kbytes) 64
process              15969
nofiles              25000
vmemory(kbytes)      unlimited
locks                unlimited

Кроме того, я использую версию 2: 3.4.7 ~ dfsg-1ubuntu3 samba.

Хорошо, я решил свою проблему и при этом стал лучше понимать, как работают ulimits, по крайней мере, в Ubuntu. Было несколько проблем, и я думаю, что разобрался со всеми.

Первая проблема, и одна глупая: nofiles должно быть nofile в /etc/security/limits.conf

Еще одна более важная оплошность: хотя я обеспечил включение pam_limits.so в /etc/pam.d/common-session, Я не заметил, что там тоже /etc/pam.d/common-session-noninteractive. Последний файл использовала самба.

Похоже, что исправление этой проблемы привело к исправлению самбы, которая теперь может открывать любое количество файловых дескрипторов. Копирование Windows завершено успешно. Также обратите внимание: Samba действительно использует ulimit соответствующего пользователя, а не ulimit, с которого запущен процесс smbd, или ulimit root. /etc/security/limits.conf можно ли это установить, если вы правильно настроили либо (и то, и другое?) /etc/pam.d/common-session-noninteractive и /etc/pam.d/samba использовать pam_limits.so

Что касается другой проблемы, когда мой пользователь застрял на жестких лимитах 1024/1024, это была комбинация нескольких проблем. Прежде всего, несмотря на то, что /etc/pam.d/sshd демон ssh не использует PAM, если вы не измените /etc/ssh/sshd_config иметь "UsePAM yes". По умолчанию установлено «no», и без использования PAM pam_limits.so (который отвечает за применение limits.conf) даже не вступает в игру.

Вместо этого ulimit по умолчанию для логинов, не связанных с PAM, похоже, наследуются от pid 1 (обычно "init"). Вы можете проверить эти ограничения pid 1 по умолчанию с помощью cat /proc/1/limits. К сожалению, насколько я могу судить, эти ограничения установлены в ядре по умолчанию. Кажется, нет никакого способа изменить их, кроме перекомпиляции ядра или убеждения не-PAM-приложения использовать PAM.

Я также хочу дать совет, что cat /proc/<anypid>/limits - отличный способ отладить ограничения любого конкретного процесса, с которым у вас могут возникнуть проблемы. Хотел бы я обнаружить это раньше.

Я работал с ubuntu 14.04 lts, ​​и мне потребовалось несколько часов, чтобы понять следующее:

  • samba-ad-dc запускается с выскочкой, поэтому настройки в /etc/security/limits.conf не имеют значения.
  • ограничения определены в разделе файла /etc/init/samba-ad-dc.conf
  • должна была быть вставлена ​​строка со следующим кодом:

    предел nofile 16384 16384

После перезапуска все работает нормально, ps ax сообщает идентификатор процесса samba, а cat / proc / 799 / limits показывает правильные ограничения максимального количества открытых файлов для процесса 799 (замените 799 идентификатором вашего процесса).

Возможно, в сценарии инициализации Samba есть что-то вроде ulimit -SHn 1024 в этом? Видеть /etc/init.d/smb или любой другой сценарий инициализации.