メインコンテンツへスキップ

最強のレイテンシを実現するIOデバイスの秘密とは

·2 分
2025/03 レイテンシ IOデバイス パフォーマンス SQLite NVMe

最強のレイテンシを実現するIOデバイスの秘密とは

引用元:https://news.ycombinator.com/item?id=43355031

bddicken 2025-03-13T17:19:06

ブログの作者です。この記事を書くのが楽しかった。今までで一番複雑な記事で、インタラクティブなビジュアルのために数千行のjsを書いたよ。みんな楽しんでくれるといいな。

b0rbb 2025-03-13T21:59:18

アニメーションが素晴らしくて、インタラクティブな部分もすごい!例えとしてHDDとSSDのレイテンシの違いを視覚化するのが分かりやすくて、仕事で説明することが多いから助かる。すごい作品だね。

bddicken 2025-03-13T23:22:07

ありがとう!ビジュアルがこの投稿に特別な要素を加えていると思う。時間がレイテンシ説明の重要な要素だからね。

walterbell 2025-03-14T15:52:42

視覚重視の人々のために技術的な娯楽とブランド構築へのマーケティング予算投資にリーダーシップをありがとう!

jasonthorsness 2025-03-13T17:48:19

ビジュアルが素晴らしい;バウンスボックスはレイテンシの相対的な例えとして今まで見た中で一番いいと思う。あなたの”1 in a million”の耐久性についての意見は、ダウンタイムの短さを考慮すると悲観的すぎるんじゃない?例えば、回復が10分だとしたら、3つのサーバーが月に1回ずつ故障する保証があったら、実際には200万分の1じゃないかな。顧客が100万人いるときに1 in a millionは良くないよね!

bddicken 2025-03-13T18:00:54

>あなたの”1 in a million”の耐久性についての意見は、ダウンタイムの短さを考慮すると悲観的すぎるんじゃない?もちろん。本当の耐久性はこれより遥かに高い。誰もデータを失う心配をする必要がないっていう安心感を提供しているんだ。

alfons_foobar 2025-03-13T21:43:31

>一つのサーバーにすべてのデータを保存するのではなく、いくつかのコンピュータにレプリケートすることができる。一般的にはプライマリサーバーがすべての書き込みリクエストを受け取り、そのデータが2つ以上の追加サーバーにレプリケートされるという方法がある。この三つの場所にデータがあれば、データを失う可能性が非常に小さくなるってことだよね。私の理解は合ってる?

bddicken 2025-03-13T23:24:45

PlanetScale Metalでは半非同期レプリケーションを使っていて、プライマリがコミットする前に少なくとも1つのレプリカからACKを受け取る必要があるよ。

alfons_foobar 2025-03-14T14:03:07

あの…やっぱりネットワークホップがあるってこと?

bddicken 2025-03-15T20:31:14

書き込みの場合はそうだけど、ワークロードが90%リードだったらどうなるの?

alfons_foobar 2025-03-16T09:33:59

確かに読み込みが多いワークロードにはすごく合ってるね!もっと裏で何が起きてるか理解したくてさ。

anonymousDan 2025-03-14T00:04:23

リクエストを受け取った時にAckは送られるの?それともリモートのディスクに保存された時?

the_arun 2025-03-13T18:16:53

これを作った人に感謝だね!ちょっと脱線だけど、これを使った教材は中高生にリアルな学びを提供できると思う。

bddicken 2025-03-13T19:04:50

これが高校のカリキュラムで使われたらすごくいいね。

mixermachine 2025-03-13T19:03:37

サーバー3台が1ヶ月でダウンする確率は百万分の1だって。失敗したノードをすぐに交換すれば、リスクは大きく下がる。計算は合ってるかもだけど、30分の間に全滅する確率は213,160,000分の1になるんだ。

TylerE 2025-03-14T06:38:49

でも、失敗は独立で無関係だと仮定してる点が気になる。実際には、失敗が相関していることは多いから、リスクがより高くなるかも。

mixermachine 2025-03-15T12:27:59

