自宅のファイルサーバ(NFSサーバ)を頑張って高速化する

自宅でCentOSNFSを入れて、ファイルサーバとして使っているんですがいかんせん遅いです。 

ということで何とか速くならないか、ボトルネックを探す旅に出ました。

まずは現状のネットワーク速度を計測

家のルータの速度は100Mbps。ルータも結構古いので頭打ちになってる可能性があります。ということで、通信量をみるためにCactiを入れて、ファイルサーバから7GBのファイルをダウンロード/アップロードしてテストした時の通信量を測定しました。

※青がダウンロードしたとき、緑がアップロードしたとき。

o ダウンロードにかかった時間: 9m10.431s
o アップロードにかかった時間: 10m23.990s

 
なんかMax 100Mbps以上でてる箇所があるけど、よくわからんし主題でもないのでとりあずスルー。。。(ルータの仕様上100Mbpsの筈なんだけどなー。。)

やっぱり通信が頭打ちになってるっぽい。試しに複数台のクライアントから同時に試してみましたが、これ以上速度が出ず。

 

ルータを[100Mbps-->1Gbps]にリプレイス

通信が頭打ちになっていそうなことがわかりました。幸いにもNFSサーバに使ってる筐体のNIC & LANケーブルは1Gbsだったので、古いルータは捨てて1Gbpsルータにリプレイスしました。で、再度7GBのファイルをダウンロード/アップロードテストしてみます。

※青がダウンロードしたとき、緑がアップロードしたとき。

o ダウンロードにかかった時間: 2m41.080s
o アップロードにかかった時間: 10m35.961s

おーダウンロードめっちゃ速くなった。とりあえずダウンロード速度はお金で殴って解決しました。ただ、アップロードは速くなってないし、これじゃつまらないので、別途チューニングを考えて行きます。 

チューニングを考える

NFS自体のパラメータは殆んどいじるところがない!設定が簡易に終わるのはありがたいけどチューニングがしたい。したくてたまらない。

という事で他にチューニングできるところを考えると

o CPU周り  ---> そんなに使ってない。ボトルネックにはなってなさそう。
o ディスク周り ---> たしかにボトルネックだけど、チューニングできることは少なそう。ファイルサーバ用途なのでSSDに変えるには大容量過ぎて金がやばい。
o メモリ ---> 全然使ってない。ボトルネックではなさそう。 

上記の理由からやっぱりいじるならネットワーク周りかなーということで、ネットワークをもっと速くする方法を考えていきます。ファイルサーバとして使用しているのはCentOS 。つまりLinuxなのでカーネル周りのチューニングが可能。ということで、カーネルのネットワーク周りのチューニングを考えました。

 

カーネルチューニング

ネットワーク周りのカーネルチューニングを考えていきます。結論から先に言うと下記の通り値を設定しました。
 基本的にネットワークのバッファー周り(通信するときに使用するメモリ量)の値をいじってます。

# cat /etc/sysctl.d/nfs_tuning.conf
net.core.wmem_max = 50331648
net.core.rmem_max = 50331648
net.ipv4.tcp_mem = "50331648 50331648 50331648"
net.ipv4.udp_mem= "50331648 50331648 50331648"
net.core.netdev_max_backlog = 5000
#

▼ちゅーにんぐ参考サイト(感謝)

https://wwwx.cs.unc.edu/~sparkst/howto/network_tuning.php

https://thinkit.co.jp/cert/tech/23/5/4.htm

http://www.anarg.jp/personal/t-tugawa/note/linux/sockbuf.html

https://access.redhat.com/ja/solutions/504383

https://www.ibm.com/developerworks/jp/linux/library/l-adfly/index.html

チューニングした値説明

o net.ipv4.tcp_mem = "50331648 50331648 50331648"
o net.ipv4.udp_mem= "50331648 50331648 50331648"

通信するときに使用するメモリー量などの設定です。設定値の単位はページです。
左から順に、「メモリー使用量の最小値、パケットの圧縮モードを使用してバッファーを圧縮する際の閾値、メモリー使用量最大値」となっています。
モリーは最大限に利用したい&圧縮はして欲しくないので(圧縮処理が挟まるから多少時間増えちゃうはず)、全て同じ値としてます。

o net.core.wmem_max = 50331648
o net.core.rmem_max = 50331648

wmemはパケットを送信するときのメモリ最大使用量。rmemは受信するときのメモリ最大使用量。
これを設定しないとnet.ipv4.tcp_memの設定値が制限されてしまうので、先ほどと同じ値に設定。

o net.core.netdev_max_backlog = 5000

カーネルがキューできるパケットの最大個数。
この設定でパケットをキューできる数を増やしてみます。

チューニング後のテスト

チューニング後、再度7GBのファイルをダウンロード/アップロードテストしました。

※青がダウンロードしたとき、緑がアップロードしたとき。

o ダウンロードにかかった時間: 2m20.235s
o アップロードにかかった時間: 6m34.094s

おーいいかんじ。アップロードが特に速くなりました。 計測&値変更を繰り返して、ベターな値をちゃんと探せばもっと速くなりそうです。ただ、ファイルサーバ使ってる体感速度も変わって、満足できる速さになったので今回はこれで終了です。

 

 

 

 

 

シェアする