我有一个 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。
重新启动后,问题解决,传输保持一致的速度,一切运行顺利。