在 Debian 4.2.10 上,Samba 在复制一些大文件和大量小文件时会占用大量 RAM。我该如何解决这个问题,因为我几乎要编写一个每 24 小时cron
重启一次的作业了?smbd
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1272 root 20 0 3829868 3.312g 1860 D 0.7 93.0 512:39.94 smbd
free -m
:total used free shared buffers cached Mem: 3644 3560 84 7 0 25 -/+ buffers/cache: 3533 110 # <--- this is what bugs me Swap: 4292 2146 2146
- 配置:
[global] server role = standalone server map to guest = Bad User obey pam restrictions = Yes pam password change = Yes passwd program = /usr/bin/passwd %u passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* . unix password sync = Yes syslog = 0 log file = /var/log/samba/log.%m max log size = 1000 dns proxy = No usershare allow guests = Yes panic action = /usr/share/samba/panic-action %d idmap config * : backend = tdb [homes] comment = Home Directories valid users = %S create mask = 0700 directory mask = 0700 browseable = No [printers] comment = All Printers path = /var/spool/samba create mask = 0700 printable = Yes print ok = Yes browseable = No [print$] comment = Printer Drivers path = /var/lib/samba/printers [media] # Unsure what this is, but it was a working share at one time path = /rem/media/ [rem] path = /rem/ force user = <rem owner username here> read only = No create mask = 0660 directory mask = 0770
重新启动smbd
服务似乎可以解决问题,但是大约 2 小时后它仍会再次出现:
- 停止
smbd
服务后,一切似乎正常:total used free shared buffers cached Mem: 3644 123 3521 8 3 36 -/+ buffers/cache: 83 3561 Swap: 4292 230 4062
- 看起来好像 Samba 在占用 RAM 的同时没有读取/写入任何内容:
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 1351 be/4 root 0.00 B/s 3.95 K/s 0.00 % 0.00 % smbd -D
使用@Hastur 的建议,问题已经解决了一半,我正在等待客户端继续索引/扫描/对他们的 Samba 共享执行任何操作
- 当前状态:
有趣的是,后来它同时消耗了 RAM 和 CPU:PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 18992 root 20 0 283140 8916 6584 S 1.0 0.2 0:00.32 smbd 18983 root 20 0 284048 14964 11752 S 0.7 0.4 0:00.16 smbd
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 18983 root 20 0 2964080 2.564g 6044 R 92.1 72.0 853:58.94 smbd
我限制了文件锁和连接的数量,但变化不大;它仍然疯狂地使用 RAM,但突然降低了 CPU 使用率:
-
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 24606 root 20 0 3768932 3.325g 2332 D 17.3 93.4 1441:50 smbd
答案1
临时解决方案! 这不是解决该问题的实际方法,但对我来说非常有效。
(sudo) crontab -e
。- 根据您的喜好选择
nano
或vim
。(如果您尚未选择) - 在文件中,添加以下行
0 [whatever hour (0-23) you want here] * * * service smbd restart
这将smbd
每天重新启动(Samba 守护进程)服务。
就像我说的,这不是最终的解决方案,因此如果有人有更好的解决方案,那么我会接受答案。
答案2
因此,我们在运行 Samba 版本 4.14 的 Debian 11 上有一个 Samba 共享,我们遇到了同样的问题。至少对我们来说,发生的事情是 Samba 不会清除它在 RAM 中缓存的文件。这导致我们所有的 RAM 和交换空间都填满了,然后服务器崩溃了。这种情况发生了几次,甚至导致一些数据损坏,这真是一团糟。
无论如何,为了安全起见,请找出在繁重的工作负荷下需要多长时间才能填满您的 RAM。对于我们来说,我们通过从多个客户端向 Samba 上传/下载数 GB 的图片和视频以及在我们网络上的每台 Mac 上进行 Time Machine 备份来解决这个问题。我们得到的答案是大约一个小时。
重要的提示:运行systemctl status smbd
以查看 RAM 使用情况。对我们来说,top
并htop
没有准确显示 Samba 使用了多少 RAM。
一旦获得该数字,将时间减半(对于我们来说是 30 分钟)并每 30 分钟在 crontab 中运行此命令:
sync; sync; echo 3 > /proc/sys/vm/drop_caches
我对这些命令的细微差别并不是很了解,但我可以告诉你的是:
该sync
命令将 RAM 中的所有内容提交到磁盘,假设其最终目的地是磁盘。运行该sync
命令两次以确保所有内容都已提交。该命令echo 3 > /proc/sys/vm/drop_caches
会刷新 RAM 中的部分缓存。我们尝试每分钟运行一次该命令,只是为了测试它在进行文件传输时的稳定性,结果很好。
我希望这能解决问题!!