вторник, 11 августа 2015 г.

WD My Cloud. Постоянное сканирование контента.

Сегодня речь пойдет о замечательном NAS от WD серии MyCloud счастливым обладателем которого я являюсь. Не так давно, может полгода назад, я купил себе этот девайс с 3Tb WD Red внутри и какое-то время был доволен. Функции NAS, Samba-сервера, NFS, а также DLNA-сервера в домашней сети он выполнял отлично. В результате и на всех ПК была общая сетевая шара, и с местом для создания различных backup'ов проблем не возникало, и различных мультимедия контент, закачанный на него, смотрелся без проблем на всех устройствах, включая LED'овский ТВ от Samsung с функцией Smart TV. До того момента пока я не решил сохранить на него backup одного GIT'а объемом в 60 Gb более чем с миллионом мелких файлов внутри (т.е. фактически просто одна папка весом в 60 Gb, но с более чем миллионом файлов внутри). Продолжался процесс копирования информации на него больше двух суток, т.к. даже при гигабитном линке такое количество файлов обрабатывается достаточно долго и скорость интерфейса тут фактически ни на что не влияет. Так или иначе файлы успешно залились, но после этого с устройством начали происходить странные вещи.

То ляжет web-интерфейс, при попытке зайти на него отображается connection refused, то он вообще выпадет из сети, и как samba, и как dlna, принимая только ping'и, а то и вообще перестанет отвечать на любые запросы из сети. При этом если подойти к нему, то даже слышно, как он активно делает что-то с HDD. Т.е. фактически устройство чем-то занято. И хотя я давал себе слово не трогать эту шайтан-коробку, т.к. работает и ладно (о том что к ней можно прикрутить торрент-клиент и т.п. я знаю, просто хотел не вмешиваться и использовать именно штатный функционал), ситуация заставила. Первое что я сделал это включил SSH и посмотрел список процессов top'ом, как мы видим - загрузка CPU 100%:


В web-интерфейсе при этом отображались "потуги" над сканированием более чем миллиона файлов контента:


