Samba

samba 卡在最多 1024 個打開的文件

  • February 20, 2016

我正在執行一個 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/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是調試您可能遇到的任何特定程序的限制的好方法。我希望我早點發現這一點。

引用自:https://serverfault.com/questions/325608