start

ZFSにdRAID(パリティ非クラスタ化RAID)が来る

分散ホットスペアを実現する新たなプール構成「dRAID」が、OpenZFS 2.1でリリース見込みだそうだ。dRAIDによってホットスペアが抽象化され、障害発生時のプールのリビルドが高速化されるとのこと。実装の解説を見ると、Declustered RAIDそのものな気がするが、OpenZFSでは慎ましく“Parity Declustered RAIDZ”と言っているようだ。

現在のZFSにおいて、ホットスペアはプールの予備デバイスという扱いとなっている。伝統的なRAIDシステムと同じ考え方で、ホットスペアは障害が起きたvdevの物理デバイスを置き換え、vdev内でresilver(データの復元とパリティの再計算)が行われる。抽象化が進んでいるZFSシステムの中では珍しく、割と物理デバイスを意識させる実装となっている。

dRAIDでは、そんなホットスペアデバイスの抽象化が行われる。表面上は今まで通りプールにスペアデバイスがあるように振る舞うが、内部的にはホットスペア用のブロックがvdevを構成する物理デバイスに分散して確保され、vdevに所属する仮想的な予備デバイスという扱いになる。デバイス障害時には、プールの全デバイスが分散的にデータ/パリティとスペアブロックの読み書きに携わり、従来は1台のスペアデバイスで律速していた部分解消されるため、リビルド時間が短縮されるという仕掛けのようだ。ちなみに、dRAIDのrebuildはチェックサムとパリティの検証を行わないため、resilverとは明確に違うらしい。

言葉だけだとイメージが付きにくいが、図を見れば簡単に理解できるかと。

「Characterizing Declustered Software RAID for Enhancing Storage Reliability and Performance」(Zhi (George) Qiao, Song Fu, Hsing-bung Chen, Bradley Wade Settlemyer) より編集して抜粋

HCIのストレージの挙動に近いかも?

RAID-Z同様、dRAIDのvdev構成を後から変えることは現時点では出来ないとされている。ただし、dRAIDのデータ構造からするに、いわゆるdRAID Expansionはそう難しくない気がするが果たして…?。コードソンで会おう!

8ONE ESC-2100のケーブルは0.5sq (AWG20)相当

8ONEのスピーカーケーブルESC-2100を買った。

サラウンドスピーカーの配線用に、電材屋の切り売りケーブル含め色々と検討したが、白くて細くて手ごろの3拍子揃ってるのは(特に通販では)本製品しか見当たらなかった。片チャンネル10mほど要るので、切り売りでもそれなりのお値段になってしまう。

