FreeBSD:Samba 吞噬内存

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 - MacOS Sierra - 连接到 5ghz AC 无线网络。连接到千兆路由器的文件服务器(Netgear Nighthawk x4 r7500)

我刚刚构建了这个文件服务器来替换我之前的 ubuntu 文件服务器(没有这个问题)

我让它为虚拟机管理程序提供 NFS 共享(工作正常),并为我的 Mac 提供 Samba 共享。

我是samba46从 ports 集合安装的。这是我的 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

该共享是一个名为 ZFS 池data,具有单个 3TB Western Digital 红色驱动器。

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

问题:

我可以很好地连接到共享。但是,如果我尝试向它传输任何内容,它就会吃掉所有内存。如果我top在传输 2GB 文件时运行,我可以看到内存使用量上升,似乎已经超出上限并留下470M可用内存。

这是top传输 3 x 2GB 文件后的情况。

    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 问题而不是 samba 问题。如果我发现任何其他信息,我会更新。

答案1

问题samba根本不在于,而在于ZFS arc cache

ZFS arc 缓存使用物理内存,并且由于没有设置限制,ZFS 在传输文件时将使用所有系统内存作为缓存(我一次传输大约 200GB 的文件,其中包含一些 30-60 GB 的文件)。要解决此问题,请对arc cache能够使用的最大内存量设置限制。

作为 root,使用您最喜欢的文本编辑器进行编辑loader.conf,我将使用nano.

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

添加以下行来设置 arc_max 限制。

vfs.zfs.arc_max="1G"

这告诉 ZFS 为其弧缓存使用最多 1GB。

重新启动后,问题解决,传输保持一致的速度,一切运行顺利。

相关内容