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
我已經確認
lsof | wc -l
在磁碟上打開大約 1000 個文件時會發生此問題,以給我一個大概的計數。無論我改變什麼,總是出現“再試一次”按鈕並且複制被打斷的 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
另外,我正在執行 samba 版本 2:3.4.7~dfsg-1ubuntu3。
好的,我已經解決了我的問題,這樣做可以更好地理解 ulimit 的工作原理,至少在 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
是調試您可能遇到的任何特定程序的限制的好方法。我希望我早點發現這一點。