元のvmsplice()
実装では、パイプに収まる最大ページ数の2倍のユーザーランドバッファーがある場合、バッファーの後半でvmsplice()が成功すると、カーネルがバッファの前半。
しかし、それは結局のところ真実ではありませんでした。特にTCPの場合、カーネルページは反対側からACKを受信するまで保持されていました。これを修正することは将来の作業として残されたため、TCPの場合、カーネルはパイプからページをコピーする必要があります。
vmsplice()
ある種のこれに対処するオプションがありSPLICE_F_GIFT
ますが、問題は、カーネルから新しいページを効率的に取得する方法と、キャッシュのゴミ箱を減らす方法という、他の2つの問題を明らかにすることです。最初の問題は、mmapがカーネルにページをクリアすることを要求することであり、2番目の問題は、mmapがカーネルで派手なkscrubd機能を使用するかもしれないが、プロセスのワーキングセットを増やすことです(キャッシュトラッシング)。
これに基づいて、私はこれらの質問があります:
- ページの安全な再利用についてユーザーランドに通知するための現在の状態は何ですか?私は特にソケット(TCP)にsplice()されたページに興味があります。過去5年間に何かが起こりましたか?
- //
mmap
/ TCPサーバーでのゼロコピーの現在のベストプラクティスですか、それとも今日より良いオプションがありますか?vmsplice
splice
munmap