その通りだね。サーバーの場所によってかなり影響される。失敗が無関係だって見積もりは簡単だけどさ。

zalebz 2025-03-13T17:32:55

努力のレベルがすごく伝わってくるよ。どれくらいの時間を費やしたと思う?キーボードでの時間と頭の中で考える時間は全然違うよね。

bddicken 2025-03-13T17:37:44

ありがとう!去年の10月から始めて、他のこともやってきたけど、これには200時間以上かけたね。参考までに、合併用のgit diffは+5,820、−1だよ。

dormando 2025-03-13T17:47:25

半分オンテーマだけど、アニメーションに使ったライブラリは何?ソースページからはすぐに分からないから。コンテンツについては十分に分かってるから、特に意見はないけどさ。

もっとコメントを表示(1)
bddicken 2025-03-13T17:52:39

d3.jsをめっちゃ使って作ったよ。

petedoyle 2025-03-13T19:58:30

小ネタだけど、MacOSのChrome 133.0.6943.142では見れなかった。Firefoxでは問題なし。

homebrewer 2025-03-13T20:02:37

こっちはFirefoxでアニメーションが無いけど、Braveではちゃんと表示される。ブラウザコンソールがこちらのリンクをバンバン出してる:<https://react.dev/errors/418?invariant=418>。追記:どうやらユーザースタイルの拡張機能が原因みたい。Reactがそれを嫌ってページが壊れちゃう。

bddicken 2025-03-13T20:44:28

おお、興味深い!理想的ではないけど、拡張機能の問題なんだね。

bddicken 2025-03-13T20:45:04

面白いね。何かブラウザの拡張が影響してるかも?コンソールのエラーも教えて。

petedoyle 2025-03-13T21:02:44

やっぱりそうだった!拡張機能を一つずつ無効にしていったらreflect.appの拡張だと判明。編集:彼らのDiscordに報告したよ。大丈夫だった!素晴らしい作品だね!

anymouse123456 2025-03-14T11:58:09

こういうデータビジュアライゼーションが大好き。スケールの比較を内面化するのが苦手だけど、視覚化で直感がかなり掴めるよ。素晴らしい仕事、ありがとう!

bddicken 2025-03-14T16:18:44

時間要素がある分、視覚が特に重要だと思う。いい感じだね。

hodgesrm 2025-03-16T17:26:10

あなたのテープ操作モデルを見て嬉しかった。COBOL時代にかなり使ってた。記事の理由で、シーケンシャルスキャンを最大限に使おうとしたけど、COBOLはそれが得意だった。処理速度の遅さとドライブヘッドからくるブロックの流れにギャップがあると、ドライブがオーバーシュートしちゃって、追いつけなくなる。コードを見直して修正してた。

AlphaWeaver 2025-03-13T20:56:03

Bartosz Ciechanowskiの影響を受けてる?最初に思ったのは、彼がこの投稿のビジュアルを担当したのかと思ったよ。

logsr 2025-03-13T18:54:03

素晴らしいプレゼンテーションだね。概念を理解するのに役立つよ。ただ、SSDの並列処理の影響が少し過小評価されてる気がする。ハイエンドのデバイスでは8チャンネルコントローラーが一般的で、4KランダムIOPSはキューの深さとともにスケールするんだけど、入門としてはこの例で十分かも。PlanetScaleがこの方向に進んで知識を共有してるのを見るのはいいね。

bddicken 2025-03-13T19:40:21

情報ありがとう!もっと学びたい人のために、参考になる資料とかあれば教えてほしいな。

alexellisuk 2025-03-13T17:48:48

EC2でローカルのNVMeが付いてるメタルインスタンスって実際に何なの?最小の遅いGravitonを除いて、AWSでベアメタルインスタンスを取得するには月に約2.3k USDかかるって前に見たけど。

tombert 2025-03-13T21:54:41

視覚化が素晴らしいね。見たり遊んだりするのが楽しくて、記事ととても合ってる。これを誇りに思っていいよ、すごく楽しめた。

