このページの翻訳:
ソースの表示
最近の変更サイトマップ

FreeBSDのkern.random.harvest.maskについて

FreeBSDのネットワークチューニングについて調べてると「random harvestを最適化せよ」という指示が随所で出てくる。ネットワークなのに乱数?と不思議に思って調べたメモ。ここで書くことは、全て一次ソースのrandom(4)random_harvest(9)に書いてあり、FreeBSD 12.1-RELEASE時点での情報である。

まずはrandom harvestについて。

FreeBSDは乱数を返すスペシャルファイル/dev/randomを持つが、通常、その実態は擬似乱数生成器となっている。つまり数式で求められた確定的な乱数っぽい数値を返しているに過ぎず、乱数っぽさの維持にはエントロピーの質が重要となる。FreeBSDでは、エントロピーの収集のことをrandom harvestと呼んでいるようだ。良質なエントロピーを育み利用する、という感じなので“harvest”はなかなか的を射た呼び方だと思う。

そのエントロピー収穫先を制御するのがkern.random.harvest.maskカーネル変数というわけ。

値は収穫先ごとのビットフラグで、1ならエントロピー源として使う、0なら使わないことを意味する。10進数のマスク値を見ても良くわからないので、エイリアスであるmask_symbolicやmask_binを見た方がいいだろう。うちの環境では以下のとおりだった。

$ sysctl kern.random
kern.random.fortuna.minpoolsize: 64
kern.random.harvest.mask_symbolic: PURE_RDRAND,[UMA],[FS_ATIME],SWI,INTERRUPT,NET_NG,NET_ETHER,NET_TUN,MOUSE,KEYBOARD,ATTACH,CACHED
kern.random.harvest.mask_bin: 00000010000000111111111
kern.random.harvest.mask: 66047
kern.random.random_sources: 'Intel Secure Key RNG'

mask_binがmask値の2進数表現、mask_symbolicがmaskを更に読みやすくしたシステムで利用可能なエントロピー源の一覧で、[]で囲まれた収穫先は使われていないことを意味する。FreeBSD 12.1-RELEASE時点で、24個のエントロピー源が定義されているようだ(sys/sys/random.h)。

ご覧の通りNET_ETHERもエントロピー源として使われている。それがなぜネットワーク性能に影響するかというと、エントロピー収穫の際のロック競合が少なくない影響を及ぼしているとのことだ。とりわけ、10ギガビット以上の高速ネットワークではバカにならないそうで。なるほどねー。

参考サイト

メモリ16GBは人権の今、ZFSの重複排除(dedup)を解禁する

ZFSは2010年頃のPool Version 21で重複排除機能(dedup)を備えたが、本機能の使用は長らく禁忌とされてきた。というのも、Chr〇meも真っ青のレベルでメモリを馬鹿食いするからだ。ZFSの他の機能同様、dedupも有効にした後の書き込みから機能するため、当初は問題なく動いてるように見える。が、徐々にメモリが使われて行き「なんか重いなぁ…」と気付いた時には既に遅し、メモリが枯渇しているのである。慌ててdedup=offにしても、既に重複排除された分は効き続けるため、メモリは減ったままというオマケ付き。dedup地獄から抜け出すには、メモリを増設するかスワップを大量に割り当て、既存の重複排除が解除されるのをひたすら耐えるしかない。

そんな訳でdedupの実用は難しかったのだけども、メモリ16GBは人権宣言から1年、フッ化水素騒動も何のその、メモリ価格は下落を続け個人でメモリ1TBも現実的となってきた昨今、そろそろdedupを解禁しても良いのではないか。

FreeBSD Mastery: ZFSによると、dedupはデータ1TBあたり概ね5GBのメモリを消費するそうだ。うちの自宅サーバはメモリ64GBでメインのプールは8TBなので、dedupを有効にしてもお釣りがくる計算だ。ならば人柱よろしくdedupっちゃおうじゃないの。ちなみに、同書にはdedupメモリ消費量のより詳しい見積もり方法が書いてある。気になる人は買って読んでください。

