为什么 Samba 占用大量 RAM?

为什么 Samba 占用大量 RAM?

在 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 共享执行任何操作

  • 当前状态:
      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
    
    有趣的是,后来它同时消耗了 RAM 和 CPU:
      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

临时解决方案! 这不是解决该问题的实际方法,但对我来说非常有效。

  1. (sudo) crontab -e
  2. 根据您的喜好选择nanovim。(如果您尚未选择)
  3. 在文件中,添加以下行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 使用情况。对我们来说,tophtop没有准确显示 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 中的部分缓存。我们尝试每分钟运行一次该命令,只是为了测试它在进行文件传输时的稳定性,结果很好。

我希望这能解决问题!!

相关内容