Ubuntu一覧

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をチューニングする場合には、試すべき一手と言えそうです。


Ubuntu 16.04に新しいカーネルをインストールしてBBRを使用する

BBRとは

Linuxカーネルの4.9からGoogleが開発したBBRというアルゴリズムを通信に使えるらしい。
古いアルゴリズムと比べてTCPの転送速度が早くなるらしい。なら使わなきゃ損でしょ。
でもUbuntu 16.04のデフォルトのカーネルは古くて対応してないので、新しいものを入れてBBRの設定もする手順を残しておく。
Ubuntu 18.04ならカーネルが4.15らしいので設定するだけで使えそう。もしかするとデフォルトでオンになるかもしれないけど。

確認環境

  • OS : Ubuntu 16.04.3

新しいカーネルのインストール

カーネルパッケージの一覧を確認

apt-cache search linux-generic

以下のように表示される

~~~
linux-image-4.13.0-32-generic - Linux kernel image for version 4.13.0 on 64 bit x86 SMP
~~~

特にこだわりはないので例では確認時点の最新版(linux-image-4.13.0-32-generic)をインストール

sudo apt install linux-image-4.13.0-32-generic

BBRの有効化

「/etc/sysctl.d/10-custom-kernel-bbr.conf」ファイルを作成

sudo vi /etc/sysctl.d/10-custom-kernel-bbr.conf
#以下を記述して保存
---
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
---

カーネルの有効化も兼ねて再起動

sudo reboot

BBRの設定を確認

sysctl net.core.default_qdisc
sysctl net.ipv4.tcp_congestion_control

---
#こうなる
$ sysctl net.core.default_qdisc
net.core.default_qdisc = fq
$ sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = bbr
---

これで設定完了。

時間ができたら実測してみた値とかまとめたい。


Ubuntu 16.04でKVM仮想マシンからブリッジを通る通信のNetfilterをオフにする設定

全部Ubuntuマニュアルのsysctl.dディレクトリについてのページで書いてあることそのままだけど、sysctl.dの設定方法の一例として説明されているので気づくのに時間かかった。
試してはいませんが、マニュアルを見る限りubuntu 12.04以降で有効な設定みたい。

設定方法


以下2つの内容の設定ファイルを作成する。

/etc/udev/rules.d/99-bridge.rules

ACTION=="add", SUBSYSTEM=="module", KERNEL=="br_netfilter", \
RUN+="/lib/systemd/systemd-sysctl --prefix=/net/bridge"

/etc/sysctl.d/bridge.conf

net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

これでbr_netfilterモジュールが読み込まれたときにbridge.confの設定が適用されます。
設定を有効にするには再起動が必要になるので注意が必要です。

こちらでは紹介しませんが、マニュアルにはモジュールの強制読み込みと一緒に設定を適用する方法も書いてあります。

上記設定にたどり着いた理由とか


Netfilterをオフにしない場合どう見えるか

意識して制御していなければ、おそらく以下の図のようになります。

仮想ブリッジ上でtcpdumpを取ると、仮想マシン/端末の双方から送ったパケットが見えますが、その先には届きません。

/etc/sysctl.confまたは/etc/ufw/sysctl.confに設定を記述する方法

以下のファイルに設定を入れる方法も試しましたが、起動時に設定適用されなかった。

  • /etc/sysctl.conf
  • /etc/ufw/sysctl.conf

ついでに書くと、/etc/sysctl.d/以下にただ設定ファイルを作るだけというのもうまくいかなかった。

/etc/sysctl.confに設定を入れて起動時にsysctl -pする方法

inidやsystemctldで[sysctl -p]を実行するようにしても以下のエラーが出て適用できなかった。
このため、モジュールの読み込みタイミングより前に設定適用してしまっていると推測している。

Apr 23 00:12:29 server systemd-sysctl[397]: Couldn’t write ‘0’ to ‘net/bridge/bridge-nf-call-iptables’, ignoring: No such file or directory


rcloneでAmazonCloudDriveにデータを暗号化して同期する


2017/6/4
RcloneのAmazonCloudDrive接続がClientIDが無効になったことによりできなくなっています。
https://forum.rclone.org/t/rclone-has-been-banned-from-amazon-drive/2314

rcloneが暗号化に対応したと聞いて試してみた。

やること