dedupを有効にするプールzhomeは以下のような感じ。8TBのHDDを2本(ada5とada6)のミラー構成としている。改めてみるとファイルシステム名のつけ方が酷いな…。

$ zpool status zhome
  pool: zhome
 state: ONLINE
  scan: scrub repaired 0 in 0 days 02:21:29 with 0 errors on Thu Oct 24 11:57:54 2019
config:

        NAME        STATE     READ WRITE CKSUM
        zhome       ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada5p1  ONLINE       0     0     0
            ada6p1  ONLINE       0     0     0
        logs
          mirror-1  ONLINE       0     0     0
            nvd0p3  ONLINE       0     0     0
            nvd1p3  ONLINE       0     0     0
        cache
          nvd0p7    ONLINE       0     0     0

errors: No known data errors

$ zpool list zhome
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zhome  7.27T  1.22T  6.04T        -         -     2%    16%  1.00x  ONLINE  -

$ zfs list -r zhome
NAME                         USED  AVAIL  REFER  MOUNTPOINT
zhome                       1.22T  5.81T    96K  /zhome
zhome/R                     1.21T  5.81T    88K  /zhome/R
zhome/R/home                1.21T  5.81T  1.21T  /usr/home
zhome/ROOT                  15.5G  5.81T    96K  /zhome/ROOT
zhome/ROOT/nextcloud        6.78G  5.81T  6.78G  /mnt/nextcloud
zhome/ROOT/vm               8.69G  5.81T    88K  /zhome/ROOT/vm
zhome/ROOT/vm/virtcurrency  8.69G  5.81T  8.69G  /zhome/ROOT/vm/virtcurrency

とりあえずホームディレクトリが置いてあるzhome/R/homeでdedupを有効にしてみる。

# zfs set dedup=skein zhome/R/home

dedup=onではなくdedup=skeinなのは、チェックサムアルゴリズムとしてSkeinを使いたいから。

dedupは標準でSHA-256を使うようになっているが、manを見る限りSkeinはSHA-256/SHA-512より安全かつ高速で、更にプール固有のソルトを用いるためハッシュ衝突攻撃にも強いらしい。「sha512は何からの理由で高速なskeinが使えないシステムで使う」とも書いてあるので、基本はskeinで良さそう。

その後、別プールにあるISOイメージやらインストーラやらが詰まってる493GBのフォルダを、dedup有効のプールにコピーした結果が以下。

$ zpool list zhome
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zhome  7.27T  1.64T  5.62T        -         -     3%    22%  1.11x  ONLINE  -

重複排除率が1.11xってのは……たぶん2.00xならdedupで実使用量が半分になったって事だろうから、(重複排除できたサイズ)=(1-(1/DEDUP))*(元のサイズ) なので48GBほど排除できた感じっすかね?

この時のメモリ使用量の変化は下図のとおり。

ARCサイズはloader.confvfs.zfs.arc_max=“20G”として20GBに制限している。dedup前はARCを20GBフルに使ってるのに対し、dedup後は15GBになっていることから、dedup用のハッシュキャッシュはARCから確保されるっぽい?

データ493GBでハッシュ5GBって冒頭の概算の2倍消費しとるやんけ!と思ったが、Skeinは512bitハッシュなので比率で考えたら見事に概算通りの結果となった。そう考えると、メモリ64GB程度ではdedupを使うにはまだ心許ない感じがするなぁ……(何というオチ)。ちなみに、将来dedupのメモリ消費量が削減される可能性があるっぽい。

まぁ、せっかくdedup有効にしてみたんだし、しばらく運用してみよう。NVMeなSSDも載ってるので、最悪そっちに大容量スワップ作れば何とかなるだろう。


(2020-01-06 追記)

dedup有効後、6日ほど経ったのでtopを見てみたら、ARCが20GBに戻ってた…。ARCからハッシュキャッシュから取られる訳ではなさそう?ちゃんと調べてみないと分かりませんな……。

