runtime.jsを試してみたのでメモ書きです。
runtme.jsはunikernelの一つでカーネルにv8のエンジンが組み込まれてて、JavaScriptの実行がサポートされています。runtime.jsのサンプルで、eshttpを使ったwebアプリのサンプルが有ったのでこれを使って動かしてみます。 今回使ったjsのコードやDockerfileなどは↓にあります。
実行するコードは以下の内容で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パターンを試しました。
まずは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環境で動くカーネルも違うので一概にはどっちが良いとか言えない面もありすね。
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オプションを付けるとqemuのGUIは表示しません。
--kernelでqemuに渡すカーネルを渡せるようだけど、initrdも作る必要ありそう。
( ´ー`)フゥー...
- 作者: 山田明憲
- 出版社/メーカー: 技術評論社
- 発売日: 2018/08/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る