web-dev-qa-db-ja.com

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プロファイルを見つけることができません。

/etc/init/smbd.confにlimit nofile 25000 65000スタンザを追加しました

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は良い提案をしました。 /etc/init/smb.confのpre-scriptセクションにulimit -a > /tmp/samba-ulimitsを挿入した結果は次のとおりです

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

また、私はバージョン2:3.4.7〜dfsg-1ubuntu3のsambaを実行しています。

5
cecilkorik

OK問題を解決しました。そうすることで、少なくともUbuntuで、ulimitがどのように機能するかをよりよく理解できるようになります。いくつかの問題があり、私はそれらすべてを整理したと思います。

最初の問題、そしてばかげた問題:nofiles/etc/security/limits.confではnofileである必要があります

もう1つの重要な見落とし:pam_limits.soが/etc/pam.d/common-sessionに含まれていることを確認しましたが、/etc/pam.d/common-session-noninteractiveも含まれていることに気付きませんでした。後者のファイルは、sambaが使用していたファイルです。

この問題を修正すると、Sambaが修正されたように見え、Sambaは好きなだけファイル記述子を開くことができます。 Windowsのコピーが正常に完了しました。 また注意:Sambaは確かに適切なユーザーのulimitを使用します。smbdプロセスで開始されたulimitや、ルートのulimitは使用しません。 /etc/security/limits.confは、これを設定する場所です。pam_limits.soを使用するように/etc/pam.d/common-session-noninteractive/etc/pam.d/sambaのどちらかを適切に構成したら、

他の問題については、ユーザーが1024のハード制限と1024のソフト制限で動かなくなっていたため、いくつかの問題が組み合わさっていました。何よりもまず、/etc/pam.d/sshdを指定しても、/etc/ssh/sshd_configを「UsePAM yes」に変更しない限り、sshデーモンはPAMを使用しません。デフォルトは "no"であり、PAMを使用しない場合、pam_limits.so(limits.confの適用を担当)は機能しません。

代わりに、非PAMログインのデフォルトのulimitはpid 1(通常は「init」)を継承しているようです。これらのデフォルトのpid 1制限はcat /proc/1/limitsで確認できます。残念ながら、私が知る限り、これらの制限はカーネルのデフォルトとして設定されています。カーネルを再コンパイルしたり、PAM以外のアプリケーションにPAMを使用するように説得したりしない限り、それらを変更する方法はないようです。

また、cat /proc/<anypid>/limitsは、問題が発生している可能性がある特定のプロセスの制限をデバッグするための優れた方法であるというアドバイスも提供したいと思います。もっと早く発見できたらよかったのに。

8
cecilkorik

私はubuntu 14.04 ltsで作業しており、次のことを実現するために数時間を要しました:

  • samba-ad-dcはupstartのstartetであるため、/ etc/security/limits.confの設定は関係ありません。
  • 制限は/etc/init/samba-ad-dc.confファイルのスタンザで定義されます
  • 次のコードを挿入した行が必要でした。

    制限なしファイル16384 16384

再起動がすべて正常に機能した後、ps axはsambaのプロセスIDを通知し、cat/proc/799/limitsはプロセス799の正しい最大オープンファイル制限を示します(プロセスIDと799を交換します)。

2
Klaus Weise

おそらくSambaの初期化スクリプトにはulimit -SHn 1024 初期化?見る /etc/init.d/smbまたはあなたの初期化スクリプトが何であれ。

0