長尺ということもあり、太さは0.75sq欲しかったのだけど、これといった情報は見当たらず。サラウンド用だし細くてもいっかーと割り切りダメ元で買ってたら、やっぱりダメだった(´・ω・`)。導体の直径は実測で0.85mmほどの0.5sq相当だった。

ちなみに、被覆含んだ直径は約2.4mm。これなら0.75sqのVFFケーブルで良かったかもしれない…。

まぁ細いだけあって目立たず綺麗に配線できたのでヨシとしよう。結局、片側は10mじゃ足りなくて手持ちの太めのケーブルを継ぎ足すことになったけどな!

FreeBSDのif_bridgeが5倍速くなるらしい

FreeBSDのネットワークブリッジ機能、if_bridge(4)が遅いってのは以前書いたとおりなのだけど、今後、おおむね5倍に高速化される見込みらしい。

FreeBSD Foundationの記事によれば、現状のif_bridgeは、重いBRIDGE_LOCK mutexのせいで、CPUのコア数によらずスループットは最大3.7Mpps程度に制限される。この度、Kristof ProvostがFreeBSD 13-CURRENT上でロックフリーのepoch(9)を使った実装にしたところ、概ね18.6Mppsのパケットフォワードが行え、5倍の改善となったとのこと。

これはなかなかムネアツ。

一方で、現状の実装でも3.7Mpps出るってことは、最大フレームなら理屈上41Gbpsの帯域を有するハズ。にもかかわらず、iperfの実測で3.5Gbpsほどに止まるのは何でだろーなー。全二重通信で帯域が分割される点を考慮しても低すぎのような気が。

PostgreSQLのDBドライバ使用時の「SSL error」はスレッド周りを見直す

超絶ハマったのでメモ。

QtのPostgreSQLドライバ(QSqlDatabaseの“QPSQL”)で連続したクエリを大量に発行すると、ポスグレのログに以下のようなログが記録されて正しく実行されない現象に遭遇した。

2020-06-11 19:41:00.598 JST [2593] db@postgres STATEMENT:  DEALLOCATE qpsqlpstmt_10
2020-06-11 19:41:00.633 JST [3924] db@postgres LOG:  SSL error: decryption failed or bad record mac
2020-06-11 19:41:00.634 JST [3924] db@postgres LOG:  could not receive data from client: Connection reset by peer
2020-06-11 19:41:00.634 JST [3924] db@postgres LOG:  unexpected EOF on client connection with an open transaction
2020-06-11 19:41:00.645 JST [3925] db@postgres ERROR:  invalid input syntax for type timestamp: " " at character 77
2020-06-11 19:41:00.645 JST [3925] db@postgres STATEMENT:  EXECUTE qpsqlpstmt_16 (TIMESTAMP WITH TIME ZONE '2020-06-11T10:41:00.634Z', '[, )', FALSE, 0, 0, 0, 0, 0, 10, '', 0, 2020061110480001, 0, 1, 0, 10)
2020-06-11 19:41:00.646 JST [3925] db@postgres WARNING:  there is no transaction in progress
2020-06-11 19:41:56.266 JST [12492] db@postgres LOG:  SSL error: tlsv1 alert protocol version
2020-06-11 19:41:56.272 JST [12492] db@postgres LOG:  could not receive data from client: Connection reset by peer

Qt側のログは消失してしまったが、SSL SYSCALL Resource temporarily unavailableSSL SYSCALL error: EOF detectedといったエラーが出てDBとのコネクションが破壊され、トランザクションに失敗したりとかそんな感じ。

両方のログから読み取れるのは、クエリ発行時にプログラムとポスグレ間のSSL接続が通信途中で切れたり、データが破壊され変なクエリを実行しようとしたり、SSLの認証に失敗したりしてる。どーしてそんなことが起こるの?

それらしい単語でググると、postgresのSSLを無効にして解決とか出てくるけど、それって何の解決にもなってなくね?っていう。自分が加えた変更以後に発生するようになったので、原因は間違いなく自分ってことだけはハッキリしてる( ˘ω˘ )。

DBドライバとコネクションについて調べ、コードを追ってみたところ、スレッドをまたいで同一のDBコネクションを使ってたのが原因のようだった。一般的に、1つのデータベースコネクションを複数のスレッドで操作するのは禁じ手だそうで、Qtのドキュメントにも

A connection can only be used from within the thread that created it. Moving connections between threads or creating queries from a different thread is not supported.
(訳:コネクションは生成されたスレッドからしか使用できない。コネクションのスレッドをまたぐ移動や異なるスレッドからのクエリ生成は非対応。)

という記述がある。でーびーしょしんしゃなのでしらんかった。

DB操作スレッドで作られ使われていたコネクションに対し、今回メインスレッドからクエリを発行する変更を加え、なおかつ、特定の操作を行うと両スレッドが入り乱れてコネクションを使うために、問題が顕在化したようだった。

というわけで、メインスレッド用に別途コネクションを用意し問題を回避した。解決ではなく回避なのは、かなりアレな設計で緊急措置的な対応だから…。元の構造がアレすぎていい対処方法が思いつかなかったの……。

3月末にeBayで注文したブツがやっと届いた

3月末にeBayで注文したPCパーツが2ヵ月ちょい掛かって、ようやく6/16に届いた。キャリアは4PXだった。

購入時点での配達予定は4/21~6/9で、結果的に予定日を少々オーバーしたものの、この新型コロナ騒動下において無事届いただけでも御の字。6/9には国内に入ってて一応期日は守ってるし、ある意味で優秀なスケジューリング&荷捌きと言えるかも?

4PXの追跡はこんな感じ。

日時 場所 内容
2020-03-27 08:42 Longhua,Shenzhen,China
(中国/深圳/龍華)
4PX picked up shipment.
(4PXが集荷)
2020-03-27 08:42 Longhua,Shenzhen,China
(中国/深圳/龍華)
Shipment arrived at facility and measured.
(荷物が施設に到着し採寸)
2020-03-29 10:43 Shenzhen,China
(中国深圳)
Depart from facility to service provider.
(施設からサービス業者に向けて出発)
2020-03-29 11:15 Information Received. (荷物情報受取)
2020-03-29 23:30 HK (香港) Hand over to airline. (航空会社に引き渡し)
2020-06-05 11:50JPKWS (日本/川崎) Despatched to overseas. (海外へ配送)
2020-06-09 18:44 Arrival at Destination. (目的地に到着)
2020-06-14 04:50 Arrival at Processing Center. (処理場に到着)
2020-06-14 08:59 Held by Customs at Destination. (通関手続き)
2020-06-15 00:59 Transit to Destination Processing Facility.
(目的地の処理施設に輸送)
2020-06-15 11:22 Receive item at delivery office. (集配局で荷物を受領)
2020-06-16 09:00 Delivery failed. (配達できなかった)
2020-06-16 09:00 Send item out for physical delivery. (配達のため持ち出し)
2020-06-17 03:43 Receive item at delivery office. (集配局で荷物を受領)
2020-06-17 09:18 Send item out for physical delivery. (配達のため持ち出し)
2020-06-17 13:42 Delivery failed. (配達できなかった)
2020-06-19 08:49 Send item out for physical delivery. (配達のため持ち出し)
2020-06-19 10:42 Item delivered. (配達済み)

日本に着いてからの追跡はこんな感じ。

状態発生日
(日時は現地時間)
配送履歴 取扱局 県名・国名
2020/06/05 11:50 国際交換局から発送 SSINGAPORE 06 SINGAPORE
2020/06/14 04:50 国際交換局に到着 219-8799 川崎東郵便局 神奈川県
2020/06/14 09:00 通関手続中 219-8799 川崎東郵便局 神奈川県
2020/06/15 01:00 国際交換局から発送 219-8799 川崎東郵便局 神奈川県
2020/06/15 11:22 到着 東京のどこか 東京都
2020/06/16 転送 東京のどこか 東京都
2020/06/17 03:43 到着 東京のどこか 東京都
2020/06/17 ご不在のため持ち戻り 東京のどこか 東京都
2020/06/19 配達希望受付 インターネット・IVR
2020/06/19 お届け済み 東京のどこか 東京都
  • start.txt
  • 最終更新: 2022-07-27 15:26
  • by Decomo