Я использую файловый сервер 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, и мне потребовалось несколько часов, чтобы понять следующее:
должна была быть вставлена строка со следующим кодом:
предел nofile 16384 16384
После перезапуска все работает нормально, ps ax сообщает идентификатор процесса samba, а cat / proc / 799 / limits показывает правильные ограничения максимального количества открытых файлов для процесса 799 (замените 799 идентификатором вашего процесса).
Возможно, в сценарии инициализации Samba есть что-то вроде ulimit -SHn 1024
в этом? Видеть /etc/init.d/smb
или любой другой сценарий инициализации.