Диск загружен при запуске stroj на docker

Всех приветствую.

Есть 2 ноды на одном узле, на разных дисках. Как только на одной ноде объем начал подходить к 2Тб, на диск стала высокая нагрузка, дашборд не загружается, есть сбор данных через grafana + Prometheus (данные с этой ноды не идут). Если перезагрузить контейнер, то данные идут, дашборд работает минуты 3, после чего опять тоже самое. В логах иногда ошибка:
ERROR piecestore failed to add bandwidth usage {“Process”: “storagenode”, “error”: “bandwidthdb: database is locked”, “errorVerbose”: “bandwidthdb: database is locked\n[tstorj.io/storj/storagenode/storagenodedb.(*bandwidthDB).Add:60](http://tstorj.io/storj/storagenode/storagenodedb.(*bandwidthDB).Add:60)\n[tstorj.io/storj/storagenode/piecestore.(*Endpoint).beginSaveOrder.func1:724](http://tstorj.io/storj/storagenode/piecestore.(*Endpoint).beginSaveOrder.func1:724)\n[tstorj.io/storj/storagenode/piecestore.(*Endpoint).Upload:436](http://tstorj.io/storj/storagenode/piecestore.(*Endpoint).Upload:436)\n[tstorj.io/common/pb.DRPCPiecestoreDescription.Method.func1:220](http://tstorj.io/common/pb.DRPCPiecestoreDescription.Method.func1:220)\n[tstorj.io/drpc/drpcmux.(*Mux).HandleRPC:33](http://tstorj.io/drpc/drpcmux.(*Mux).HandleRPC:33)\n[tstorj.io/common/rpc/rpctracing.(*Handler).HandleRPC:61](http://tstorj.io/common/rpc/rpctracing.(*Handler).HandleRPC:61)\n[tstorj.io/drpc/drpcserver.(*Server).handleRPC:122](http://tstorj.io/drpc/drpcserver.(*Server).handleRPC:122)\n[tstorj.io/drpc/drpcserver.(*Server).ServeOne:66](http://tstorj.io/drpc/drpcserver.(*Server).ServeOne:66)\n[tstorj.io/drpc/drpcserver.(*Server).Serve.func2:112](http://tstorj.io/drpc/drpcserver.(*Server).Serve.func2:112)\n[tstorj.io/drpc/drpcctx.(*Tracker).track:52](http://tstorj.io/drpc/drpcctx.(*Tracker).track:52)”}

Нода была одна на винде, после чего их стало 2 на windows docker, сейчас 2 на linux docker. Вторая работает без нареканий. Подскажите куда копать вообще

Eto normalno, tak kak noda proverjaet realnyi objom skanirujavse kusorki, u menja posle restarta obytno zagruzka dlitsa na bolshih nodah 24+h

Ну на данный момент длится более 72ч

mozhet HDD nakrylsja

Да проверял, всë ок с ним. Да и при выключенной ноде, работает как положенно.

Я не уверен какие инструменты есть на линуксе для мониторига файловой системы – может strace? – но я бы попробовал посмотреть на какие конкретно файлы нода трогает.

Моя нода (на freebsd) на старте хрустит дисками около часа, хотя там сейчас совсем немного данных (пол терабайта) и на сервере куча свободной памяти (для кеша метаданных). Если в этот момент посмотреть на что делает файловая система – там storage node перебирает все файлы в хранилище.

Я пытаюсь выразить что надо убедится что нода не щупает одни и те же файлы по кругу; в этом случае рано или поздно она закончит. Можно попробовать добавить RAM на сервер – линукс будет его использовать как кеш файловой системы и может чуть ускорить процесс (хотя на старте кеша все равно нет, и потому скорее всего никакой разницы не будет) но зато потом вся метадата будет закеширована и теоретически это должно помочь ноде обрабатывать запросы быстрее.

Говорит о том, что ваш диск достаточно медленный, чтобы в эту БД не успевала добавляться информация об использованной полосе пропускания.
Возможно пора перемещать БД на SSD: How to move DB’s to SSD on Docker
А какую файловую систему вы используете?

Смотреть, чем занят узел, можно через порт для отладки: Guide to debug my storage node, uplink, s3 gateway, satellite
См. также:

1 Like

а может разработчикам надо уже за голову взяться и упаковывать кучу мелких файлов в архивы покрупнее?

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

Я думаю все же решение — куча рама на ноде чтоб всю метадату закешировать.

Ну и чтоб два раза не вставать — чтоб датабазы не тормозили — slog на optane, это если zfs, чтоб синхронные врайты оптимизировать.

1 Like

@arrogantrabbit прав, к тому же на узле хранятся кусочки из разных сегментов файлов разных клиентов. То есть запросы всегда будут на кусочки, а не пакет. Упаковывать и распаковывать излишняя нагрузка как на диск, так и на процессор и память. Так что либо использовать один узел-один диск и родная файловая система - для Linux ext4, для Windows NTFS, либо монструозные дорогие массивы с SSD прослойкой и большим количеством RAM.

V printsipe, u menja na 1 sisteme windows rabotaet 8 nodov, zdelan cache na NVME 1TB, vse bazy dannyh nahodjatsa na SSD s OS. Rabotaet kak chasy. Dazhe posle restarta proverka zanjala vsego okolo 6 chasov, pri tom 4to nody po4ti vse polnye po 4TB primerno

Можно сюда копнуть: --storage2.piece-scan-on-startup=false
хоть разработчики вроде и не рекомендуют, но если диск не вывозит после рестарта, то вот это спасет.

1 Like

Ну хорошо, переведу я БД на ССД, а через пол года ССД умрëт. Что с моей нодой произойдëт?

Ничего, но потеряется историческая статистика на dashboard.

А почему ССД должен умереть так быстро? Там не так много записей чтоб изтерзать все ячейки за такое короткое время, даже с учетом write amplification. И потом всегда можно мониторить и заменить ссд когда ресурс записи подходит к концу.

И потом многие (все?) ссд помирают в readonly. Можно будет скопировать данные тогда.

USB флешки конечно это совсем другой разговор. Они плохо контролируют износ и если в них записывать в один и тот же сектор (что базы данных часто делают) они реально могут износить несколько физических секторов в ноль.

Всякое бывает, пол года как пример.

u menja na ssd uzhe 3 goda rabotaet i normalno, iz 7 serverov ni odin ne umer.

Сделал перенос баз на ССД, всë как по инструкции. Но диск говорит пустой - это надо проверку ждать как раз?

Никакой упаковки распаковки, файлы можно просто склеивать, как это делают с текстурами в играх.

А чем это поможет?

Сравнивать с играми не стоит, там другие цели. Текстуры (всегда сжатые, кстати) читаются один раз, на старте, и в основном последовательно, поэтому даже если произвольный доступ к файловой системе занимает время (seek latency) для одноразового чтения текстур это несущественно.

Тут ситуация другая: произвольный доступ подразумевается и ожидается с самого начала и до конца; под него надо оптимизировать.

Склеивая файлы можно сделать только хуже: это совсем не поможет уменьшить время доступа к самому файлу (часть которого — чтение метаданных из директории — прекрасно можно закешировать) но зато добавит ещё один seek внутри файла (который закешировать уже не получится)

Получается никаких преимуществ, одни недостатки.

1 Like