takaha.siの技術メモ

勉強したことをお伝えします。ちょっとでも誰かの役に立てればいいな…

lxcコンテナのI/Oが異様に遅いという話

NASの運用をようやく開始

LXCコンテナのI/Oが遅い気がします。Dockerの話じゃないですLXCです。

1年ちょい前に10GbENASを自作したという話をしました。作ったのはいいんですが、OSインストールを終わらせた後ちょっといじってその後完全放置してたんですよね。だってHDDをそれなりの数揃える勇気がなかったのよ。惰性でQNAP使ってました。なんともったいない。

tkh86.hateblo.jp

流石にそろそろ真面目に運用するか?と思って+20万円ぐらい追加課金してHDDや追加部品を揃えました。もう「なるべくお安く」なんてのはどこ吹く風で徹底的に課金しています。

OSも入れ直し。ProxmoxっていうDebianベースのOSにしました。なおこのProxmox。コンテナ(LXC)やVMをWebのGUIで管理できるっていうスグレモノです。VMware ESXiみたいなものですね(VMMはKVMなのでType-Iではないですよ。勘違いしてる人いますが違いますよ)

www.proxmox.com

f:id:tkh86:20211017172711p:plain
こんな感じの素敵なGUIがついてきます

課金しなくても十分使えます。インストールも簡単出しおすすめです。結構使ってる人いますね。

お家で始める仮想化環境 Proxmox VE 環境構築編 | Nishiの独り言

Proxmox VE6.3のインストールと、やっておくと良い初期設定

本題:LXCコンテナのI/Oが遅いって話

そんで、せっかくなのでSambaデーモンはLXCコンテナ上に置き、ホストのZFS領域をそのコンテナ上にマウントしてそこをSambaで公開するというのを取りました。なんかセキュアな感じがするのでそうしました。ちなみに、私はlxcコンテナに今回はじめて触れました。コンテナといえばDockerが有名ですが、Dockerとの違いはフルのLinuxシステムが動くかどうか?というところだと思います。Dockerが一コンテナ一プロセスという哲学で開発されているのに対して、lxcコンテナはフルのLinuxシステム、つまり、systemdやinitとかも動かしてOKのようです。VMにより近いコンテナと言えると思います。

Windowsから早速アクセスしてベンチマークをとってみました。

f:id:tkh86:20211017173338p:plain
CrystalDiskMarkでのNASベンチマーク

シーケンシャルはいい、が、ランダムアクセスが遅くないですか????いや、HDD6台でRAIDZ2だとこんなもんじゃない?って思うでしょ?いやいや、このZFSね。SLOGとかL2ARCをSamsung 980 PROのNVMe SSDに置いてるんですよ。見てくださいこれ。あと、メモリだって64GB積んでますからね?

root@liella:~# zpool status
  pool: tank
 state: ONLINE
config:

        NAME                                          STATE     READ WRITE CKSUM
        tank                                          ONLINE       0     0     0
          raidz2-0                                    ONLINE       0     0     0
            ata-ST4000VN008-2DR166_ZDHAA43Z           ONLINE       0     0     0
            ata-WDC_WD40EFZX-68AWUN0_WD-WX32D515UU33  ONLINE       0     0     0
            ata-ST4000VN008-2DR166_ZDHAAMFM           ONLINE       0     0     0
            ata-WDC_WD40EFZX-68AWUN0_WD-WX32D514ZD4J  ONLINE       0     0     0
            ata-ST4000VN008-2DR166_ZDHAA46D           ONLINE       0     0     0
            ata-WDC_WD40EFZX-68AWUN0_WD-WX32D515UH9R  ONLINE       0     0     0
        logs 
          nvme0n1p2                                   ONLINE       0     0     0
        cache
          nvme0n1p1                                   ONLINE       0     0     0

errors: No known data errors

んで、Samsung 980 PROのランダムアクセスはもっと速いはずなんですよ。。。こんなもんじゃないのですよ。

ほんとにほんとに本題

さて、色々と調べて「これはLXCコンテナのI/Oが遅いのではないか?」という結論に至りました。ベンチマークをとってみます。ホストにあるZFSと、ホスト上で動いてるLXCコンテナ経由でZFS(ホストのZFS領域をコンテナ内へマウントしてます)でそれぞれbonnie++ベンチマークをとってみました。

# bonnie++ -u root -d ./ -n 50:1048576:1048576:1 -s 4096 -r 1024

結果です

Version  2.00       ------Sequential Output------ --Sequential Input- --Random-
                    -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Name:Size etc        /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
liella           4G 1898k  99  1.6g  53  1.6g  55 2892k  99  7.4g  99 +++++ +++
Latency              5300us      54us      43us    3030us      29us      95us
Version  2.00       ------Sequential Create------ --------Random Create--------
liella              -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files:max:min        /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
 50:1048576:1048576 51200  68 51200  99 51200  73 51200  69 51200  99 51200  43
Latency             16339us    2735us    7303us   11797us    3517us    1094ms

random craeteでも51200ファイル/sec(であってますよね?)作れてて、なによりレイテンシがcreateで11797us。readで3517usで、deleteが1094msぐらいです。

それでは、このZFS領域をLXCコンテナへマウントして、LXCコンテナ内部から測ってみましょう。なお、LXCコンテナにはCPU4コアとメモリは8GB割り当ててます。

Version  2.00       ------Sequential Output------ --Sequential Input- --Random-
                    -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Name:Size etc        /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
fortress         4G 1735k  99  1.6g  55  1.5g  57 2652k  99  7.0g  99 +++++ +++
Latency              4858us      92us      46us    3367us      24us     396us
Version  2.00       ------Sequential Create------ --------Random Create--------
fortress            -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files:max:min        /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
 50:1048576:1048576     0  54     0  71     0  43     0  45     0  31     0  25
Latency               347ms     331ms    2880ms     368ms     326ms    1658ms

うーん。顕著に性能ダウンしてます。特にSequential CreateとRandom Createのあたり。これゼロってことは一秒間に一個も作れてないってことですよね?

なにより、Latencyが文字通り桁違いに遅くなってます。100ms=100000usなので。。。おそすぎです。。。

うーん。この性能差はどこから来るのでしょう???何がボトルネックなのでしょう???謎いです。