layer8 2025-03-14T02:53:48

Safariではアニメーションが見えないんだ。可変幅のフォントが好みだし、モノスペースの文章は読みづらい。それにReader Modeを使うとテキストの色付けが消えちゃうし、視覚効果も隠れちゃうかも。

bddicken 2025-03-14T02:58:54

面白いね!何かエラーが報告できることある?Safariでも動くはずだけど、カスタム設定があるのか、古いバージョンを使ってるのかな?

chris_pie 2025-03-14T14:18:27

AndroidのChromeを使ってるけど、AdGuardがあなたの視覚化を全部ブロックしてるよ、FYI。

inetknght 2025-03-13T17:23:29

視覚化が一つも見当たらないんだ。JavaScriptを使わずにウェブを使ってるから、静的な画像を埋め込むか追加してはどうかな?

bddicken 2025-03-13T17:28:01

視覚化がこの記事にとても貢献してるね。全体のテーマはレイテンシーで、視覚化によってテープがHDDより遅く、HDDがSSDより遅い理由がわかりやすくなるし、楽しいよ。最近はJavaScriptなしで、何をしてるの?

inetknght 2025-03-13T17:31:50

>”最近はJavaScriptなしで、何をしてるの?”
ウェブを閲覧したり、メールの送受信をしたり、ストーリーを読んだり、ゲームをしたり、普通のことをしてるよ。主にネイティブアプリを使って、JavaScriptを使うサイトを選んでるんだ。

もっとコメントを表示(2)
bob1029 2025-03-13T18:05:58

SQLite+NVMeの組み合わせを推してるんだけど、これでいつも通りよりもトラブルに深くハマれるかもしれないんだ。場合によっては、水平スケールせずに解決できちゃうかも。レイテンシはパフォーマンスの王様だし、特にアイテムをシリアルに処理しなきゃいけないケースではね。SQLiteをNVMeで動かせば他にはないレイテンシの利点が得られると思う。実際の使い方では、メモリ上で動かすよりもNVMeの方が大きな効果があるとは思えない。

crazygringo 2025-03-13T19:35:46

SQLiteを選ぶ理由って何だろう?Postgresみたいな従来型のクライアントサーバーDBの方がいいんじゃない?単一ホストなら少し早いかもしれないけど、2台のWebサーバーがあったらお互いにDBに書き込むのが大変になるし。>“レイテンシはパフォーマンスの王様だ”ってのはちょっと誤解を招くかな。まず、一貫性がないとパフォーマンスは意味がないし、複数のWebサーバーがあるとその問題が出てくる。

conradev 2025-03-13T20:13:45

SQLiteのシングルライター制限に当たるまでは、Postgresにより多くのCPUサイクルを使う必要はないよ。

chatmasta 2025-03-14T03:05:09

その制限は、特にリードオンリーなSQLiteやセッションごとに一つのSQLiteに計画を立ててない場合、すぐに直面することになるよ。

conradev 2025-03-14T18:47:05

うーん、想像つかないな。ほとんどのCRUDアプリはOLTPでリードオンリーなんじゃないかな。普通のCRUDアプリでSQLiteをぎりぎりまで使うには、数千の同時ユーザーが必要になる気がする。

spratzt 2025-03-14T10:07:07

ほとんどの企業のOLAP処理ではその制限には達しないと思うよ。ほとんどがリードオンリーのSQLiteだからね。書き込みは通常、バッチ処理されてて、業務外に実行されるからSQLiteの制限は関係ないんだ。

andai 2025-03-14T16:54:11

バッチ処理はどこでやってるの?

chatmasta 2025-03-14T17:45:07

DuckDBの信者が操ってる別のシステムだよ。

theamk 2025-03-14T03:57:23

必要になる可能性が高いなら、最初からPostgresを選んだ方がいいと思うよ。SQLiteから後で切り替えるのは手間だからね。小さなトラフィックなら、ウェブアプリと同じホストで動かすのは簡単だし、Unix認証ならパスワードも管理いらないし。複数のライターが必要になった時に、DBクエリを全部書き直す必要はないよ。

