Posts tagged ‘Backblaze B2’

サーバ*のクラウドストレージ(Backblaze B2)へのバックアップに使っているソフト duplicacyが時々エラーを出していた。※ 調べたら4年近く試行錯誤していたが、最後の対処をしてから半年くらい起こっていないので、ようやく直った感じだ。

*デスクトップでも使っている。

※随分前に書いた気がするものの、探しても出て来ないので、対策しつつ様子を見ていたのかも知れない。

(臭いの問題と同様に)原因が はっきり分からないのだが、バックアップ中のメモリ不足かディスクアクセス過多、あるいはその両方ではないかと推測している。: 通常は問題ないが、(サーバのハード(仮想マシン)は貧弱なので)他に大量にメモリを使うか頻繁にディスクアクセスをするプロセスが一緒に動いていると、問題が起こるようだ。

現象

  • クラウドストレージのprune(古い変更履歴の削除)処理時に、いくつかのチャンク(ブロック)が ないというエラーが出る。
    • エラーメッセージの例(発生し始めた頃のもの, 一部改変した)

2019-07-17 03:41:18.960 ERROR CHUNK_DELETE Failed to fossilize
the chunk fdXXXXXX: URL request 'https://YYYY.backblazeb2.com/b2api/v1/b2_hide_file' returned 400 File not present: chunks/fd/XXXXXX

    • そのチャンクを含むリビジョン(履歴)を削除するかexhaustive prune処理を実行すると、エラーは出なくなる。
  • 問題のリビジョンのバックアップ時にはエラーは出ていない。

謎と検討

妙なのは、デスクトップとサーバで同じようにバックアップしているのに、サーバだけでエラーが起こることだ。しかも、サーバ(VPS)のハードが交換された あとから起こるようになった。 ← 実は その前から起こっていた。(記録のために残す)

そのことから、(OSは同様なので、)サーバとデスクトップのハード(リソースや性能)の違いが関係している可能性がある。

対処

半年くらい前(2022/11)に以下のように対処したら、問題が起こらなくなった。

  • duplicacyのバックアップ処理のパラメタを調整し、使用メモリ量を減らすようにした。
    • オプションに -max-in-memory-entries 51200 を指定した。
      • → 使用メモリ量が200MB前後になった。 (無指定時は600MB以上になる場合があった。: 下を参照)
      • 値を減らすと使用メモリ量は減るが、比例は しない(下限がある?)ようで、10240と かなり小さくしても200MBは使うようだ。
  • バックアップ処理と、メモリを大量に使用してディスクアクセスが頻繁なclamscan(ウイルススキャンソフト)が同時に動かないようにした。
    • どちらもcrontabで定期的に起動している(周期や時刻は異なるが、どちらも実行時間が長いので同時に動く可能性がある)ので、起動前に片方が実行中の場合はスキップし、次回まで延期するようにした(片方が終わるまで延々と延期する)。
      • 今気付いたが、微妙なタイミング(例: たまたま2つが同時に起動時刻になった場合)で同時に起動してしまう場合があるかも知れない。 ← プログラム(スレッドやプロセス)でないので、開始時刻(分)を違えておけば大丈夫そうだ。
    • こちらは上より先に実施したが、問題が全く起こらなくなる訳ではなかったようだ。

分かった切っ掛け

対処方法が分かった(問題が起こらないようにできた)切っ掛けは、ある時のduplicacyの更新内容に「使用メモリ量の削減」というものがあったことだ。※ もしかすると、他の方がメモリ不足でのトラブルを報告したのかと思った。

※僕はそれまで、duplicacyがメモリを大量に使用する可能性があるとは全く意識していなかった。想像だが、duplicacyの重複排除処理(重複ブロック(チャンク)の検索?)でメモリを使うのではないか。

なお、更新されたduplicacyのストレージ(スナップショット/リビジョン)は新しいフォーマットになって使用メモリ量が少なくなるというので、全部のスナップショットが入れ替わるまで(変更履歴の保存期間が過ぎるまで)使用メモリ量の変化を見ていたが、余り減らなかった。最初(duplicacyを更新した直後)が一番減った気がする。