Как я понял, помимо всего прочего, он создает полную базу данных всех файлов на устройстве в /shares/.wdmc/wdmc.db ... Т.е., к примеру, у меня есть ресурс Decker, для которого в web-интерфейсе "Доставка м-медиа" и "Открытый доступ" выключены (именно туда я залил папку с git'ом) Однако, насколько я вижу в SQLite Viewer'е все файлы из Decker перечислены в БД /shares/.wdmc/wdmc.db. В результате размер файла wdmc.db - около 1 Гб.

Т.е. как мы видим он сканирует весь контент, даже в шарах для которого сканирование контента явно выключено в настройках (интересно, зачем ему понадобилось сканирование моего git'а ;) 

В результате весь процесс получается достаточно ресурсоемким, база в папках .wdmc разрастается до огромных размеров, что и сказывается на подобном поведении устройства (представьте себе, мы имеем папку с миллионом мелких файлов, имя каждого файла и путь к нему, плюс некоторая другая информация заносится в SQLite базу, при определенных условиях служебная информация об этих файлах в базе может заниматься больше места, чем сама информация в файлах, которые он отсканировал). Как я понял из различных форумов:
Люди вообще отключают сканирование контента на нем, т.е. disable'ят демоны wdmcserverd и dphotodbmergerd и спят спокойно. Но я решил разобраться как оно работает, и отключить сканирование контента только для одной папки /shares/decker, в которой и находилась моя "куча файлов", а для остальных оставить.

Что удалось разобрать в ходе быстрого исследования как оно работает. Список томов для сканирования берется с помощью скрипта GetVolumes.py, который в свою очередь тащит список томов из SQLite orion.db и помещает их в /tmp/Volumes.xml. В результате там получается что-то вроде:

<?xml version = "1.0"?>
<Volumes>
    <Volume>/shares</Volume>
</Volumes>

Еще как я понял сам демон /usr/local/wdmcserver/bin/wdmcserver берет информацию о том что сканировать, а что нет из /usr/local/wdmcserver/bin/wdmc.xml. В нем есть тег PathFilters с ExcludePatterns.

Что сделал я?

1. Остановил демоны:

/etc/init.d/wdmcserverd stop
/etc/init.d/wdphotodbmergerd stop

2. Удалил папку .wmdc в каждом ресурса и в корне /shares
3. Вписал в /usr/local/wdmcserver/bin/wdmc.xml внутри <PathFilters><ExcludePatterns> тег <ExcludePattern>/*/decker$</ExcludePattern>
4. Сделал через web-интерфейс Параметры -> Служебные программы -> Сброс настроек системы -> [Только система] сброс (без этого база почему-то корректно не пересоздавалась).

Результат:



Как видно, пересканировать /shares/decker он уже не полез. Т.е. там находится миллион с лишним файлом, однако в графе "Другое" отображается всего 1115, что вроде как правильно.

Может быть когда-нибудь я и приду к тому, чтобы отключить wdmcserverd совсем. Но пока достигнутый результат меня устраивает. Я хотел отключить сканирование файлов в папке /shares/decker, т.е. на ресурсе decker - я отключил его. Посмотрим что будет дальше.

p.s. В итоге я все-таки дополнительно сделал вот так:

/etc/init.d/wdmcserverd stop
/etc/init.d/wdphotodbmergerd stop
update-rc.d wdphotodbmergerd disable
update-rc.d wdmcserverd disable
Т.е. запретил это сканирование совсем. Клиентом MyCloud для мобильных устройств я не пользуюсь, так что не думаю, что я сильно потерял в функционале.

Обновлено 09.09.2015 13:46 (MSK)

Еще в устройстве есть интересный файл конфигурации /usr/local/config/wdnotifier.conf , в котором также можно задать exclude_share для сервиса wdnotifier. По хорошему надо разобраться за что в устройстве отвечает wdmcserver, а за что wdnotifier.

Обновлено 11.09.2015 05:24 (MSK)

Ну и еще один способ с решением проблемы сканирования контента на ресурсе (шаре) с кучей мелких файлов. Заходим на NAS через SSH и удаляем файлы wdmc.db, wdmc.db-shm и wdmc.db-wal в /shares/.wdmc/. Напомню что папки содержащие множество (миллионы) мелких файлов у меня хранились в /shares/decker.

Далее в файл /usr/local/wdmcserver/bin/wdmc.xml я добавил следующие строки в соответствующий раздел:

<ExcludePattern>/*/decker$</ExcludePattern>
<ExcludePattern>/*/decker/*</ExcludePattern>

А в файл /usr/local/config/wdnotifier.conf строку:

exclude_share=/shares/decker

После чего сделал reboot и подождал перестроения SQLite базы в wdmc.db, по итогам ее размер получился всего 30 Mb, вместо 1.5 Gb, которые были до этого (естественно что бедный CPU NAS'а просто не мог быстро переварить такой огромный объем базы, а отсюда были и тормоза в WebUI и т.п. проблемы). После этого WebUI просто летает. Кстати, успел еще обновиться тут до v04.04.00-303 и теперь это выглядит вот так:



5 комментариев :

  1. >>>"всего 30 Mb, вместо 1.5 Tb,"
    Может все же 1.5 Gb?

    ОтветитьУдалить
    Ответы
    1. Да, вы правы ... "очепятался" ... База wdmc.db весила 1.5 Gb, но и этого хватало чтобы web-морда висла по черному.

      Удалить
  2. А как можно просто вообще это сканирование отключить? Я хочу заходить просто в папки расшаренного диска WD My Cloud. Работать часто просто невозможно совсем, зависает намертво со своими процессами которые мне совсем не уперлись...

    ОтветитьУдалить
  3. root@WDCloud root # /etc/init.d/wdmcserverd stop
    Stopping wdmcserver
    root@WDCloud root # /etc/init.d/wdphotodbmergerd stop
    Stopping wdphotodbmerger
    sh: you need to specify whom to kill
    root@WDCloud root # update-rc.d wdphotodbmergerd disable
    -sh: update-rc.d: not found
    root@WDCloud root # update-rc.d wdmcserverd disable
    -sh: update-rc.d: not found

    ОтветитьУдалить
  4. Мучился почти неделю и выключал сканирование а потом посмотрел твою статью нашел базу размером в 1.7 ГБ и всё стало на свои места..
    Другими словами - огромное тебе свпасибо за статью и это именно то, что нужно было)

    ОтветитьУдалить