# バッファブロートとキュー管理
## 定義
バッファブロートとは、スイッチやルーターなどの外部ネットワークコンポーネントが自身のスループットを上げようとして大きなバッファを使うことにより、パケットが長時間キューで待たされてしまう現象である。これが起きると、ホスト側でTCP輻輳回避アルゴリズムが発動し、かえってパフォーマンスが下がる。エンドツーエンド原理([Saltzer 84])によれば、バッファリングの効果はエンドポイント(ホスト)から生まれるべきもので、中間のネットワークノードから生まれるべきではないとされる。Linux 3.xカーネル以降、この問題に対処するための機能(キューのバイト制限、Codelキューイング規則、TSQ: TCP Small Queue)が追加されている。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 10 ネットワーク]] §10.3.6)
## 横断的知見
(このconceptは現時点で単一ソース(詳解 システム・パフォーマンス 第2版 第10章)のみに基づく。複数ソースの突き合わせで見えた観察が蓄積されるまでは、本節は空のまま育てていく。)
## 未解決の問い
- CoDel/fq_codelとBQL(Byte Queue Limit)・TSQ・EDT(Earliest Departure Time)は、それぞれキューのどの階層(qdisc層・ドライバキュー層・ソケット送信バッファ層)で作用するのか。本章はそれぞれの機構を個別に説明するが、レイヤをまたいだ相互作用の全体像は明示していない。
- Linuxディストリビューションのデフォルトqdiscがpfifo_fastからfq_codelへ移行しているという記述があるが、fq_codel移行後もバッファブロートが残存するケースの実測例はあるか。
- EDT(タイミングホイールでパケット順序を決める、Linux 4.20で追加)とBQL/TSQは「似た機能を提供する」とされるが、両者を併用した場合の相互作用や優先順位はどうなるか。
## 関連
- [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 10 ネットワーク]] — バッファリング(§10.3.6)・TCPバッファリング(§10.4.3.3)・その他の最適化(TSQ/BQL/EDT、§10.4.3.10)・キューイング規則(§10.4.3.5, §10.8.1.10)。
- [[詳解 システム・パフォーマンス 第2版]]
## 出典
- [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 10 ネットワーク]] §10.3.6, §10.4.3.4, §10.4.3.5, §10.4.3.10, §10.8.1.10