last pid: 26323;  load averages:  0.21,  0.20,  0.17   up 71+13:01:17  22:29:52
51 processes:  1 running, 50 sleeping
CPU:  0.8% user,  0.0% nice,  0.3% system,  0.0% interrupt, 98.9% idle
Mem: 295M Active, 1465M Inact, 25G Wired, 35G Free
ARC: 20G Total, 11G MFU, 6802M MRU, 1530K Anon, 369M Header, 1446M Other
     17G Compressed, 24G Uncompressed, 1.43:1 Ratio
Swap:

参考サイト

Nextcloudのプレビューの文字化けを直す

Web版Nextcloudで表示されるテキストファイルのプレビュー画像が文字化けしてたので直してみた。

やることは、プレビュー生成で使っているフォントをNotoSansCJKに変更するだけ。手順は↓こんな感じ。

  1. https://github.com/minoryorg/Noto-Sans-CJK-JP/tree/master/fonts から NotoSansCJKjp-Regular.ttf をダウンロード
  2. DLしたフォントを Nextcloudのインストール先/core/fonts に入れる
  3. 上記フォルダでNotoSansCJKjp-Regular.ttfNotoSans-Regular.ttf (Nunito-Regular.ttf)にリネームする(シンボリックリンクでも可)

Nextcloudの標準フォントに、日本語のグリフが含まれていないのが原因のようだ。当初は文字コード周りかと思ってたが、プレビューをよく見ると“豆腐”になっていることが分かる。

プレビューの生成はファイルが変わった時に行われるようなので、てきとーにファイルを編集すれば正常な表示になるはず。

もう少し詳しく解説すると、テキストファイルのプレビューの生成はlib/private/Preview/TXT.phpで行われており、80行目あたりでNotoSans-Regularが指定されている→GitHub/master

Notoなのに何で文字化け…?と思ったのだが、同梱のNotoには日本語のグリフが含まれていないようだ。ついでに、Notoが使われるようになったのはごく最近で、以前はNunitoが使われていたようだ→GitHub/Move font from Nunito to Noto Sans

というわけで、使ってるNextcloudのバージョンに応じて、NotoSans-Regular.ttfもしくはNunito-Regular.ttfを日本語グリフを含むフォントに差し替えればおkというわけ。

Transcend TS256GUSD300S-Aのベンチマーク

Nintendo Switch用にトランセンドのmicroSDXC TS256GUSD300S-Aを買った。税込み4580円。シリアル番号で保証期間が表示されたので正規品だと思われる。

Switchで使う前にCheck Flashで喝入れ、SD Formatterで上書きフォーマットし、CrystalDiskMarkでベンチしてみた。USB 3.0接続のカードリーダーでの結果でござる。

------------------------------------------------------------------------------
CrystalDiskMark 7.0.0 x64 (C) 2007-2019 hiyohiyo
                                  Crystal Dew World: https://crystalmark.info/
------------------------------------------------------------------------------
* MB/s = 1,000,000 bytes/s [SATA/600 = 600,000,000 bytes/s]
* KB = 1000 bytes, KiB = 1024 bytes

[Read]
Sequential 1MiB (Q=  8, T= 1):    93.954 MB/s [     89.6 IOPS] < 88429.49 us>
Sequential 1MiB (Q=  1, T= 1):    93.332 MB/s [     89.0 IOPS] < 11211.36 us>
    Random 4KiB (Q= 32, T=16):     6.323 MB/s [   1543.7 IOPS] <258114.41 us>
    Random 4KiB (Q=  1, T= 1):     6.099 MB/s [   1489.0 IOPS] <   670.86 us>

[Write]
Sequential 1MiB (Q=  8, T= 1):    53.682 MB/s [     51.2 IOPS] <150429.74 us>
Sequential 1MiB (Q=  1, T= 1):    53.275 MB/s [     50.8 IOPS] < 19516.58 us>
    Random 4KiB (Q= 32, T=16):     3.240 MB/s [    791.0 IOPS] <185034.42 us>
    Random 4KiB (Q=  1, T= 1):     3.246 MB/s [    792.5 IOPS] <  1260.52 us>