bob1029 2025-03-13T20:36:28

全体の目的はネットワークの遅延を避けることなんだ。アプリケーション <-> SQLite <-> NVMeは、アプリケーション <-> Postgresクライアント <-> ネットワーク <-> Postgresサーバー <-> NVMeよりも桁違いにレイテンシが少ない。>“できるだけシリアルなDBクエリを避けるべき”っていうのは、その決定権は俺にはないんだ。ビジネス側が決めるから。

myflash13 2025-03-14T07:39:29

Postgresは同じマシンでUnixソケットをサポートしてるよ。そのおかげで127.0.0.1のTCPスタックよりレイテンシが大幅に改善されるんだ。

sedatk 2025-03-13T20:52:49

”…は桁違いにレイテンシが少ない…”って本当?ローカルネットワークアクセスはローカルIPCと大差ないはずだよ。

bob1029 2025-03-13T23:10:37

>ローカルネットワークアクセス MySQLやPostgres、DB2、Oracleなどがアプリケーションと同じマシンで動くプロダクションシナリオってどんなの?ほとんどのベンダーはそうするなって言うと思う。

TylerE 2025-03-14T06:41:55

95%のウェブサイトがAmazonやGoogleじゃないの?小さなVMで運営されているサイトはたくさんあるよ。Postgresは512MBの環境でも快適に動くからね。

chatmasta 2025-03-14T03:04:06

SQLiteをローカルで使うなら、Postgresもローカルで使うのは全然ありだよ。シャーディングの問題も解決済みなんだからさ。

crazygringo 2025-03-14T13:19:12

>私はほとんどのベンダーがそうするなって言うと思う それは違うよ。Apacheが動いてる同じホストにPostgresやMySQLを置くのは、新しく始めるサイトでは非常に一般的だから。512MBのインスタンスでも問題なく動くし、SSDでもかなりのトラフィックに耐えられる。人気が出たら、次はデータベースを別サーバーに分けるけど、その理由は複数のウェブサーバーが必要になるから。データベースは思ってるほど重くないよ。

bobmcnamara 2025-03-14T03:52:15

コンテクストスイッチとmmapアクセスは、しばしばmmapアクセスより遅くなることがあるよ。

badmintonbaseba 2025-03-14T09:29:15

SQLiteにはIPCが無いんじゃない?

nolist_policy 2025-03-14T09:45:08

複数のプロセスから同じデータベースにアクセスすればIPCはあるよ。

badmintonbaseba 2025-03-14T14:08:31

SQLiteの同時アクセス時のIPCメカニズムについて、ファイルロックやOSが確保する原子的なIO操作以外に何かあるの?

もっとコメントを表示(3)
myflash13 2025-03-14T07:40:46

過去にテストしたけど、PostgresはローカルネットワークよりUnixソケットの方が明らかに速いよ。

crazygringo 2025-03-13T21:37:37

“データベースのレイテンシは一般的にインターネットの往復レイテンシに比べて微小”って言ったんだけど、ユーザーとウェブサイトの間を指してるの。だから、ローカルネットワークのホップで注文のあるレイテンシにはならないよ。記事でもデータセンター内の往復で5倍遅いって言ってるし、データベースがクエリ実行する時間に比べれば大したことない。それに最適化しすぎるのは時期尚早な例だよ。

392 2025-03-14T00:59:14

SQLiteはプロセス内で動かせるけど、プロセスコンテキストスイッチでレイテンシと帯域幅が10倍悪化することもある。n+1秒とかで開発時間が節約できることもあるよ。

crazygringo 2025-03-14T13:32:11

>レイテンシと帯域幅が10倍悪化することもある。そんなことはないよ。帯域幅に関する主張が意味を持たない。速度差は1%か5%の話であって、10倍じゃない。

bob1029 2025-03-14T16:40:38

絶対に悪化するよ。同じコアでのコンテキストスイッチは数マイクロ秒だけど、コア間を超えると数十から数百マイクロ秒かかることもある。