rcloneを使用してローカルのファイルをAmazonCloudDriveと同期する。
rcloneの機能でAmazonCloudDrive上にデータをアップロードする際は暗号化し、ダウンロードする際は復号化する。

暗号化の必要性

Amazon Cloud Drive利用規約を読むと、アマゾンがファイルにアクセスすることもありうる内容になっている。
私がアヘ顔ダブルピースしているホームビデオを見られる可能性があると困るため、暗号化してファイルを置くことが必須となる。

確認環境

ローカル側
– Ubuntu 16.04
– rclone v1.35
– Windows10(認証用)

リモート側
– Amazon Cloud Drive(プライム会員の5GB)

手順

手順は以下を参考にした。
https://www.reddit.com/r/DataHoarder/comments/598pb2/tutorial_how_to_make_an_encrypted_acd_backup_on/

Ubuntuへのrcloneインストール

ほぼ公式に書いてある手順と同一。

mkdir -p ~/work/rclone
cd ~/work/rclone

sudo apt install unzip

curl -O http://downloads.rclone.org/rclone-current-linux-amd64.zip
unzip rclone-current-linux-amd64.zip
cd rclone-*-linux-amd64

sudo cp rclone /usr/sbin/
sudo chown root:root /usr/sbin/rclone
sudo chmod 755 /usr/sbin/rclone

sudo mkdir -p /usr/local/share/man/man1
sudo cp rclone.1 /usr/local/share/man/man1/
sudo mandb

rcloneにAmazonCloudDriveを設定

実行ユーザ毎に設定が作られる。
途中で入力するトークンは後述の方法で入手した。

$ rclone config
2017/--/-- --:--:-- Config file "/home/test/.rclone.conf" not found - using defaults
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n <-新規に設定を作成
name> ACD <-設定の名前をつける
Type of storage to configure.
Choose a number from below, or type in your own value
 1 / Amazon Drive
   \ "amazon cloud drive"
 2 / Amazon S3 (also Dreamhost, Ceph, Minio)
   \ "s3"
 3 / Backblaze B2
   \ "b2"
 4 / Dropbox
   \ "dropbox"
 5 / Encrypt/Decrypt a remote
   \ "crypt"
 6 / Google Cloud Storage (this is not Google Drive)
   \ "google cloud storage"
 7 / Google Drive
   \ "drive"
 8 / Hubic
   \ "hubic"
 9 / Local Disk
   \ "local"
10 / Microsoft OneDrive
   \ "onedrive"
11 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ "swift"
12 / Yandex Disk
   \ "yandex"
Storage> 1 <-AmazonCloudDriveを使うので1
Amazon Application Client Id - leave blank normally.
client_id> <-空Enter
Amazon Application Client Secret - leave blank normally.
client_secret> <-空Enter
Remote config
Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine
y) Yes
n) No
y/n> n <-確認したのがブラウザが開けない環境だったので、nで進めた
For this to work, you will need rclone available on a machine that has a web browser available.
Execute the following on your machine:
        rclone authorize "amazon cloud drive"
Then paste the result below:
result> *** <-後述の方法で入手したトークンを貼り付け
--------------------
[ACD]
client_id =
client_secret =
token = ****
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y <-設定完了
Current remotes:

Name                 Type
====                 ====
ACD                  amazon cloud drive

e) Edit existing remote
n) New remote
d) Delete remote
s) Set configuration password
q) Quit config
e/n/d/s/q> q <-一旦終了

認証を別端末のWindows10で行う

rcloneのWindows版をダウンロードしてきて、コマンドプロンプトで以下を実施。
途中でブラウザからアマゾンの認証画面が開かれるので、ログインする。

C:\test>rclone authorize "amazon cloud drive"
2017/--/-- --:--:-- Config file "C:\\Users\\test/.rclone.conf" not found - using defaults
If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth
Log in and authorize rclone for access
Waiting for code...
Got code
Paste the following into your remote machine --->
**** <-ここに表示されるのがトークン
<---End paste

rcloneに暗号化するディレクトリを設定

AmazonCloudDrive上で暗号化するため必要な設定をする。

$ rclone config
Current remotes:

Name                 Type
====                 ====
ACD                  amazon cloud drive

