samba 停留在打开文件数上限 1024

samba 停留在打开文件数上限 1024

我正在运行 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/sshdssh 守护程序,但它不会使用 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或查看你的初始化脚本。

相关内容