unikernelのruntimejsを試してみる

runtime.jsを試してみたのでメモ書きです。

f:id:masami256:20180909150234p:plain

runtme.jsはunikernelの一つでカーネルにv8のエンジンが組み込まれてて、JavaScriptの実行がサポートされています。runtime.jsのサンプルで、eshttpを使ったwebアプリのサンプルが有ったのでこれを使って動かしてみます。 今回使ったjsのコードやDockerfileなどは↓にあります。

github.com

実行するコードは以下の内容でnodeコマンドでそのまま動かすことができるようになってます。

const eshttp = require('eshttp');
const server = new eshttp.HttpServer();
const response = new eshttp.HttpResponse(200, { 'server': 'runtimejs' }, 'Hello World!');

server.onrequest = request => {
  request.respondWith(response);
};

server.listen(9000);
console.log('listening to port 9000');

今回の計測はやり方として良くはないんだけど、手頃な環境がなかったのですべて1つのマシン上で行ってます。ベンチマークの実行にはabコマンドを使ってます。 hostマシンはFedora28です。

実行方法は以下の3パターンを試しました。

  1. ホストローカルで実行
  2. runteime.jsで実行
  3. Fedora 28の仮想マシン上のdockerで実行

まずはdockerもruntime.jsも使わずにローカルでindex.jsを実行した場合。

Test 1: Requests per second:    3031.68 [#/sec] (mean)
Test 2: Requests per second:    4135.48 [#/sec] (mean)
Test 3: Requests per second:    4542.56 [#/sec] (mean)
Test 4: Requests per second:    3834.94 [#/sec] (mean)
Test 5: Requests per second:    4983.80 [#/sec] (mean)
Test 6: Requests per second:    4654.19 [#/sec] (mean)
Test 7: Requests per second:    4711.87 [#/sec] (mean)
Test 8: Requests per second:    5130.57 [#/sec] (mean)
Test 9: Requests per second:    5187.80 [#/sec] (mean)
Test 10: Requests per second:    5351.89 [#/sec] (mean)

runtime.jsで実行した場合。

Test 1: Requests per second:    2577.45 [#/sec] (mean)
Test 2: Requests per second:    2562.92 [#/sec] (mean)
Test 3: Requests per second:    2494.01 [#/sec] (mean)
Test 4: Requests per second:    2558.20 [#/sec] (mean)
Test 5: Requests per second:    2802.85 [#/sec] (mean)
Test 6: Requests per second:    2705.70 [#/sec] (mean)
Test 7: Requests per second:    2850.22 [#/sec] (mean)
Test 8: Requests per second:    2901.33 [#/sec] (mean)
Test 9: Requests per second:    2505.95 [#/sec] (mean)
Test 10: Requests per second:    2331.00 [#/sec] (mean)

fedora 28の仮想環境の上でdockerで実行した場合。

Test 1: Requests per second:    2086.77 [#/sec] (mean)
Test 2: Requests per second:    3054.37 [#/sec] (mean)
Test 3: Requests per second:    3071.91 [#/sec] (mean)
Test 4: Requests per second:    2478.68 [#/sec] (mean)
Test 5: Requests per second:    2888.59 [#/sec] (mean)
Test 6: Requests per second:    2938.15 [#/sec] (mean)
Test 7: Requests per second:    3135.09 [#/sec] (mean)
Test 8: Requests per second:    3611.41 [#/sec] (mean)
Test 9: Requests per second:    3088.80 [#/sec] (mean)
Test 10: Requests per second:    3299.46 [#/sec] (mean)

この結果だとdockerのほうが良い感じの結果になってます。qemuの実行方法やvm環境で動くカーネルも違うので一概にはどっちが良いとか言えない面もありすね。

runtime.jsのqemuコマンドライン

masami   19666 28.3  0.2 1110156 139224 pts/1  Sl+  14:20   0:01 qemu-system-x86_64 -m 512 -smp 1 -s -kernel /home/masami/.runtime/runtime.2064 -initrd .initrd -net nic,model=virtio,macaddr=1a:46:0b:ca:bc:7c -net user,net=192.168.76.0/24,dhcpstart=192.168.76.9,hostfwd=udp::9000-:9000,hostfwd=tcp::9000-:9000 -nographic -monitor none -enable-kvm -no-kvm-irqchip -serial stdio

virt-managerのほうのqemuコマンドライン

qemu     11627  0.9  1.4 10844960 974920 ?     Sl   12:43   0:52 /usr/bin/qemu-system-x86_64 -machine accel=kvm -name guest=fedora-labo,debug-threads=on -S -object secret,id=masterKey0,format=raw,file=/var/lib/libvirt/qemu/domain-1-fedora-labo/master-key.aes -machine pc-i440fx-2.7,accel=kvm,usb=off,vmport=off,dump-guest-core=off -cpu Haswell-noTSX-IBRS,vme=on,ss=on,vmx=on,f16c=on,rdrand=on,hypervisor=on,arat=on,tsc_adjust=on,ssbd=on,xsaveopt=on,pdpe1gb=on,abm=on -m 8192 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid 239af4a6-ef28-4fa8-aacb-13b2588b0c21 -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-1-fedora-labo/monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=delay -no-hpet -no-shutdown -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x6.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x6 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x6.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x6.0x2 -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x5 -drive file=/var/lib/libvirt/images/fedora-labo.qcow2,format=qcow2,if=none,id=drive-virtio-disk0 -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x7,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive if=none,id=drive-ide0-0-0,readonly=on -device ide-cd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 -netdev tap,fd=25,id=hostnet0,vhost=on,vhostfd=27 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:95:01:e7,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -chardev socket,id=charchannel0,path=/var/lib/libvirt/qemu/channel/target/domain-1-fedora-labo/org.qemu.guest_agent.0,server,nowait -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=org.qemu.guest_agent.0 -chardev spicevmc,id=charchannel1,name=vdagent -device virtserialport,bus=virtio-serial0.0,nr=2,chardev=charchannel1,id=channel1,name=com.redhat.spice.0 -device usb-tablet,id=input0,bus=usb.0,port=1 -spice port=5900,addr=127.0.0.1,disable-ticketing,image-compression=off,seamless-migration=on -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,vram64_size_mb=0,vgamem_mb=16,max_outputs=1,bus=pci.0,addr=0x2 -device intel-hda,id=sound0,bus=pci.0,addr=0x4 -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 -chardev spicevmc,id=charredir0,name=usbredir -device usb-redir,chardev=charredir0,id=redir0,bus=usb.0,port=2 -chardev spicevmc,id=charredir1,name=usbredir -device usb-redir,chardev=charredir1,id=redir1,bus=usb.0,port=3 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8 -msg timestamp=on

runtime.jsのほうはqemuのオプションを調整することで結果がよくなるかも?

以下はめも runtime.jsは--kvmオプションを使わないとkvmが有効になりません。--nographicオプションを付けるとqemuGUIは表示しません。

--kernelでqemuに渡すカーネルを渡せるようだけど、initrdも作る必要ありそう。

( ´ー`)フゥー...

Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門