cec*_*rik 6 filesystems network-share samba ulimit
我正在运行 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
Run Code Online (Sandbox Code Playgroud)
我确保 /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
Run Code Online (Sandbox Code Playgroud)
我已经确认问题发生在大约 1000 个文件打开时,通过lsof | wc -l
在磁盘上使用给我一个近似计数。无论我更改什么,“再试一次”按钮总是出现在 1000 处并且复制被中断。一旦它回落到 1000 以下,您可以单击再试一次,它将继续复制。
显然,这是 Windows 7 或 Samba 中的错误,我不在乎哪个,我只关心修复它。为什么我的 Samba 不能像我要求它以多种方式打开超过 1000 个左右的文件?我需要更改其他限制吗?
编辑:symcbean 有一个很好的建议。以下是插入ulimit -a > /tmp/samba-ulimits
/etc/init/smb.conf 的 pre-script 部分的结果
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
Run Code Online (Sandbox Code Playgroud)
另外,我正在运行 samba 的 2:3.4.7~dfsg-1ubuntu3 版本。
好的,我已经解决了我的问题,这样做可以更好地了解 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
是调试您可能遇到问题的任何特定过程的限制的好方法。我希望我早点发现。