ソースの表示以前のリビジョンバックリンク全て展開する/折り畳む文書の先頭へ Share via Share via... Twitter LinkedIn Facebook Pinterest Telegram WhatsApp Yammer Reddit Teams最近の変更Send via e-Mail印刷パーマリンク × C#の0がenum値に暗黙キャストされてinvokeStaticで例外出て超ハマった 僕はついさっき知ったばかりなんですけど、C#の数値0ってあらゆるenum値に暗黙的キャストされるんですってね。要するに、0だけはキャスト不要で列挙型の値として変数に代入できちゃったりするということ。コードで示すと以下のようなかんじ。 using System; public class Program { enum Hoge { A, B } enum Piyo { C, D } public static void Main() { Hoge h1 = 0, h2 = 0.0f; Piyo p1 = 0x0, p2 = 0.0m; Console.WriteLine($"{h1}, {h2}"); Console.WriteLine($"{p1}, {p2}"); } } このコードは何の警告もなくビルドが通り、以下の実行結果が得られる。 A, A C, C 浮動小数点数やDecimalのゼロも同様の扱いっていうのが、なかなかのキモいポイント。C#のenumってC/C++のそれと違ってそれなりに厳密なので、自分的には結構衝撃的な仕様だった。まぁ、分かってしまえばどうってことはない。 で、ここからが本題。 そんな0のenumへの暗黙的型変換のおかげで、意図せぬメソッドのオーバーロード解決が行われ、小一時間ハマった。 以下のような処理メソッドAddと、それに対する単体テストAddTestを考える。対象メソッドはプライベートな静的メソッドなので、テスト呼び出しにはPrivateType.InvokeStaticメソッドを使っているが、至ってシンプルなコードである。 何の疑いもなく動くと思いきや、ケース3のテストでのみMissingMethodException例外が発生し、Addメソッドの呼び出しに失敗するのだ! // 加算 private static decimal? Add(decimal? v1, decimal? v2) { return v1 + v2; } // Addメソッドの単体テスト void AddTest() { var privateType = new PrivateType(typeof(AddClass)); // ケース1 var value = (decimal?)privateType.InvokeStatic("Add", 1.0m, 1.0m); // OK Assert.AreEqual(2, value); // ケース2 value = (decimal?)privateType.InvokeStatic("Add", 1.0m, 0.0m); // OK Assert.AreEqual(1, value); // ケース3 value = (decimal?)privateType.InvokeStatic("Add", 0.0m, 1.0m); // MissingMethodException例外が発生! Assert.AreEqual(1, value); } MissingMethodExceptionは読んで字のごとく、メソッドが見つからなかった場合に投げられる例外だ。 ケース1~2は通っているのに見つからないとは一体…!?という感じなのだが、これまでの説明からお気づきであろう、ケース1~2と3では呼び出されるInvokeStaticのシグネチャが違うのだ。同メソッドは引数違いで10個ほどのオーバーロードが定義されており、それぞれ以下のシグネチャのものが呼び出される。 ケース1~2 InvokeStatic(String, params Object[]) ケース3 InvokeStatic(string, System.Reflection.BindingFlags, params Object[]) ケース3では、第二引数の0.0mがBindingFlagsに暗黙キャストされた結果、引数を1つ持つAddメソッドを呼び出そうとして例外を吐くというわけ。なんじゃそりゃー!分かるわけネェーッ!!意図通り動かすにはprivateType.InvokeStatic(“Add”, (decimal?)0.0m, 1.0m)のように、明示的にキャストし正しいオーバーロード解決を導いてあげればよい。 この暗黙型変換を禁止ないし警告出してくれるコンパイルオプションとかないのかしら…ハマった時に死ぬほどわかりづらいんですけど…… PowerEdge T330/PERC H330環境でPVE 8がEFI stubうんちゃらで起動できない件 PowerEdge T330とITファームを書き込んでHBA化したPERC H330環境で、H330に接続したストレージにインストールしたProxmox VE 8.0-2を起動しようとすると、EFI stub: Loaded initrd from LINUX_EFI_INITRD_MEDIA_GUID device pathと出て止まってしまう。マザボから生えてる内蔵SATAの方だと問題ない。 PVEのフォーラムでも同様の現象が報告されている。 Stuck at EFI stub | Proxmox Support Forum Proxmox 8 boot stuck at "EFI stub: Loaded initrd from LINUX_EFI_INITRD_MEDIA_GUID device path" | Proxmox Support Forum ZFSがらみの何かっぽくext4なら大丈夫らしい。根本的な解決策は見当たらないが、PVE 7をインストールしアップデートでPVE 8にした場合は起動するそうで、試しにやってみたら確かに問題なくPVE 8が立ち上がった。すんごい気持ち悪いんですけど。 BIOSとiDRACあたりとの相性かと思い数時間かけて頑張って更新したが、完全な無駄足になってしまった…。更新後はJava版の仮想コンソールが何故か起動に失敗すること多いし、PVEで仮想コンソールのキー入力が全く効かないわ、ACPIシャットダウンが機能しないわでマジで意味がわからん。ただの無駄足であってくれた方がなんと良かったことか…… 一応PVEの動作に問題はなさそうだけど、どうしたものか。 5年半使ったIntel DC S3500 240GBの状態とベンチマーク ファイルサーバで使ってたInte SSD DC S3500 240GB (SSDSC2BB240G4)がお役御免となった。購入記録を採ってるわけじゃないけど、たぶんこの時のSSD⇒Intel SSDSC2BB240G4 (DC S3500 240GB) のベンチマーク。のちに同じSSDを中古購入し、2台でRAID組んでWindows Serverのシステム領域兼記憶域階層のSSD層として使っていた。先に買った方、つまり当時のベンチマークがある方の使用時間は5年半ほどになる。 経年でどの程度パフォーマンスが変わったのか比較してみた。 今 5年半前 S.M.A.R.T. CrystalDiskMark 6 ----------------------------------------------------------------------- CrystalDiskMark 6.0.2 x64 (C) 2007-2018 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 Sequential Read (Q= 32,T= 1) : 504.027 MB/s Sequential Write (Q= 32,T= 1) : 290.264 MB/s Random Read 4KiB (Q= 8,T= 8) : 312.603 MB/s [ 76319.1 IOPS] Random Write 4KiB (Q= 8,T= 8) : 263.048 MB/s [ 64220.7 IOPS] Random Read 4KiB (Q= 32,T= 1) : 311.353 MB/s [ 76013.9 IOPS] Random Write 4KiB (Q= 32,T= 1) : 253.603 MB/s [ 61914.8 IOPS] Random Read 4KiB (Q= 1,T= 1) : 21.859 MB/s [ 5336.7 IOPS] Random Write 4KiB (Q= 1,T= 1) : 66.980 MB/s [ 16352.5 IOPS] Test : 4096 MiB [I: 0.0% (0.1/223.6 GiB)] (x3) [Interval=5 sec] Date : 2023/10/11 0:36:19 OS : Windows 10 Professional [10.0 Build 19045] (x64) Intel DC S3500 240GB SSDSC2BB240G4 (2) ----------------------------------------------------------------------- CrystalDiskMark 6.0.0 x64 (C) 2007-2017 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 Sequential Read (Q= 32,T= 1) : 509.971 MB/s Sequential Write (Q= 32,T= 1) : 285.330 MB/s Random Read 4KiB (Q= 8,T= 8) : 312.081 MB/s [ 76191.7 IOPS] Random Write 4KiB (Q= 8,T= 8) : 271.718 MB/s [ 66337.4 IOPS] Random Read 4KiB (Q= 32,T= 1) : 271.167 MB/s [ 66202.9 IOPS] Random Write 4KiB (Q= 32,T= 1) : 252.995 MB/s [ 61766.4 IOPS] Random Read 4KiB (Q= 1,T= 1) : 33.345 MB/s [ 8140.9 IOPS] Random Write 4KiB (Q= 1,T= 1) : 94.851 MB/s [ 23157.0 IOPS] Test : 4096 MiB [D: 0.1% (0.1/223.4 GiB)] (x3) [Interval=5 sec] Date : 2018/03/01 1:41:52 OS : Windows 10 Professional [10.0 Build 16299] (x64) Intel SSDSC2BB240G4 CrystalDiskMark 8 なし ------------------------------------------------------------------------------ CrystalDiskMark 8.0.4 x64 (C) 2007-2021 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] SEQ 1MiB (Q= 8, T= 1): 498.060 MB/s [ 475.0 IOPS] < 16791.21 us> SEQ 1MiB (Q= 1, T= 1): 404.748 MB/s [ 386.0 IOPS] < 2588.56 us> RND 4KiB (Q= 32, T= 1): 312.375 MB/s [ 76263.4 IOPS] < 418.26 us> RND 4KiB (Q= 1, T= 1): 26.909 MB/s [ 6569.6 IOPS] < 151.62 us> [Write] SEQ 1MiB (Q= 8, T= 1): 287.891 MB/s [ 274.6 IOPS] < 28986.44 us> SEQ 1MiB (Q= 1, T= 1): 288.068 MB/s [ 274.7 IOPS] < 3631.40 us> RND 4KiB (Q= 32, T= 1): 265.559 MB/s [ 64833.7 IOPS] < 492.03 us> RND 4KiB (Q= 1, T= 1): 75.663 MB/s [ 18472.4 IOPS] < 53.74 us> Profile: Default Test: 2 GiB (x3) [I: 0% (0/224GiB)] Mode: [Admin] Time: Measure 5 sec / Interval 5 sec Date: 2023/10/11 0:36:08 OS: Windows 10 Professional [10.0 Build 19045] (x64) Comment: Intel DC S3500 240GB (SSDSC2BB240G4) (2) ランダムリード・ライトが若干遅くなっているように見えなくもないが、4KiB 32QT1は速くなって良くわからん。240GBのSSDに対して93TB書き込んでるけど、問題になるような性能低下はなさそう。損耗率から計算すると残り280TBほど書き込めるようだ。 かたわれのSSDは結構深刻な状態で、ランダムライト速度が半分以下になってしまっている。 ------------------------------------------------------------------------------ CrystalDiskMark 8.0.4 x64 (C) 2007-2021 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] SEQ 1MiB (Q= 8, T= 1): 496.475 MB/s [ 473.5 IOPS] < 16845.23 us> SEQ 1MiB (Q= 1, T= 1): 399.525 MB/s [ 381.0 IOPS] < 2621.80 us> RND 4KiB (Q= 32, T= 1): 312.067 MB/s [ 76188.2 IOPS] < 418.81 us> RND 4KiB (Q= 1, T= 1): 30.675 MB/s [ 7489.0 IOPS] < 133.11 us> [Write] SEQ 1MiB (Q= 8, T= 1): 285.882 MB/s [ 272.6 IOPS] < 29174.83 us> SEQ 1MiB (Q= 1, T= 1): 285.205 MB/s [ 272.0 IOPS] < 3673.12 us> RND 4KiB (Q= 32, T= 1): 92.268 MB/s [ 22526.4 IOPS] < 1419.45 us> RND 4KiB (Q= 1, T= 1): 43.706 MB/s [ 10670.4 IOPS] < 93.19 us> Profile: Default Test: 2 GiB (x3) [D: 0% (0/224GiB)] Mode: [Admin] Time: Measure 5 sec / Interval 5 sec Date: 2023/10/10 22:06:50 OS: Windows 10 Professional [10.0 Build 19045] (x64) Comment: Intel DC S3500 240GB (SSDSC2BB240G4) セキュアイレースしても目立った改善は見られなかった。 Secure Erase前 Secure Erase後 S.M.A.R.T.はメディア消耗指標は問題なさそうだが、電源断保護失敗で異常が検出されており、そのためか電源投入回数が跳ね上がっている。 電源断保護失敗でパフォーマンス低下ってのも良くわからんけど、内蔵の電源回路が不調→コントローラリセット→すぐ回復→辛うじて書き込みは継続、って感じなのかなー? 若干の不安はありつつも、別サーバでZFSのRAID-1構成で引き続き頑張ってもらう予定。 HGST HUC101812CSS200のベンチマーク 中古のPowerEdget T330を買ったらHGST HUC101812CSS200が付いていた。仕様はこんな感じ。 ドライブ名 Ultrastar C10K1800-1200 モデル名 HUC101812CSS200 容量 1.2TB セクタサイズ 512n 回転数 10520RPM インタフェース SAS 3.0 (12Gbps) フォームファクタ 2.5インチ, 15mm厚 実物のSASドライブを見るのも触るのも何気にこれが初めてだったりする。見せてもらおうか、SASドライブの性能とやらを! (参考:ST2000LM007) ------------------------------------------------------------------------------ CrystalDiskMark 8.0.4 x64 (C) 2007-2021 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] SEQ 1MiB (Q= 8, T= 1): 218.497 MB/s [ 208.4 IOPS] < 38209.34 us> SEQ 1MiB (Q= 1, T= 1): 217.400 MB/s [ 207.3 IOPS] < 4816.72 us> RND 4KiB (Q= 32, T= 1): 4.499 MB/s [ 1098.4 IOPS] < 28893.87 us> RND 4KiB (Q= 1, T= 1): 2.191 MB/s [ 534.9 IOPS] < 1867.12 us> [Write] SEQ 1MiB (Q= 8, T= 1): 216.078 MB/s [ 206.1 IOPS] < 38515.68 us> SEQ 1MiB (Q= 1, T= 1): 100.678 MB/s [ 96.0 IOPS] < 10410.15 us> RND 4KiB (Q= 32, T= 1): 3.303 MB/s [ 806.4 IOPS] < 39386.47 us> RND 4KiB (Q= 1, T= 1): 1.001 MB/s [ 244.4 IOPS] < 4085.40 us> Profile: Default Test: 1 GiB (x5) [H: 0% (0/1118GiB)] Mode: [Admin] Time: Measure 5 sec / Interval 5 sec Date: 2023/10/09 0:26:57 OS: Windows 10 Professional [10.0 Build 19045] (x64) Comment: HGST HUC101812CSS200 (SAS/1.2TB/10000RPM) スクショの上がHUC101812CSS200で、下が参考用のST2000LM007の結果。後者はSMRなんでだいぶ不利な結果だと申し添えておく。 2.5インチでシーケンシャルリード、ライトが200MB/s超ってかなり速い気がする。ランダムアクセスもHDDにしては速めなような……さすがSASドライブってところ?まぁ、こんな単純なベンチでは何もわからんのだろうけど。ゼロフィルは1200243695616バイトを6624秒で完了ってわけで、平均182MB/sとなった。 それはそうと、SASってS.M.A.R.T.が取得できないんすな。 当初、PERC H330経由なのが原因かと思ってITファームでHBA化してもダメで、なんでぇ?と思いきや、そもそもS.M.A.R.T.はATA規格の仕組みなので、SASでは取得できないのが正しい、と。SASでドライブの状態が取得できないかと言えばもちろんそんなことはなく、KCQ (Key Code Qualifier)って仕組みで取れるそうな。UNIX系で有名なsmartmontoolsでは、ドライブごとにS.M.A.R.T.とKCQを使い分け、統一的な結果を表示してくれるため、SASドライブでもあたかもS.M.A.R.T.が使えているように見えるとかなんとか。実際のログはこんな感じ。 # smartctl -a /dev/sdc smartctl 7.3 2022-02-28 r5338 [x86_64-linux-6.2.16-15-pve] (local build) Copyright (C) 2002-22, Bruce Allen, Christian Franke, www.smartmontools.org === START OF INFORMATION SECTION === Vendor: HGST Product: HUC101812CSS200 Revision: FU29 Compliance: SPC-4 User Capacity: 1,200,243,695,616 bytes [1.20 TB] Logical block size: 512 bytes Formatted with type 2 protection 8 bytes of protection information per logical block LU is fully provisioned Rotation Rate: 10000 rpm Form Factor: 2.5 inches Logical Unit id: 0x5000cca02d7e9154 Serial number: xxxxxxxx Device type: disk Transport protocol: SAS (SPL-4) Local Time is: Sun Oct 15 23:50:26 2023 JST SMART support is: Available - device has SMART capability. SMART support is: Enabled Temperature Warning: Enabled === START OF READ SMART DATA SECTION === SMART Health Status: OK Current Drive Temperature: 43 C Drive Trip Temperature: 50 C Accumulated power on time, hours:minutes 49469:04 Manufactured in week 36 of year 2017 Specified cycle count over device lifetime: 50000 Accumulated start-stop cycles: 58 Specified load-unload count over device lifetime: 600000 Accumulated load-unload cycles: 2118 Elements in grown defect list: 0 Vendor (Seagate Cache) information Blocks sent to initiator = 1590129651089408 Error counter log: Errors Corrected by Total Correction Gigabytes Total ECC rereads/ errors algorithm processed uncorrected fast | delayed rewrites corrected invocations [10^9 bytes] errors read: 0 10 0 39 257428 3792.083 0 write: 0 0 0 0 39447 5364.802 0 verify: 0 97 0 391 94932 795.533 0 Non-medium error count: 0 SMART Self-test log Num Test Status segment LifeTime LBA_first_err [SK ASC ASQ] Description number (hours) # 1 Reserved(7) Completed 64 3 - [- - -] # 2 Background short Completed 96 1 - [- - -] Long (extended) Self-test duration: 8851 seconds [147.5 minutes] ECCのエラー訂正数とかも取れて、ガチのエンプラ用ドライブしゅごい。まだまだ知らないことだらけですわ。 参考サイト Smart issues with sas drives. | TrueNAS Community Key Code Qualifier - Wikipedia 今度こそRAIDZ Expansionが来る? RAIDZ ExpansionのPR作成の報を打ってから早2年、今度こそRAID-Z Expansionが来そうな雰囲気?である。 当時のPRは閉じられており、6月末にどういう訳か新しいPRに移行して作業が行われている。見てないけどOpenZFSリーダー会議で移行議論の概要が見られるようだ。 今回は着々とレビューとコミットが積み上げられている。RAIDZ Expansion自体は問題なく動いているようで、既に自前ビルドで使っている勇者もいるっぽい。今度こそマージされてほしい。 1 2 3 4 ... 81 82 Older Posts > start.txt 最終更新: 2022-07-27 15:26by Decomo