Slide 1

Slide 1 text

1 Copyright © Acroquest Technology Co., Ltd. All rights reserved. Serverless Performance 実測比較 2019-08-01 Acroquest Technology株式会社 阪本 雄一郎 Serverless Meetup Osaka

Slide 2

Slide 2 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 2 阪本 雄一郎 @phonypianist アクロクエストテクノロジー株式会社 シニアアーキテクト兼大阪事業所所長 • IoT、サーバーレスアーキテクチャ - 社会インフラ向け制御システム - 公共交通向け設備管理システム • BCI • 「Java本格入門」執筆

Slide 3

Slide 3 text

Acroquestのミッション・ビジョン Copyright © Acroquest Technology Co., Ltd. All rights reserved. 3 テクノロジストチームとして ビジネスの革新的価値創出に挑戦する ビジョン Acroquestの創り出す技術で 地球を感動で進化させる ミッション

Slide 4

Slide 4 text

「働きがいのある会社(GPTW)」 ランキング(従業員25~99人部門) 1位 を 3回 受賞 1位 1位 1位

Slide 5

Slide 5 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 5 Serverlessなプログラムを開発するとき 何の言語を使用しますか?

Slide 6

Slide 6 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 6 Node.js Python Ruby Java C# Go PowerShell

Slide 7

Slide 7 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 7 Serverlessで注意すべきポイントの1つ 「コールドスタート問題」

Slide 8

Slide 8 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 8 リクエストが稀であれば、 WarmUpツール等を使う手はアリ

Slide 9

Slide 9 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 9 リクエストがそれなりに多い場合 どうなるか?

Slide 10

Slide 10 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 10 新たに対応が増えた言語、 新バージョンに対応した言語もあるため、 言語別に パフォーマンスをチェックしてみる

Slide 11

Slide 11 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 11 言語 バージョン Python 3.7 / 3.6 / 2.7 Node.js 10.15 / 8.10 Ruby 2.5 Java 8 Go 1.x C# / PowerShell 2.1 (.NET Core) 2018/11/19 Python3.7に対応 2019/05/15 Node.js 10に対応 2018/09/11 PowerShellに対応 2018/01/15 Go言語に対応 ※2019/08/01現在

Slide 12

Slide 12 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 12 計測に使用したサンプルプログラムは 以下の2つを連続して行う ① 500万件の要素の線形検索 ② スリープ100ms CPUを使う 処理の模倣 IO待ち 処理の模倣

Slide 13

Slide 13 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 13 計測対象言語 Node.js Python Java Go ※守備範囲の言語だけ勝手にチョイス・・・ ネイティブ スクリプト コンパイル

Slide 14

Slide 14 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 14 コード例(Node.js) exports.handler = (event, context, callback) => { const number = Number(event.pathParameters.number) let number_list = new Array(number); for (let i = 0; i < number; i++) { number_list[i] = i + 1; } let result = (number_list.find(e => e == number) == number); setTimeout(() => callback(null, { statusCode: 200, headers: { 'Content-Type': 'application/json’ }, body: JSON.stringify({result: result}) }), 100); }

Slide 15

Slide 15 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 15 計測方法 ① Lambdaのメモリは256MB、512MB ② Karate-Gatlingで10ユーザ/s、100 ユーザ/sのリクエストを送信

Slide 16

Slide 16 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 16 256MB 10ユーザ/s @Python リスト作成が 遅い

Slide 17

Slide 17 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 17 256MB 10ユーザ/s @Node.js スクリプトでも 高速

Slide 18

Slide 18 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 18 256MB 10ユーザ/s @Java Cold Start 4秒 スクリプト より高速

Slide 19

Slide 19 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 19 256MB 10ユーザ/s @Go Javaと ほぼ同じ Cold Startが 速い

Slide 20

Slide 20 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 20 512MB 100ユーザ/s @Python 速度が大きく 改善している

Slide 21

Slide 21 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 21 512MB 100ユーザ/s @Node.js 少し高速化 大きな遅延なし

Slide 22

Slide 22 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 22 512MB 100ユーザ/s @Java 少し高速化

Slide 23

Slide 23 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 23 512MB 100ユーザ/s @Go Javaと ほぼ同じ

Slide 24

Slide 24 text

0 2000 4000 6000 8000 Min 50th 75th 95th 99th Max レスポンスタイム(ms) Python Node.js Java Go Copyright © Acroquest Technology Co., Ltd. All rights reserved. 24 256MB 10ユーザ/s Pythonはメモリ 不足気味 JavaはCold Start の影響

Slide 25

Slide 25 text

0 2000 4000 6000 8000 Min 50th 75th 95th 99th Max レスポンスタイム(ms) Python Node.js Java Go Copyright © Acroquest Technology Co., Ltd. All rights reserved. 25 512MB 10ユーザ/s メモリ/CPUが増えて 全体的にタイム改善

Slide 26

Slide 26 text

0 2000 4000 6000 8000 10000 Min 50th 75th 95th 99th Max レスポンスタイム(ms) Python Node.js Java Go Copyright © Acroquest Technology Co., Ltd. All rights reserved. 26 256MB 100ユーザ/s Pythonはメモリ 不足気味 Cold Startの割合が 相対的に減る かなり遅い奴が出てくる

Slide 27

Slide 27 text

0 2000 4000 6000 8000 10000 Min 50th 75th 95th 99th Max レスポンスタイム(ms) Python Node.js Java Go Copyright © Acroquest Technology Co., Ltd. All rights reserved. 27 512MB 100ユーザ/s メモリ/CPUが増えて 全体的にタイム改善 かなり遅い奴も 多少は改善

Slide 28

Slide 28 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 28 まとめ ① GoはCold Startが速い ② Cold Startを除外するとJavaはGoと大して変 わらない ③ リクエストが多くなると、Cold Startに時間がか かる可能性がある ④ Pythonのlist生成はメモリを食う

Slide 29

Slide 29 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 29 今のところの所感 安定したレスポンスを求める場合→Go スクリプトで手軽に書きたい場合→Node.js やっぱり非同期にしたい・・・

Slide 30

Slide 30 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 30 追加資料 (ここからは発表していません)

Slide 31

Slide 31 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 31 質疑応答のところで 「numpyだと速くないですか?」 と問われたので、 1パターン追加してみました。

Slide 32

Slide 32 text

0 2000 4000 6000 8000 10000 Min 50th 75th 95th 99th Max レスポンスタイム(ms) Python Python(numpy) Node.js Java Go Copyright © Acroquest Technology Co., Ltd. All rights reserved. 32 512MB 100ユーザ/s リスト生成も検索も Java並に高速になった Cold Startも Node.jsとほぼ同じ

Slide 33

Slide 33 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 33 numpyはほぼnativeなので、 numpyが使える部分ではかなり高速 (今回の評価目的としては少し反則w)

Slide 34

Slide 34 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 34 ご清聴ありがとうございました Evolve the Earth with Emotion of Technology