e) Edit existing remote
n) New remote
d) Delete remote
s) Set configuration password
q) Quit config
e/n/d/s/q> n <-設定を作成
name> ACD_crypt <-設定に名前をつける
Type of storage to configure.
Choose a number from below, or type in your own value
 1 / Amazon Drive
   \ "amazon cloud drive"
 2 / Amazon S3 (also Dreamhost, Ceph, Minio)
   \ "s3"
 3 / Backblaze B2
   \ "b2"
 4 / Dropbox
   \ "dropbox"
 5 / Encrypt/Decrypt a remote
   \ "crypt"
 6 / Google Cloud Storage (this is not Google Drive)
   \ "google cloud storage"
 7 / Google Drive
   \ "drive"
 8 / Hubic
   \ "hubic"
 9 / Local Disk
   \ "local"
10 / Microsoft OneDrive
   \ "onedrive"
11 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ "swift"
12 / Yandex Disk
   \ "yandex"
Storage> 5 <-暗号化設定なので5
Remote to encrypt/decrypt.
Normally should contain a ':' and a path, eg "myremote:path/to/dir",
"myremote:bucket" or maybe "myremote:" (not recommended).
remote> ACD:/DataBackup/ <- 設定ディレクトリ(書き方は後述)
How to encrypt the filenames.
Choose a number from below, or type in your own value
 1 / Don't encrypt the file names.  Adds a ".bin" extension only.
   \ "off"
 2 / Encrypt the filenames see the docs for the details.
   \ "standard"
filename_encryption> 2 <-ファイル名の暗号化をする場合は2
Password or pass phrase for encryption.
y) Yes type in my own password
g) Generate random password
y/g> g <-暗号化パスワードを自動生成
Password strength in bits.
64 is just about memorable
128 is secure
1024 is the maximum
Bits> 128
Your password is: dw37uhP1Dl56Fhr8DYuZjg
Use this password?
y) Yes
n) No
y/n> y <-暗号化パスワードを承認
Password or pass phrase for salt. Optional but recommended.
Should be different to the previous password.
y) Yes type in my own password
g) Generate random password
n) No leave this optional password blank
y/g/n> g <-暗号化のソルトを自動生成
Password strength in bits.
64 is just about memorable
128 is secure
1024 is the maximum
Bits> 128
Your password is: 8UubLhAxmfQc1Cvs3UbuQw
Use this password?
y) Yes
n) No
y/n> y <-暗号化のソルトを承認
Remote config
--------------------
[ACD_crypt]
remote = ACD:/DataBackup/
filename_encryption = standard
password = *** ENCRYPTED ***
password2 = *** ENCRYPTED ***
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y <-設定に問題なければy
Current remotes:

Name                 Type
====                 ====
ACD                  amazon cloud drive
ACD_crypt            crypt

e) Edit existing remote
n) New remote
d) Delete remote
s) Set configuration password
q) Quit config
e/n/d/s/q> q <-設定ウィザードを終了

設定ディレクトリの書き方

(クラウドストレージの設定名):(ディレクトリ)
なので、上述の設定ではAmazonCloudDrive上のDataBackupディレクトリ内に暗号化したファイルを置く設定となる。

ルートに暗号化したデータを置く場合は以下の例のようにディレクトリを空にするらしい?(未検証)
– ACD:

ファイルを暗号化/復号化して同期

ローカルからAmazonCloudDriveに暗号化して同期

ローカルの/dataディレクトリからAmazonCloudDriveの/DataBackupディレクトリに同期する場合。

rclone sync /data ACD_crypt:/DataBackup/

こんな感じに暗号化されたファイル/ディレクトリができる。

AmazonCloudDriveからローカルに復号化して同期

AmazonCloudDriveの/DataBackupディレクトリからローカルの/dataディレクトリに同期する場合。

rclone sync ACD_crypt:/DataBackup/ /data

その他

  • Linuxのrcloneでアップロードしたファイルを、Windowsのrcloneで暗号化パスワードとソルトを同一にしてダウンロードすることもできた。
  • 以前にEncFSを使用して暗号化する方法も検討していたのですが、暗号化したファイルを一時的にでもローカルに置く必要がある点がネックになってました。rcloneだけでできればシンプルで便利。
  • ACDだとファイルとフォルダの名前は半角で255文字以内である必要があるのですが、ファイル名/フォルダ名の暗号化により文字数が増えて制限を超える可能性もあります。制限を超えると、rclone実行時に「failed to satisfy constraint: Member must have length less than or equal to 280」というエラーが出るかもしれません。