Почему Samba использует огромные объемы оперативной памяти?

Вопрос или проблема

На Debian 4.2.10 Samba использует огромное количество оперативной памяти при копировании нескольких больших файлов и множества мелких. Как мне это исправить, так как я очень близок к тому, чтобы написать задачу cron, чтобы перезапускать smbd каждые 24 часа?

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     # <--- это меня беспокоит
                 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               = *Введите\sновый\s*\пароль:* %n\n *Введите\sновый\s*\пароль:* %n\n *пароль\sуспешно\sобновлен* .
      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         = Домашние каталоги
      valid users     = %S
      create mask     = 0700
      directory mask  = 0700
      browseable      = No
    
    [printers]
      comment         = Все принтеры
      path            = /var/spool/samba
      create mask     = 0700
      printable       = Yes
      print ok        = Yes
      browseable      = No
    
    [print$]
      comment         = Драйверы принтеров
      path            = /var/lib/samba/printers
    
    [media]
      # Не уверен, что это, но это был рабочий общий ресурс когда-то
      path            = /rem/media/
    
    [rem]
      path            = /rem/
      force user      = <имя пользователя владельца rem>
      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 ничего не читает/не записывает, пока использует оперативную память:
     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
    

Я ограничил количество блокировок файлов и соединений, с небольшими изменениями; он по-прежнему использует оперативную память как сумасшедший, но внезапно снизил использование 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.
  2. Выберите nano или vim в зависимости от ваших предпочтений. (Если вы еще не выбрали)
  3. В файле добавьте строку 0 [любой час (0-23), который вы хотите здесь] * * * service smbd restart

Это будет перезапускать smbd (демон Samba) каждый день.

Как я уже сказал, это не окончательное решение, так что если кто-то имеет лучшие решения, ТО я приму ответ.

Итак, у нас есть общий ресурс Samba на Debian 11, работающий на версии Samba 4.14, и у нас была та же проблема. Что происходит, по крайней мере для нас, так это то, что Samba не очищает файлы, которые он кэширует в RAM. Это привело к заполнению всей нашей оперативной памяти и свопа, и затем сервер завис. Это происходило несколько раз, даже вызвав повреждение данных, что было настоящей бедой.

В любом случае, чтобы быть в безопасности, выясните, сколько времени необходимо, чтобы заполнить вашу оперативную память под высокой нагрузкой. Для нас мы выяснили это, загрузив/скачивая много гигабайт фотографий и видео на Samba от нескольких клиентов, а также выполняя резервные копии Time Machine на каждом Mac в нашей сети. Ответом для нас было около часа.

Важно: Запустите systemctl status smbd, чтобы увидеть использование RAM. Для нас top и htop не показывали точно, сколько RAM использует Samba.

Как только вы получите это число, уменьшите время вдвое (для нас 30 минут) и выполняйте эту команду в crontab каждые 30 минут:

sync; sync; echo 3 > /proc/sys/vm/drop_caches

Я не имею лучшего понимания нюансов этих команд, но вот что я могу вам сказать:

Команда sync фиксирует все, что находится в RAM, на диске, предполагая, что его конечное назначение – диск. Запустите команду sync дважды, чтобы убедиться, что все зафиксировано. Команда echo 3 > /proc/sys/vm/drop_caches очищает часть кэша в RAM. Мы пробовали выполнять команду каждую минуту, чтобы проверить стабильность этого процесса во время передачи файлов, и все было в порядке.

Надеюсь, это решит проблему!!

Ответ или решение

Когда Samba использует чрезмерное количество оперативной памяти, эта проблема может быть вызвана рядом факторов, связанных с конфигурацией, особенностями работы системы и самим программным обеспечением. В данном случае, работая на Debian 4.2.10, вы наблюдаете, что процесс smbd занят при копировании данных, в то время как оперативная память заполняется, что приводит к ухудшению производительности системы.

1. Причины использования памяти

Кэширование и уз Bottleneck
Samba, как и многие файловые серверы, использует кэширование для повышения производительности. При интенсивных операциях чтения и записи, особенно когда речь идет о больших файлах, Samba может заполнять кэш, в результате чего память, используемая для хранения данных, не освобождается. Вы можете заметить, что после перезапуска сервиса smbd оперативная память снижается, но со временем опять заполняется. Это говорит о том, что Samba не очищает данные из кэша должным образом.

Отсутствие механизма управления памятью
При значительном количестве одновременно открытых файлов или подключенных клиентов можно столкнуться с нехваткой памяти, что приводит к её переполнению. Это особенно актуально, если конфигурация сервера не учитывает реальное рабочее окружение.

2. Конфигурация Samba

После осмотра вашей конфигурации Samba можно выделить несколько пунктов, которые могут стать проблемой:

  • Параметры, связанные с контролем доступа и масками прав, могут быть оптимизированы для уменьшения нагрузки на память.
  • Возможно, стоит рассмотреть возможность ограничения числа одновременно активных соединений или активных файловых блокировок, что может помочь снизить использование ресурсов.

3. Рекомендации

Регулярное очищение кэша
Как временное решение, вы правильно указали, что запуск cron-job для перезапуска smbd может помочь, но это не является оптимальным решением. Как альтернатива, вы можете настраивать использование памяти путем добавления команд для сброса кэша в cron. Например, команду sync; echo 3 > /proc/sys/vm/drop_caches можно запускать с заданным интервалом, чтобы удалить ненужные кэши и улучшить использование памяти.

Обновление Samba
Данная версия Samba (4.2.10) достаточно старая, и перейти на более позднюю версию может решить проблемы с управлением памятью, так как новые версии программного обеспечения часто содержат исправления для известных проблем.

Мониторинг использования ресурсов
Помимо системного ресурса top, вы можете использовать systemctl status smbd для мониторинга реального использования памяти, так как это может дать более точную картину. Также стоит обратить внимание на использование возможностей логирования Samba, чтобы выявить возможные проблемы.

4. Заключение

Если вы продолжаете сталкиваться с проблемами использования памяти, упомянутые выше методы должны помочь вам в разрешении ситуации. Внимательный анализ конфигурации, использование механизмов управления памятью и регулярное обновление программного обеспечения могут значительно улучшить производительность Samba и снизить использование оперативной памяти. Однако, в случае длительных проблем, рекомендуется обратиться в техническую поддержку или специализированные форумы для получения более детализированной помощи.

Оцените материал
Добавить комментарий

Капча загружается...