それで、duplicacyと一緒にclamscanが動く時にメモリ不足になって、エラーの原因になるのではないかと推測した。ただ、OSのログにはメモリ不足関連のエラーは出ていないので、正確には、実メモリ(RAM)が不足して仮想記憶(ディスク)が使用されて(スワップ)、処理が遅くなってエラーの原因が発生するのではないだろうか。

duplicacyのエラーメッセージから考えて、原因はバックアップ時にチャンクがクラウドストレージに保存されないことがある(ただ、その時にエラーは出ない)というものだろうから、実メモリが不足してスワップが起こると処理が遅くなって、チャンクのクラウドストレージへの送信が失敗するのではないかと推測している。

処理が遅くなって送信が失敗することがあるとは思えないが、例えば通信のタイムアウトやリトライ処理のタイムアウトなどであろうか。前者とすれば、送信するチャンクのデータをメモリにバッファリングせず、ディスクから読み出しながら送っていて、たまに遅くなると送れないことがある? : いずれにしても、duplicacyの処理のロバスト性が今一つなのかも知れない。

そう言えば、以前duplicacyのフォーラムを調べたら、僕と同様に「チャンクがない」というエラーが出る方が問い合わせていたが、結局「再現せず」や本質的でない回答のあとは放置されて、解決していなかった。

そしてその方は怒っていた気がする。: その方のKopiaのフォーラムへの投稿からduplicacyに戻って、上の問題を知った覚えがある。

そこで、試しにduplicacyのバックアップ時の使用メモリ量の表示をさせてみたら※、600MB以上消費する場合があることが分かった。普通は それくらいは問題ないのだが、サーバのメモリ量は1GBと少ないので*、他のソフトも大量に使用するとスワップが起こりそうだ。なお、prune時は使用メモリ量は小さく、100MB以下だった。

※メモリ量削減と一緒に そういう機能が追加された。

*以前、たまにメモリ不足の問題が起こっていたため、仮想記憶(スワップ)を有効にしていた。その問題が何だったか思い出せないが、やっぱりduplicacyだったのかも知れない。

メモリ不足の他には、duplicacyもclamscanもディスクアクセスが頻繁なために処理が遅くなって、上と同様にチャンクのクラウドストレージへの送信が失敗する可能性も考えられる。更に、メモリ不足と頻繁なディスクアクセスが一緒になると、余計処理が遅くなって更にひどいことになりそうだ。

ちなみに、過去1年のサーバの稼働状況を調べたところ、duplicacyの使用メモリ量を制限した頃からスワップ頻度(ページ/s, 下の左のグラフ: 中央辺りから制限した)が減ったようだ。ディスクI/O頻度(回数/s, 同)に関しては変化は少なく、逆に少し増えた感じだ(ただし、なぜか今年4月以降は小さくなっている)。ディスクを複数プロセスで同時に使うと、効率が低下して全体的な性能が低下するためだろうか。

グラフから、duplicacyのメモリ使用量が大きくてスワップが多かったことは確かそうだ。

※なお、同じ期間のメモリの状態(memory usage)、ディスク動作率(utilization)、ディスクの遅延(latency)、NWの通信速度、システム負荷(load average)に目立った変化は なかったので、グラフは省略した。

考察

いずれにしても、送信失敗時にエラーが出るはず・べきだが出ないのはduplicacyの問題(異常時の処理が甘い)か、これらが原因ではないかの どちらかだろう。

今後問題が再発すれば後者だし、逆に、duplicacyの使用メモリ量の制限を止め、常にclamscanと一緒に動かして問題が起これば、僕の推測が正しいことが分かる。が、面倒だし ほとんど無意味(僕が作ったものでないし、サポートが やる気ない: おそらく「環境の問題」で終わり)なのでやる気は しない。

もしduplicacyの問題だとしたら、「バックアップしたつもりなのに(エラーになっていないのに)、できてなかった」という、結構ひどいものだ。が、起こるのは限られた環境のようだし、駄目になるのは一部のファイルだけなので、致命的とまでは言えなさそうだ。でも、これは遊びのソフトじゃないので、重大な信頼性の欠陥だと思う。

