自宅のファイルサーバ(NFSサーバ)を頑張って高速化する
自宅でCentOSにNFSを入れて、ファイルサーバとして使っているんですがいかんせん遅いです。
ということで何とか速くならないか、ボトルネックを探す旅に出ました。
まずは現状のネットワーク速度を計測
家のルータの速度は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
おーいいかんじ。アップロードが特に速くなりました。 計測&値変更を繰り返して、ベターな値をちゃんと探せばもっと速くなりそうです。ただ、ファイルサーバ使ってる体感速度も変わって、満足できる速さになったので今回はこれで終了です。