Splice() の再考 Posted on March 3, 2023 By 📢 Medium™ LWN購読者様からご紹介いただいた記事 LWN.web の購読者は、このテキスト (およびそれを取り巻くすべての問題) を作成しました。 あなたが私たちのうなり声の材料を尊重する必要がある場合は、購読を奪い、あなたが叫ぶ可能性のある以下の一連の記事を作成してください.ジョナサン・コーベット2023年2月17日 splice() システムコール は鋭いアイデアに基づいて構築されています: 2 つのファイル記述子をまとめて接続し、ファイルをあるファイルから別のファイルに追加で移動できるようにします。スプライス() は、何年にもわたっていくつかの重要な効率の最適化を可能にしましたが、高度な操作が可能であり、場合によっては美しいことも証明されています。 最新の linux-kernel ダイアログでは、splice() は惨めさを引き起こす可能性があり、それと組み合わせて理想探しのアイデア。 Stefan Metzmacher は サンバです splice() を喜んで利用する開発者 を使用して、Samba サーバーにゼロレプリカ I/O の電源を入れます。 しかし、彼は 危険な場所 に足を踏み入れました。 ファイルがネットワークを介してマイル離れた消費者に送信されている場合、 splice() また、ファイル ファイルをソケットにフィードするために古いものにすることもできます。 ネットワーク層は、この時点でファイルがカーネル内でコピーを作成することを望まずにページ キャッシュから取り出されることを学習します。これはまさに望ましい結果です。 それにもかかわらず、ネットワーク送信が完了する前にファイルが書き込まれた場合、新しく書き込まれたファイルも送信されます。 splice() 呼び出しは、おそらく同じジョブであっても、作成済みに変更されました。 これは、少し離れた場所で得られたヒントが予想以上のものであることがめったにない場合、不当な驚き (そして悲しい Samba ユーザー) につながる可能性があります。 ここでの危険性は、最初のクイズで思われるよりも洗練された形式です。 まず、この時点でネットワーク ソケットにファイルを接続するように叫ぶことはありません。 splice() には少なくとも 1 つのそれに与えられたファイル記述子の距離はパイプです。 したがって、一連の操作は、ファイルを正しいパイプにスプライスし、次にパイプを 2 番目の splice() でソケットに接続することです。 電話。 どちらの splice() 呼び出しも、ヒントがいつ発生するかを認識しません。それは通過し、最終的な通勤配達に達しました。 ネットワーク層は、splice() 呼び出しが実行されました。 ヒントが送信され、ファイルをもう一度調整するために保護されていることを理解するための簡単な方法は、おそらくほとんどありません。 Metzmacher は予備メールで、ファイル キャッシュ ページにマークを付けて、この危険をやめるように叫ぶ可能性があるかどうかを尋ねました。それらが splice() に渡された後のレプリカ オン ライトとして。 次に、転送が進行中にファイルが書き込まれた場合、ファイルへの書き込みが独立して進行している間に、その転送も古いファイルから学習し続けることができます。 Linus Torvalds 艦隊 はその概念を拒否 し、バッファーの共有を発表しました。ヒントを保存すると、「接合点全体 」。 これらのページをレプリカ オン ライトにすると、ファイルの共有全体が台無しになります。 彼は後に 追加 した splice() 呼び出しは、受信と見なされるためにおそらく静かにする必要がありますmmap()、同じセマンティクスを持つ。 彼はまた言った: “あなたはおそらく「私はもはや派手なスプライスを作りません()」. splice() は非常に理にかなっています.” splice() はもはや代替できません。新しいアプリケーションを台無しにします。 トーバルズの憎しみでさえ、もはやそれを克服することはできません. Samba 開発者 Jeremy Allison Metzmacher の危険への対応は、買い手が安全なファイルのリースを保持している場合、Samba がゼロ レプリカ I/O を完全に実現することであると指示されました 。したがって、同時受信エントリがないことを保証する必要があります。 彼は後に リバース しなければなりませんでしたしかし、その考え; Samba サーバーは、ネットワーク転送がいつ完了したかを知ることができないため、リースが存在する場合でも、驚くほど静かになる可能性があります。 したがって、彼は「splice() は、リースされたファイルの場合でも Samba では使用できません 」。 デイブ・チナー この危険性は、ファイルシステム層で事前に解決された人々に似ていることに気づきました。 RAID 5 やファイルシステムによって圧縮されたファイルと組み合わせて、書き込み対象のファイルを操作中のすべてのマップで安定した状態に保持したい場合が多くあります。 これが全体の 定常ページの危険性ですほぼ12年前に直面した。 ほとんどの場合、同一の応答がここで実装されると彼は言いました。 () チェーンは、操作が実行されるまで単純にブロックされます。 各 トーバルズと Matthew Wilcox は、このアイデアの欠陥を指摘しました: スプライス() 操作は無限の時間間隔を盗む可能性があるため、ファイルへのエントリを無期限にダム受信することは (意図的でないかどうかに関係なく) 時代遅れになります。 . その考えは少しも行きませんでした。 アンディ・ルトミルスキ 主張した スプライス() は、アプリケーションが何を貪り食わなければならないかについての欠陥のあるインターフェースです。 splice() には有用な話し方がありませんトピック ファイルを呼び出し元に再度送信します。 変化として、彼は言った、 io_uring も、この機能を強化するためのより優れた手法になります。 複数の操作を正常にキューに入れることができ、重要なことに、特定のバッファーが使用されなくなったことをユーザーに知らせる完了メカニズムがあります。 io_uring のメンテナーである Jens Axboe は、すべての問題の前に このアイデアについては、もはや確信が持てませんが 、しかし Lutomirski の後に 熱中したパイプを公開から外し、パイプ以外のファイル記述子を 1 つ許可することで、可能性が単純化されることを指示しました。この時点で互いに接続されます。 パイプ、Axboe 氏は次のように述べています。 " ほとんどの場合。 元の「ファイルを出荷」する io_uring 操作は、ほとんどの場合、この危険に対応する理想的な検索であるという Axboe の考え。 ヒントでの非同期操作とパイプを使用せずに基礎から設計されます。 誓いを立てて、それはこの対話から出てくる応答でさえあるかもしれません—当然のことながら、誰かが最初にそれを力に入れる必要さえあります. かどうかの話に変わったsplice() は非推奨にするためにおそらく静かにする必要があります。 Torvalds は仲介しません システムコールには強力な価格があります: 「すべての問題はプロセスのパイプラインである」という同一のアプローチは、非常に強力な歴史的な Unix であり、シェル スクリプトにとっては本質的に貴重ですが、本質的にそれ以上になることはめったにありません。ほとんどの場合、より大きな問題には非常に貴重であり、splice() は本質的に、その概念的な危険ほど生き残る方法はありません。 それにもかかわらず、私たちはそれに巻き込まれています。 splice() ただし、カーネルに大きな変更がない場合。 Torvalds 氏は、io_uring アプローチが最終的により優れたものになることに疑問を呈しました。 発見するための最良の方法は、間違いなくそれを確認し、それが本質的にどのように機能するかをブランド化することです. それが発生することを除いて、 splice() が目立ちますカーネルが提供しなければならない最高のものとして、その欠点にもかかわらず. (ログインしてコメントを投稿) 𝚆𝚊𝚝𝚌𝚑 𝙽𝙾𝚆 📺 Artificial intelligence, Ask HN, Rethinking, Show HN, Splice, Technology, TOP HN Tags:Rethinking, Show NH:, Splice