補足すると、特定の環境・状況で処理が失敗するのは仕方ない(すべての環境・状況で使えるものは作れない)が、使った時に失敗したことが分からないのが問題だ。

そう言えば、作者は こういうエラーメッセージ関係の重要性を軽視しているようで、以前、「エラーメッセージ(か終了コード)が誤解する・分かりにくいから変更して欲しい」という要求を拒否していた。

これは単なる表示・見た目の問題ではない。ちゃんと作る(起こり得る すべての失敗を想定・想像する)のは大変だが、製品には必要だ。

試行錯誤

対処方法が分かるまでに以下を試したが、ほとんど効果がなかった。若干良くなるように見えたが、問題は起こった。

  • バックアップ時の送信スレッド数を減らす。: デフォルト: 4個 → 1個 (-threads 1)
  • バックアップ時の送信速度を下げる。: 約250kB/s (-limit-rate 250)など
  • B2のメンテナンス時間帯(毎週1回)のバックアップを避ける。

これより、問題の原因はduplicacy単体ではない可能性が高いことが推察される。 ← 上も動作環境(NWやB2)が関係していることを推測して行ったので、これは言えない。 (22:11)

 

余談

何度か この件をduplicacyに問い合わせようと思ったが、ハードが関係していそうだし、上述のようにサポートが余り親切・適切でなさそうで解決する見込みがないので、止めていた。そして、もし僕の推測した原因が正しかったら、問い合わせても全く解決せず、(いつものように)ただイライラするだけだっただろう。

duplicacyは通常時は問題なく動作しているのだが、上に書いたように異常対応やロバスト性が心許ない気がしているし、サポートの態度にも問題がある。あと、バックアップの対象・除外設定と動作が複雑で頭が狂ってしまう。

そこで、以前書いたKopiaなど新しいバックアップソフトを検討したいが なかなか面倒だし、そっちが良い保証もない。他に やることが溜まっているので、検討するとしても来年と考えている。

 

PS. 書く前は手短かに終わらせようと思って居たが、長くなったし熱くなった(ムカついた)。調べたら長年苦労して来たし、作者がテキトーなのを思い出したせいだ。それにしても、国内・国外関係なく、いい加減なソフト屋が多い。ハードも同様だ(以前も同じことを書いた)。

  •  0
  •  0
Keys: , , , , , ,

数日前に、Backblaze B2(以下、B2)中の もう更新しない(であろう)データをGoole Cloud Storage (Archive) (以下、GCS)に移動する設定を追加して、10日くらい前からほぼ「定常運用」をして居る。以下のグラフを見て分かるように、操作数・データ量などや料金は落ち着いている。

保存しているだけで何もしないなら、毎日、保存データ量分の料金(現状は4円)だけが増える。更新チェック(約3回で1円, 1日1回実施している)や追加バックアップ(量と回数による。: 下を参照)をすると、その分が追加される。

