雑文一覧

Ubuntu16.04の輻輳制御はデフォルトとBBRでどのくらい速度が違うのか比較

前置き

デフォルト設定のサーバとBBR設定済みのサーバを用意して、クライアントからサーバへアクセスしてファイルをダウンロードした時のダウンロード速度の比較です。
実際に使いそうな環境でBBRに変えた場合に、pingの違うサーバでどの程度の効果があるのか確認したかったので試してみました。
とはいえ環境や回線の混み具合で結果が大幅に変わるガバガバな測定方法なので、決して当てにしてはいけない数値です。
あと測定方法は以下のPowerShellスクリプトを参考にしたのですが、これも信用できるかよく分かっていないです。
PowerShell: Measuring Download Speeds – Trevor Sullivan’s Tech Room

測定環境

サーバ

  • OS : Ubuntu 16.04.4
  • kernel : 4.13.0-36-generic
  • 場所 : 東京、シアトル、パリ (VultrのVPSをそれぞれの場所のデータセンターに構築)
  • HTTPサーバ : Apache2
  • sysctlの設定
    設定 デフォルト BBR
    net.core.default_qdisc pfifo_fast fq
    net.ipv4.tcp_congestion_control cubic bbr

クライアント

  • OS : Windows10
  • 場所 : 日本国内
  • 回線 : FLETS光

測定方法

  • 東京、シアトル、パリの3箇所に1GBのテストデータを置いたHTTPアクセス可能なサーバを構築。
  • サーバの輻輳制御アルゴリズムはデフォルト(cubic)とBBRの2つ。
  • クライアントからテストデータをダウンロードした際のダウンロードファイルのサイズを測定。

測定結果

東京に構築したサーバ

  • Ping平均 : 6ms
デフォルト(cubic) BBR
平均速度(3回試行) 19.12MB/sec 65.45MB/sec
平均完了時間(3回試行) 50秒 15秒

シアトルに構築したサーバ

  • Ping平均 : 99ms
デフォルト(cubic) BBR
平均速度(3回試行) 6.01MB/sec 22.62MB/sec
平均完了時間(3回試行) 2分38秒 42秒

パリに構築したサーバ

  • Ping平均 : 231ms
デフォルト(cubic) BBR
平均速度(3回試行) 2.93MB/sec 9.81MB/sec
平均完了時間(3回試行) 5分25秒 1分38秒

所感

実施前は速くなったとしても数%程度だと思っていたので、正直なところ測定ミスを疑って同じ手順で2回やってみています。
BBRの速度はグラフで見ると天井に張り付くような形で推移しており、特にpingの大きいパリの結果で顕著です。回線速度の上限までうまく使っているということなのかな?

どうにしろ、速度が欲しくてOSをチューニングする場合には、試すべき一手と言えそうです。


bgm.xflから切り出したwavをそれっぽいoggに整える

必要になるたびメモを探すのでこっちにも残しておく。
oggSplitを使用するため、OSにUbuntuの入っている環境が必要になり、大抵の場合は準備に手間がかかると思われる。

うろ覚えだが、対象は中身のエンコードがoggでヘッダや曲情報?がwaveと同様なファイルになっていたはずなので、正常なoggにする加工が必要となるが変換ではないため「整える」と表記する。
昔はWindowsのエンコード変換ツールでヘッダを無視できるものを使ってたはずなのだが、何だったか思い出せなかった。

手順


切り出し

X-Ripperやスペシャルねこまんま57号などでWAVを指定して切り出し。

ヘッダをoggとして整える

以下の手順はUbuntu 16.04で確認済み

頭の66バイトを削除する

tail -c +67 sample.wav > sample_tmp

必要となるoggSplitがoggvideotoolsパッケージに含まれるためインストール

sudo apt-get install  oggvideotools

oggSplitでヘッダを綺麗にする

oggSplit sample_tmp

oggSplit実行後に出力される「vorbis_0.oga」というファイルが目的物なので、oggに拡張子を変更

mv vorbis_0.oga sample.ogg

以上で1ファイルの処理が完了だが、不要な中間ファイルなどは適当に削除すること。

複数ファイルを纏めて処理する場合


ヘッダを整える部分は以下を使うと、カレントディレクトリ内をまとめて処理できる。

for file in `\find . -maxdepth 1 -name "*.wav" -type f`; do
  tail -c +67 $file > "${file:0:-4}_tmp"
  oggSplit "${file:0:-4}_tmp"
  mv vorbis_0.oga "${file:0:-3}ogg"
done