web-dev-qa-db-ja.com

FreeBSD:Sambaがメモリを食べる

私はfreebsdファイルサーバーを持っています

root@vstorage:~ # freebsd-version 
11.1-RELEASE-p1

ここにいくつかの追加情報があります。

root@vstorage:~ # dmesg | grep CPU:
CPU: AMD Phenom(tm) 9750 Quad-Core Processor (2400.05-MHz K8-class CPU)

root@vstorage:~ # dmesg | grep memory
real memory  = 8589934592 (8192 MB)
avail memory = 8001138688 (7630 MB)

Sambaクライアント:MacBook Pro-MacOSSierra-5GHzのACワイヤレスネットワークに接続されています。ギガビットルーターに接続されたファイルサーバー(Netgear Nighthawk x4 r7500)

以前持っていたubuntuファイルサーバー(この問題はありませんでした)を置き換えるために、このファイルサーバーを構築しました

ハイパーバイザーにNFS共有を提供し(正常に動作)、MacにSamba共有を提供しています。

Portsコレクションからsamba46をインストールしました。これが私のsmb4.confです。

root@vstorage:~ # cat /usr/local/etc/smb4.conf 
[global]
workgroup = WORKGROUP
server string = Samba Server Version %v
netbios name = vstorage
wins support = Yes
security = user
passdb backend = tdbsam
socket options = TCP_NODELAY IPTOS_LOWDELAY
read raw = yes
write raw = yes

[data]
path = /data
valid users = nullmeta
writable  = yes
browsable = yes
read only = no
guest ok = no
public = no
create mask = 0775
directory mask = 0775

共有はdataと呼ばれるZFSプールであり、3TBのウエスタンデジタルレッドドライブが1つあります。

root@vstorage:~ # zpool status
  pool: data
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    data        ONLINE       0     0     0
      ada1      ONLINE       0     0     0

errors: No known data errors

  pool: zroot
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    zroot       ONLINE       0     0     0
      ada0p3    ONLINE       0     0     0

問題:

共有に問題なく接続できます。しかし、何かを転送しようとすると、すべてのメモリが消費されます。 2GBのファイルの転送中にtopを実行している場合、メモリ使用量が増加するのを見ることができます。上限があり、470Mの空きメモリが残っているようです。

3 x2GBファイルを転送した後のtopは次のとおりです。

    root@vstorage:~ # top

    last pid: 23995;  load averages:  0.30,  0.28,  0.25    up 0+00:40:35  19:56:12
    33 processes:  1 running, 32 sleeping
    CPU:  0.0% user,  0.0% Nice,  0.1% system,  0.0% interrupt, 99.9% idle
    Mem: 59M Active, 23M Inact, 6099M Wired, 1503M Free
    ARC: 5674M Total, 17M MFU, 5610M MRU, 35K Anon, 14M Header, 32M Other
         5512M Compressed, 5675M Uncompressed, 1.03:1 Ratio
    Swap: 2048M Total, 2048M Free
PID USERNAME    THR PRI Nice   SIZE    RES STATE   C   TIME    WCPU COMMAND
 1122 root          1  20    0   228M 12544K select  1   0:00   0.07% nmbd
23994 root          1  20    0 20164K  2920K CPU3    3   0:00   0.04% top
  338 root          1  20    0  9564K  4844K select  3   0:00   0.02% devd
  411 root          1  20    0 10504K  1860K select  1   0:00   0.01% syslogd
  734 jeff          1  20    0 85232K  5808K select  2   0:00   0.00% sshd
  663 root          1  20    0 20640K  4600K select  1   0:00   0.00% sendmail
  561 root         32  52    0  8332K  2112K rpcsvc  3   0:00   0.00% nfsd
 1134 root          1  20    0   301M 17524K select  3   1:31   0.00% smbd
  558 root          1  20    0 12548K  2760K select  0   0:00   0.00% mountd
  786 root          1  20    0 19664K  3348K pause   3   0:00   0.00% csh
  631 root          1  20    0 64540K 26268K select  0   0:00   0.00% Perl
 1128 root          1  20    0   297M 16852K select  2   0:00   0.00% smbd
  543 root          1  20    0 10452K  1920K select  0   0:00   0.00% rpcbind
  560 root          1  23    0 10380K  2956K select  3   0:00   0.00% nfsd
 1130 root          2  20    0   297M 16196K select  3   0:00   0.00% smbd

わからないなぜそれは記憶を食べている。完全に使用されると、転送はゆっくりとクロールします。クレイジーな部分は、それもメモリを解放しないということです。共有を切断してSambaをリロードしても、何も起こりません。メモリを再利用する唯一の方法は、サーバーを再起動することです。これは、ストレージがオンラインに戻るまでハイパーバイザーを一時停止する必要があることを意味するため、非常にイライラします。

これはSambaの問題だと思ったので、再インストールし、ソケットオプションを構成し、読み取り/書き込みを行い、ログを無効にしました。しかし、それが私の問題だとは思いません。転送時にサンバがメモリを消費する根本的な原因を見つけることができないようです。任意の洞察をいただければ幸いです。

編集:これはSambaの問題ではなくZFSの問題だと思い始めています。追加情報があれば更新します。

2
nullmeta

問題はsambaにあるのではなく、ZFS arc cacheにあります。

ZFSアークキャッシュは物理メモリを使用し、制限が設定されていないため、ZFSはファイルを転送するときにすべてのシステムメモリをキャッシュとして使用します(30〜60 GBのファイルで一度に約200GBを転送していました)。これを修正するには、arc cacheが使用できるRAMの最大量に制限を設定します。

ルートとして、お気に入りのテキストエディタを使用してloader.confを編集します。nanoを使用します。

root@vstorage:~ # nano /boot/loader.conf

次の行を追加して、arc_max制限を設定します。

vfs.zfs.arc_max="1G"

これにより、ZFSはアークキャッシュに最大1GBを使用するようになります。

再起動後、問題は解決され、転送は一定の速度のままで、すべてがスムーズに実行されます。

4
nullmeta