我正在运行 Ubuntu 10.04 (lucid) samba 文件服务器。我有一个 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,这已经足够了。
我找不到任何可能干扰 samba 的 apparmor 配置文件。
limit nofile 25000 65000
我在 /etc/init/smbd.conf 中添加了一节
我已经在 smb.conf 中设置了 max open files = 50000,并通过 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 个文件?我是否需要更改其他限制?
ulimit -a > /tmp/samba-ulimits
编辑:symcbean 有一个很好的建议。以下是插入/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
另外,我正在运行 samba 版本 2:3.4.7~dfsg-1ubuntu3。
答案1
好的,我已解决了我的问题,并且通过此方法更好地了解了 ulimits 的工作原理,至少在 Ubuntu 中是这样。存在许多问题,我认为我已经将它们全部解决了。
第一个问题,也是一个愚蠢的问题:nofiles
应该nofile
在/etc/security/limits.conf
另一个更重要的疏忽:虽然我确保 pam_limits.so 包含在内/etc/pam.d/common-session
,但我没有注意到还有/etc/pam.d/common-session-noninteractive
。后者是 samba 正在使用的文件。
修复该问题似乎已经修复了 Samba,它现在可以打开任意数量的文件描述符。Windows 复制已成功完成。另请注意:Samba 确实使用了相应用户的 ulimit,而不是 smbd 进程启动时的 ulimit,也不是 root 的 ulimit。/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)甚至不会发挥作用。
相反,非 PAM 登录的默认 ulimit 似乎从 pid 1(通常为“init”)继承。您可以使用 检查这些默认 pid 1 限制cat /proc/1/limits
。不幸的是,据我所知,这些限制在内核中设置为默认值。除了重新编译内核或说服非 PAM 应用程序使用 PAM 之外,似乎没有任何方法可以修改它们。
我还想提供一些建议,这cat /proc/<anypid>/limits
是调试您可能遇到问题的任何特定流程的限制的好方法。我希望我能早点发现这一点。
答案2
我正在使用 ubuntu 14.04 lts,花了几个小时才实现以下目标:
- samba-ad-dc 由 upstart 启动,因此 /etc/security/limits.conf 中的设置无关紧要。
- 限制由文件 /etc/init/samba-ad-dc.conf 中的节定义
必须插入以下代码行:
限制无文件 16384 16384
重新启动后一切正常,ps ax 会告诉您 samba 的进程 id,cat /proc/799/limits 会显示进程 799 的正确最大打开文件限制(将 799 与您的进程 id 交换)。
答案3
也许 Samba 初始化脚本ulimit -SHn 1024
中有类似的东西?请查看/etc/init.d/smb
或查看你的初始化脚本。