crazygringo 2025-03-15T13:59:13

数百マイクロ秒とかL1アクセスって何言ってるの?プロセス間の通信は、クエリ実行に必要なディスクやSSDのアクセスと処理に比べると無視できるレベルだよ。SQLiteがプロセス内で動くのはシンプルさと便利さのためだし、パフォーマンスが悪化することもある。

immibis 2025-03-14T19:49:58

Postgresを同じサーバーで使うならIPCのオーバーヘッドについて、自分の直感と永続的なプロセスからの節約を天秤にかけて考えてみて。SQLiteは取引の間に別のプロセスがデータベースを完全に変えちゃうから、あまりキャッシュできない。Postgresはデータベースの全てを知ってるよ。

cynicalsecurity 2025-03-13T20:13:33

SQLiteは書き込みの並列性があまり得意じゃない。サポートはしてるけど、ちょっと扱いづらくて失敗することも。特定のモードを使う以外にも、アプリで書き込み用のスレッドを一つにしておくトリックが有効。

bob1029 2025-03-13T20:38:32

>書き込み用のスレッドが一つだけで問題ないなら、SQLiteは絶対に優れている。コマンドをマイクロ秒単位で処理することが目的なんだから、書き込みは一つで済むのが理想だよ。金融取引所もこの前提で運営されてる。

chatmasta 2025-03-14T03:06:17

金融取引所が永続データストアに対してシングルスレッドの書き込みを行ってるなんて信じられない。もしそうだと証明できるリンクがあれば教えてほしい。

bob1029 2025-03-14T09:36:11

>https://www.infoq.com/presentations/LMAX/ 記事のソースとしてのリンクだね。

diziet_sma 2025-03-14T16:08:56

それは金融取引所じゃなくてスポーツベッティングや経費管理システムだよ。データセンターは特別なハードウェアを使ってるから、sqliteがその裏で動いてるとは思えない。オーダーマッチングはシングルスレッドだし、電子取引システムの実装について知ってる人がいたら知りたいな。

jstimpfle 2025-03-13T18:25:37

デスクトップでNVMeディスクを使ってfsync()をやったら1〜2msのレイテンシを測定した。最新のシステムだと約800usだよ。

rbranson 2025-03-13T18:41:59

あんまりそうは思わないな。これはWD 850X Gen4 SSDでのfio randwriteワークロードの結果だよ。

jstimpfle 2025-03-13T19:26:02

O_DIRECTを使ったら逆に大きな違いに気づかされた。ありがとう!

wmf 2025-03-13T20:27:11

ランダム書き込みとfsyncは同じじゃない。消費者向けSSDの連続書き込みは耐久性がないからすごく速いよ。

dzr0001 2025-03-13T19:14:35

これはどのドライブで、トリムが必要か? NVMeデバイスは、特に消費者向けでは品質に差があるんだ。僕の前の仕事では、こういったレイテンシを持つドライブはアウトだったよ。

jstimpfle 2025-03-13T22:05:48

今使ってるのはSAMSUNG MZVL21T0HCLR-00BH1で新しい仕事用ラップトップに搭載されてる。250us下回ることができない。前のWD_BLACK SN850XはM.1スロットに接続されてたけど遅かったかも。今のエンタープライズハードウェアの性能についての情報を探してるんだけど、いい情報源が見つからない。

kev009 2025-03-14T07:47:39

NVMeはただのプロトコルだよ。ゴミのようなドライブから高級車並みの価格のものまでいろんなのがある。結局、DRAMのレイテンシには及ばないけどね。

magicmicah85 2025-03-13T18:23:47

この内容、めっちゃ役立ったし、商品を宣伝してるとは忘れちゃうくらいだよね!グラフィックやインタラクティブな部分も素晴らしかった。

記事一覧へ

海外テックの反応まとめ
著者
海外テックの反応まとめ
暇つぶしがてらに読むだけで海外のテックニュースに詳しくなれるまとめサイトです。