今までに分かったことなどを書く。

  • データ移動(B2→GCS)関係
    • バックアップ対象設定の変更で、B2のデータがGCSに移動するか(B2の保存データ量が減るか)? → Yes.: duplicacy check -statusで各リビジョン(履歴)のデータ量が分かり、将来のprune(不要データの削除処理)で減ることが分かった。
    • 一度に大量に(全部)減らすとpruneに時間が掛かるのと、失敗した場合に大変なので2回に分けて減らすことにした。今のB2のデータ量は約270GBで、来月にもう一度、約270GB分を減らす設定をする。
      • 上を合わせるとB2の残りが0になってしまうが、集計の誤差や重複排除の影響があるため、そうはならない。ただ、残りは かなり少なくなるはずである。
  • GCSのコスト関係
    • ストレージだけの料金の見積もり: 1651円(USD 14.8)/年, 138円(USD 1.23)/月
      • データ量を1TBとし、USD 1= 112円とした。
      • 単価: 0.134円(USD 0.0012)/GB・月
    • バックアップ対象ファイルのチェック(更新チェック)の料金の概算: 3回で1円くらい。 → 約10円/月
    • バックアップ(アップロード)の料金: 推定: 約5円/回(ストレージのチェック) + 約1円/GB
    • 定期更新チェック(1回/日)と追加バックアップ分を含めた年間料金・単価の試算
      • 既存1TB, 追加バックアップなし
        • 支払い額: ストレージ: 1651円 + 更新チェック: 120(30/3*12)円= 1771円(USD 15.8)/年
        • 総合単価: 0.144円 (USD 0.00129)/GB・月
      • 既存1TB + 追加100GB/年 (1回で追加)
        • 支払い額: ストレージ: 1813円 + 更新チェック: 120円 + バックアップ: 105(5+100*1)円= 2038円(USD 18.2)/年
        • 総合単価: 0.151円 (USD 0.00135)/GB・月
      • 既存1TB + 追加100GB/年 (10回で追加)
        • 支払い額: ストレージ: 1813円 + 更新チェック: 120円 + バックアップ: 155(5*10+100)円= 2088円(USD 18.6)/年
        • 総合単価: 0.155円 (USD 0.00138)/GB・月
      • 既存1TB + 追加500GB/年 (1回で追加)
        • 支払い額: ストレージ: 2458円 + 更新チェック: 120円 + バックアップ: 505(5+500*1)円= 3083 (USD 27.5)円/年
        • 総合単価: 0.251円 (USD 0.00224)/GB・月
      • 上より、追加料金はバックアップのデータ量が効くので、回数が多過ぎなければ(例: 月に1回以下)小まめにしても良さそうだ。ただ、「100MBを10回」のように細かいものは割に合わない。例えば、1回10GB以上がいいのではないか。
    • 料金はUSD建てのため、実際の支払額は為替相場に影響される。円が大幅に安くなると困るが、さすがに2倍にはならないだろう・・・
      • Googleのレートは毎日変わっている訳ではないので、毎月更新のようだ。
  • 運用関係
    • B2→GCSの移動対象ファイル・ディレクトリの追加の仕方: 以下のようにすることで、毎年GCSに移すものが増えても、バックアップ対象の設定(duplicacyではfilters)を変えなくて済むようにした。
      1. 移動対象を同じディレクトリに作成した"Archived"ディレクトリに移動する。
        • B2: パターン「Archivedという名前のディレクトリ」をバックアップ対象外にしておく。
          • パターンの例: e:(.+/)?Archived/
            • 注: 設定ファイル内での他のパターンとの順序関係で有効性が変わる。下も同じ。
        • GCS: 同Archivedをバックアップ対象にしておく。
          • パターンの例: i:(.+/)?Archived/
      2. 移動したものを書き込み不可にする。(意図せず変更しないようにするため)
      3. 元のディレクトリにArchivedからのsym-linkを作成する。
    • 数日前に、ストレージに保存されているduplicacyの設定ファイル(config)のストレージクラスをStandardにしてみた。
      • 更新チェックやバックアップのたびにストレージからダウンロードされるので、Archiveクラスだと ストレージ操作やデータ取得の単価が高く(約10倍)、わずかに料金がかさむため。
      • configのサイズはとても小さい(< 1KB)ので、Standardクラスの料金は毎月の無料枠(5GB・月)内に収まる。
      • これにより、更新チェックの料金(現状は約10円/月)が更に下がることが期待できる。
    • 問題など
      • バックアップ先がB2とGCSの2箇所になるので、リストアが面倒(どちらにあるか・どちらからリストアすべきかを考える必要がある)。
        • まずB2で試し、なかったりArchivedに入っていたらGCSからリストアする。
      • バックアップ対象設定を誤る(例: 設定が非対称)と両方にバックアップされず、いざという時にリストアできない可能性があるので、注意・確認が必要。
      • B2とGCSでバックアップのトップディレクトリが異なるので、間違えやすい。
      • バックアップ(HDD)を整理しようとして本物を削除してしまい、B2のバックアップからリストアして復旧できた。
  •  0
  •  0
Keys: , , , , , , ,