Profile: Default
   Test: 1 GiB (x5) [Interval: 5 sec] <DefaultAffinity=DISABLED>
   Date: 2019/12/08 18:56:23
     OS: Windows 10 Professional [10.0 Build 18362] (x64)
Comment: Transcend TS256GUSD300S-A (microSDXC/256GB)

値段なりの順当な結果かなと。ついでにSD Card Formatterでの初期化結果は↓こんな感じだった。

MegaRAIDでUnexpected sense, Command timeoutとかが出てた

知人から「なんかサーバのHDDがオレンジになってるんだけど…」という一報があった。

恐る恐るMegaRAID Storage Managerで状態を見てみると、Unexpected senseやらCommand timeoutやらPower on, reset, or bus device reset occurredやらが出てアレイがデグレってた:( ;´꒳`;):。マシンはDELL PowerEdge T330, PERC H730で、アレイはMD050ACA800×4, WD80EFAX×4でRAID-6からVDを2つ切り出してるという構成。稼働してまだ10カ月くらい。そのうち1つのWD80EFAXが切り離されていた。ログは↓な感じで。

 ID | TIME                | MESSAGE
----+---------------------+---------------------
267 | 2019-10-30 08:51:57 | Controller ID:  0  Command timeout on PD:   PD       =   -:-:5 No addtional sense information,   CDB   =    0x8a 0x00 0x00 0x00 0x00 0x02 0xd3 0x03 0xb9 0x00 0x00 0x00 0x00 0x80 0x00 0x00    ,   Sense   =   ,   Path   =       0x4433221103000000
267 | 2019-10-30 08:51:57 | Controller ID:  0  Command timeout on PD:   PD       =   -:-:5 No addtional sense information,   CDB   =    0x8a 0x00 0x00 0x00 0x00 0x02 0xd3 0x03 0xba 0x00 0x00 0x00 0x00 0x80 0x00 0x00    ,   Sense   =   ,   Path   =       0x4433221103000000
268 | 2019-10-30 08:51:57 | Controller ID:  0  PD Reset:   PD       =   -:-:5,   Critical       =   3,   Path   =       0x4433221103000000
267 | 2019-10-30 08:52:09 | Controller ID:  0  Command timeout on PD:   PD       =   -:-:5 No addtional sense information,   CDB   =    0x8a 0x00 0x00 0x00 0x00 0x02 0xd3 0x03 0xbc 0x80 0x00 0x00 0x00 0x80 0x00 0x00    ,   Sense   =   ,   Path   =       0x4433221103000000
268 | 2019-10-30 08:52:09 | Controller ID:  0  PD Reset:   PD       =   -:-:5,   Critical       =   3,   Path   =       0x4433221103000000
113 | 2019-10-30 08:52:13 | Controller ID:  0   Unexpected sense:   PD       =   -:-:5 Logical unit not ready, cause not reportable,   CDB   =    0x8a 0x00 0x00 0x00 0x00 0x02 0xd3 0x03 0xbc 0x80 0x00 0x00 0x00 0x80 0x00 0x00    ,   Sense   =    0x70 0x00 0x02 0x00 0x00 0x00 0x00 0x0a 0x00 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x00 0x00
113 | 2019-10-30 08:52:14 | Controller ID:  0   Unexpected sense:   PD       =   -:-:5 Power on, reset, or bus device reset occurred,   CDB   =    0x1b 0x01 0x00 0x00 0x01 0x00    ,   Sense   =    0x70 0x00 0x06 0x00 0x00 0x00 0x00 0x0a 0x00 0x00 0x00 0x00 0x29 0x00 0x00 0x00 0x00 0x00
113 | 2019-10-30 08:52:15 | Controller ID:  0   Unexpected sense:   PD       =   -:-:5 Power on, reset, or bus device reset occurred,   CDB   =    0x8a 0x00 0x00 0x00 0x00 0x02 0xd3 0x03 0xbc 0x80 0x00 0x00 0x00 0x80 0x00 0x00    ,   Sense   =    0x70 0x00 0x06 0x00 0x00 0x00 0x00 0x0a 0x00 0x00 0x00 0x00 0x29 0x00 0x00 0x00 0x00 0x00
267 | 2019-10-30 08:52:36 | Controller ID:  0  Command timeout on PD:   PD       =   -:-:5 No addtional sense information,   CDB   =    0x1b 0x01 0x00 0x00 0x01 0x00    ,   Sense   =   ,   Path   =       0x4433221103000000
268 | 2019-10-30 08:52:36 | Controller ID:  0  PD Reset:   PD       =   -:-:5,   Critical       =   3,   Path   =       0x4433221103000000
87  | 2019-10-30 08:52:37 | Controller ID:  0   PD Error:   -:-:5      ( Critical   240)
114 | 2019-10-30 08:52:37 | Controller ID:  0   State change:   PD       =   -:-:5  Previous   =   Online      Current   =   Failed
81  | 2019-10-30 08:52:37 | Controller ID:  0   State change on VD:   0      Previous   =   Optimal  Current   =       Partially Degraded
250 | 2019-10-30 08:52:37 | Controller ID:  0  VD is now PARTIALLY DEGRADED   VD   0
81  | 2019-10-30 08:52:37 | Controller ID:  0   State change on VD:   1      Previous   =   Optimal  Current   =       Partially Degraded
250 | 2019-10-30 08:52:37 | Controller ID:  0  VD is now PARTIALLY DEGRADED   VD   1
113 | 2019-10-30 08:52:37 | Controller ID:  0   Unexpected sense:   PD       =   -:-:5 Power on, reset, or bus device reset occurred,   CDB   =    0x8a 0x00 0x00 0x00 0x00 0x02 0xd3 0x03 0xc2 0x00 0x00 0x00 0x00 0x80 0x00 0x00    ,   Sense   =    0x70 0x00 0x06 0x00 0x00 0x00 0x00 0x0a 0x00 0x00 0x00 0x00 0x29 0x00 0x00 0x00 0x00 0x00
114 | 2019-10-30 10:45:49 | Controller ID:  0   State change:   PD       =   -:-:5  Previous   =   Failed      Current   =   Online
81  | 2019-10-30 10:45:49 | Controller ID:  0   State change on VD:   0      Previous   =   Partially Degraded  Current   =       Optimal
249 | 2019-10-30 10:45:49 | Controller ID:  0  VD is now OPTIMAL   VD   0
81  | 2019-10-30 10:45:49 | Controller ID:  0   State change on VD:   1      Previous   =   Partially Degraded  Current   =       Optimal
249 | 2019-10-30 10:45:49 | Controller ID:  0  VD is now OPTIMAL   VD   1
113 | 2019-10-30 10:45:49 | Controller ID:  0   Unexpected sense:   PD       =   -:-:5 Power on, reset, or bus device reset occurred,   CDB   =    0x8a 0x00 0x00 0x00 0x00 0x00 0x00 0x12 0x51 0x28 0x00 0x00 0x00 0x38 0x00 0x00    ,   Sense   =    0x70 0x00 0x06 0x00 0x00 0x00 0x00 0x0a 0x00 0x00 0x00 0x00 0x29 0x00 0x00 0x00 0x00 0x00

それらしい単語でググってみると、何やらファームの良く知られたちょっとしたバグ?らしく、無視しておkとのこと。タイムアウトでHDDが切り離されちゃってるのは気になるところだけど…。

サーバは遠隔地にあるため実物は確認できてないが、HDDそのものは動いてはいるようなので、オンラインにしてConsistency Checkを掛けた。今のところ問題なく動いているようだ。

なおパリティの再構成時間は、200GB(内22GB使用中)のVDで4分(196か所訂正)、54TB(内21.6TB使用中)のVDで17時間(11953か所訂正)だった。

参考サイト

start.txt · 最終更新: 2019-08-19 02:45 by Decomo
CC Attribution-Noncommercial-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0