lxcコンテナのI/Oが異様に遅いという話
NASの運用をようやく開始
LXCコンテナのI/Oが遅い気がします。Dockerの話じゃないですLXCです。
1年ちょい前に10GbEのNASを自作したという話をしました。作ったのはいいんですが、OSインストールを終わらせた後ちょっといじってその後完全放置してたんですよね。だってHDDをそれなりの数揃える勇気がなかったのよ。惰性でQNAP使ってました。なんともったいない。
流石にそろそろ真面目に運用するか?と思って+20万円ぐらい追加課金してHDDや追加部品を揃えました。もう「なるべくお安く」なんてのはどこ吹く風で徹底的に課金しています。
OSも入れ直し。ProxmoxっていうDebianベースのOSにしました。なおこのProxmox。コンテナ(LXC)やVMをWebのGUIで管理できるっていうスグレモノです。VMware ESXiみたいなものですね(VMMはKVMなのでType-Iではないですよ。勘違いしてる人いますが違いますよ)
課金しなくても十分使えます。インストールも簡単出しおすすめです。結構使ってる人いますね。
お家で始める仮想化環境 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から早速アクセスしてベンチマークをとってみました。
シーケンシャルはいい、が、ランダムアクセスが遅くないですか????いや、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なので。。。おそすぎです。。。
うーん。この性能差はどこから来るのでしょう???何がボトルネックなのでしょう???謎いです。