    !==
    !== Speed.txt for Samba release 2.0.7 26 Apr 2000
    !==

    翻訳者: 中野武雄 <nakano@apm.seikei.ac.jp>
    更新日: July 1999
    主題:	Samba の性能について (Samba performance issues)
    ============================================================================

    このファイルでは、Samba サーバの速度を向上させる方法について、その
    概要を述べます。

    比較対象
    --------

    Samba サーバはクライアントとの通信に TCP を用います。したがってサーバ
    が良好に動作しているかを知りたい場合には、同じく TCP プロトコルを使って
    いるプログラムと比べなければなりません。比較対象にする TCP ベースの
    ファイル転送プログラムとしては、 ftp か、他の SMB/TCP サーバがもっとも
    入手が簡単でしょう。

    NT や WfWg サーバなどと比較したい場合は、クライアントかサーバのいずれ
    かで、 TCP 以外のプロトコルを全て無効にしなければなりません。さもなけ
    れば TCP とは全く異なるプロトコル (NetBEUI など) が通信に用いられてし
    まいますから、比較しても意味がありません。

    通常 Samba は、 ftp と同等の転送速度になるでしょう。 NFS よりはだい
    ぶ速いと思います。しかしこれらはシステムに強く依存します。

    Samba と Novell, NFS, WinNT などとの比較に関しては、何人かの人からレポー
    トが出ています。 Samba が最速の場合もあれば、もっとも遅い場合もあるよう
    です。個人的には、このような比較において重要となる要素は、ソフトウェア間
    の違いではなく、さまざまなシステムでそれぞれ用いられているハードウェアや
    ドライバの違いだと思っています。同じようなハードウェアを揃えれば、
    Samba は他のシステムと、速度の点において充分競合できるはずです。

    OPLOCKS
    -------

    oplock (opportunistic lock: 便宜的ロック) とは、 SMB クライアントが
    ファイル操作をローカルにキャッシュする許可を、サーバから取得する手法の
    ことです。サーバが oplock を与えると、クライアントは自分だけがその
    ファイルにアクセスしているとみなして、積極的にファイルのデータを
    キャッシュしようとします。 oplock のタイプによっては、クライアントは
    ファイルの open/close 操作さえもキャッシュします。これによって、性能は
    非常に向上します。

    Samba 1.9.18 のリリースからは、この opportunistic lock が正しくサポート
    されています。これはデフォルトでは有効になっていますが、共有単位で
    無効に切り替えることができます。用いるパラメータは以下です。

    oplocks = False

    しかし我々は oplock を有効にしておくほうをお薦めします。 NetBench を
    用いた現在のベンチマークでは、有効にしておいたほうがおよそ 30% ほども
    速度が向上しています。これは平均の値であって、クライアントのリダイレクタの
    動作によっては、体感速度が何倍も向上することさえあります。

    Samba 1.9.18 以前には、 'fake oplocks' と言うオプションがありました。
    これも過去との互換性を保つために残してありますが、今となっては使用
    すべきではありません。このルーチンが行う動作に付いて、以下にまとめて
    おきます。

    LEVEL2 OPLOCKS
    --------------

    Samba 2.0.5 は新しい機能 - level2 (読み込み専用) oplock がサポートされ
    ました(ただし既定では、このオプションはオフになっています。詳細に付いては
    smb.conf のマニュアルページを参照してください)。level2 oplock を
    (共有毎に)有効にするには、以下のようにパラメータを設定してください。

        level2 oplocks = true

    これで、通常は書き込みされないファイル、例えばアプリケーション共有など
    (Microsoft Office 共有のように、共通の実行ファイルが格納されている共有)
    への同時アクセスが高速化するはずです。それは、クライアントがこれらの
    ファイルをキャッシュから先読みすることが可能になるからです。

    以前の 'fake oplocks' オプション (使わないこと)
    -----------------------------------------------

    oplock 動作をするように Samba を見せかけることができます。これは
    クライアントから来た oplock 要求を全て与えるようになっています。
    smb.conf のオプション "fake oplocks" によって設定できます。 "fake
    oplocks = yes" とすると、クライアントは open 動作を行うたびに、積極的
    にキャッシュをするようになります。

    'fake oplocks' は、リードオンリーの共有や、一度に一つのクライアントから
    しかアクセスされないことが保証されている共有に用いると、各種の動作にお
    いて非常に性能が向上するでしょう。しかし複数のクライアントが、ファイル
    に対して同時に読み書きを行うような共有にこれを用いると、おそらくデータ
    が破壊されてしまうでしょう。

    ソケットオプション
    ------------------

    Samba のような TCP ベースのサーバでは、サーバの性能に強い影響を
    及ぼすようなソケットオプションが多数存在します。

    Samba が用いるソケットオプションは、コマンドラインの -O オプションと
    smb.conf ファイルのどちらでも指定することができます。

    smb.conf のマニュアルページにおける "socket options" セクションでは、
    これらの指定方法と、おすすめの値とが記述してあります。

    ソケットオプションを適切な値にすると、性能が非常に向上することが
    あります。しかし間違った値にすると、同じように非常に性能が低下すること
    もありえます。正しい設定は使っているネットワークに強く依存します。

    数あるオプションの中でも、単独で大きな影響を及ぼすものとして
    TCP_NODELAY が挙げられます。 "socket options = TCP_NODELAY" を設定する
    ことによって、 Samba ドライブの読み出し性能が倍加した、という報告が
    多くの人々からなされています。これに対する最もわかりやすい解釈は、
    Microsoft の TCP/IP スタックでは tcp の ACK を送るのが遅い、という
    ものでした。

    読み取りサイズ (read size)
    --------------------------

    "read size" オプションは、ディスクの read/write とネットワークの
    read/write とのオーバーラップに影響することになります。 SMB のコマンド
    (現在あるのは SMBwrite, SMBwriteX, SMBreadbraw) によって転送されるデータの
    分量が、この値よりも大きくなると、サーバはすべてのパケットをネットワーク
    から受け取る前にディスクへの書き込みを開始します (逆に SMBreadbraw の
    場合は、すべてのデータをディスクから読み取る前にネットワークへの出力を
    開始します)。

    このオーバーラップ動作は、ディスクとネットワークのアクセス速度が同程度の
    時にもっともうまく機能します。逆にどちらか一方が他方に比べて非常に高速な
    場合は、あまり影響を持ちません。

    デフォルトの値は 16384 ですが、この値を決めるために多数の実験を行った
    わけでは全くありません。また、この値についても、最適値はシステムに
    よって非常に異なると考えられます。ただし 65536 以上の値は意味がなく、
    不必要なメモリを割り当てるだけの結果となってしまうでしょう。

    転送の最大値 (max xmit)
    -----------------------

    起動時に、クライアントとサーバは "maximum transmit" サイズの
    ネゴシエーションを行います。この値は、ほぼすべての SMB コマンドに
    おける転送サイズの上限値となります。 smb.conf で "max xmit =" オプション
    を指定すれば、 Samba がネゴシエーションに用いるサイズの値を指定できます。
    ただし、これは Samba が SMB 要求の最大値として受け入れる値であって、
    「クライアントが受け入れる最大値」ではないことに注意して下さい。
    クライアントが受け入れる最大値は、クライアントから Samba へ送られます。
    Samba はこの制限値を用いることになります。

    この値は、デフォルトでは 65536 (指定できる最大の値です) となっています。
    しかしこの転送サイズを小さくすると、クライアントによっては性能が向上する
    こともあります。しかし 2048 よりも小さくすると、かなりまずい結果となる
    でしょう。

    ほとんどの場合はデフォルトが最適のオプションだと思います。

    ロッキング (locking)
    --------------------

    デフォルトでは、 Samba は strict locking (厳密なロック動作) をそれぞれ
    の read/write 呼び出しに対して行うことはしません (以前のバージョンでは
    行っていましたが)。 strict locking は "strict locking = yes" によって
    有効になりますが、システムによっては非常に性能が低下することがあります。

    性能の低下は、おそらく NFS マウントされたファイルシステムでより大きい
    でしょう。しかしローカルなディスクでも、大きな性能低下はありえます。

    共有モード (share modes)
    ------------------------

    ファイルのオープンに非常に時間がかかる、という報告がいくつかあるようです。
    この原因は多くの場合、 "share modes" のコードが、 dos share mode 機能の
    フル実装を要求するからです。このコードは "share modes = no" とすることに
    よって無効にできます。これによってファイルのオープン・クローズはかなり
    高速化されるでしょう。しかし一方で、あるユーザーが read-write オープン
    しているファイルを次のユーザがオープンしようとしたときに、システムは
    このオープンをリードオンリーに強制することができなくなるかもしれません
    (場合によっては、ですが)。独自のファイルロックを用いているアプリケー
    ションでは、これは問題になることはないでしょう。しかし問題になるアプリ
    ケーションもあるかもしれません。ほとんどの Windows アプリケーションは、
    "share modes" が正しく動作していることを仮定しているので、この場合は
    Samba の share mode サポートをデフォルトの "on" にしておかなければ
    ならないでしょう。

    Samba の share mode コードは 1.9.17 リリースで書き換えられました。
    これは Ziff-Davis NetBench PC Benchmarking tool によるテスト結果を
    反映したものです。 Samba 1.9.17 の share modes の実装は、 Windows NT
    とほぼ同様のものになっているはずです。

    追記: より最近のバージョンでは、 share modes の実装に mmap() によって
    共有メモリを用いるオプションが追加されています。これは動作をさらに高速
    化します。これを有効にする方法については Makefile を見て下さい。

    ログのレベル (log level)
    ------------------------

    log level ("debug level" も同じ) を 2 以上にすると、性能は大きく低下
    するでしょう。これはサーバがオペレーションのたびにログファイルをフラッ
    シュするからであり、これは非常に高くつく作業だからです。

    リンクの追跡 (wide links)
    -------------------------

    "wide links" オプションは、現在ではデフォルトで有効になっています。
    (セキュリティを強化するために) 無効にすることもできますが、この場合は
    ファイル名の解決の性能が低下します。この性能の低下は "getwd cache = yes"
    とすることによって抑えることができます (この設定はデフォルトです)。

    raw モードの読み込み (read raw)
    -------------------------------

    "read raw" 動作は、ファイルの読み込み動作の反応を速くし、最適化する
    ために設計されたものです (ただしすべての SMB サーバに必須の機能では
    ありません)。 Samba ではデフォルトで有効になっていますが、オプション
    で無効にすることもできます。

    クライアントによっては "read raw" をうまく扱うことができず、これまでの
    read 動作よりも性能が低下してしまうこともありえます。

    ですから "read raw = no" としてみて、ネットワークがどうなるか試してみ
    ると良いでしょう。性能が低下するかもしれませんし、向上するかも、変化し
    ないかもしれません。これは実験してみないとわかりません。

    raw モードの書き込み (write raw)
    --------------------------------

    "read raw" 動作は、ファイルの書き込み動作の反応を速くし、最適化する
    ために設計されたものです (ただしすべての SMB サーバに必須の機能では
    ありません)。 Samba ではデフォルトで有効になっていますが、オプション
    で無効にすることもできます。

    マシンによっては "write raw" が通常の書き込み動作よりも遅くなることも
    ありえます。この場合はオプションを変更すると良いでしょう。

    先読み (read prediction)
    ------------------------

    Samba は SMB コマンドのいくつかにおいて、先読み動作を行うことができます。
    これは、 Samba サーバが SMB コマンドを待っている間に、最後に読んだ
    ファイルの余分なデータを読んでおくようになることを意味します。これに
    よって、次の読み込み要求が到着したときの反応が向上します。

    これはデフォルトでは無効になっています。 "read prediction = yes" と
    することによって有効にできます。

    先読みは、リードオンリーでオープンされたファイルに対してしか用いられ
    ません。

    先読みは、ファイルからの読み込みを、少しずつ多数回行うような間抜けな
    クライアント (NT での「ライト(WRITE.EXE)」など) に対して特に有効でしょう。

    Samba は "read size" オプションで指定された量以上の先読みは行いません。
    また常に 1k ブロックの境界までの先読みを行います。

    メモリマッピング
    ----------------

    Samba はメモリマッピングによるファイルの読み出しをサポートしています。
    マシンによっては、これによって性能が非常に向上します。全く変わらなかっ
    たり、逆に性能が落ちることもあるかもしれません。

    有効にするには、 -DUSE_MMAP オプションを Makefile の FLAGS 行に指定して、
    Samba を再コンパイルする必要があります。

    メモリマッピングはリードオンリーでオープンされたファイルに対してのみ有効
    です。また "read raw" 動作の際には用いられません。したがって、メモリ
    マッピングの方が有効であるかどうかを調べるには、 "read raw = no" として
    "read raw" を無効にする必要があります。

    遅いクライアント
    ----------------

    ある人のレポートによれば、プロトコルを LANMAN2 から COREPLUS に変更する
    ことで、劇的な速度の向上が見られたそうです (10k/s -> 150k/s)。

    おそらく彼の PC (386sx16 ベース) は、扱うことのできるより以上のデータを
    要求していたのでしょう。プロトコルを変えるのではなく、 "read raw = no"
    や "max xmit = 2048" とすることによってもおそらく同じような速度の向上が
    期待できるのではないかと思います。 "read size" を減らすことも効果が
    あるでしょう。

    ログインが遅い
    --------------

    ログインが遅いのは、ほとんどすべての場合、パスワードのチェックに要する
    時間のせいです。 "password level" を、実際に必要な最低限の値にすることに
    よって、速度は大きく向上します。 Makefile で "UFC crypt" オプションを
    有効にすることもできます。

    クライアントのチューニング
    --------------------------

    速度の問題はクライアントにあることも多いです。そのようなクライアント
    (例えば Windows for Workgroups) では、たいてい TCP の性能を向上させる
    ようなチューニングが可能です。

    クライアントのドキュメントを注意して読んでください。特に、 WfWg の
    TCPWINDOWSIZE や TCPSEGMENTSIZE は、性能に非常に影響するらしいです。

    何人かの報告によれば、 WfWg で SYSTEM.INI ファイルの [MSTCP] セクション
    中の DefaultRcvWindow を 3072 に設定することによっても、大きな向上が
    見られるそうです。理由は知りませんが。

    個人的な経験では、 DefaultRcvWindow を大きな値 (16384 以上) にすること
    によって、ずっと性能が向上したことがありました。他の人々の報告では、
    3072 以上ではずっと速度が低下するのだそうです。ある人によれば、 3072
    から 8192 にすることによって速度が 1/30 にも低下することもあるのだそう
    です。理由はわかりません。

    おそらくこれはハードウェアや、接続先の unix マシンのタイプに強く依存
    するのでしょう。

    私の結果
    --------

    このような文書においては、実際の数値を知りたい人も入るようですので、
    ここに記しておきます。私は WfWg 3.11 に 3.11b の tcp/ip スタックを用いた
    486sx33 クライアントを使っています。これは ISA バスのイーサネットカード
    SMC Elite-16 を使っています。 WfWg に対して私が行ったチューニングは、
    system.ini [MSTCP] セクションの DefaultRcvWindow を 16384 だけです。
    サーバは Linux の 486dx3-66 です (訳注 dx2 ?)。こちらは 20Mb の RAM と
    SMC Elite-16 を搭載しています。私のサーバの設定は、配布されている
    Samba の examples/tridge/ サブディレクトリを見て下さい。

    8Mb のファイル copy で読み取ると、 490k/s という値になりました。
    同じファイルを Samba サーバに書きこむときは、 441k/s でした。

    もちろん単純なスループットの値以外にもベンチマークはたくさん考えられる
    でしょうが、とりあえずの目安にはなるでしょう。

    Win95 や WinNT でも試してみたところ、 WinNT が Samba のクライアントと
    しては最速でした。しかしそれ以上の速度を示すクライアントが (私の場合に
    は) ありまして、それは他の linux マシンからの smbclient でした。いつか
    この文書にもそれらの結果を載せたいと思っています...

    ==翻訳者謝辞==
    本文書の翻訳作業においては、 samba-jp ML 上でちゃぷさん、佐藤さん、
    篠原さんより、数多くの貴重なご意見やご指摘をいただきました。