Вопрос или проблема
На 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
ВРЕМЕННОЕ РЕШЕНИЕ!
Это не окончательный способ решения данной проблемы, но это идеально подходит для меня.
(sudo) crontab -e
.- Выберите
nano
илиvim
в зависимости от ваших предпочтений. (Если вы еще не выбрали) - В файле добавьте строку
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 и снизить использование оперативной памяти. Однако, в случае длительных проблем, рекомендуется обратиться в техническую поддержку или специализированные форумы для получения более детализированной помощи.