マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

47
https://www.monotaro.com/

Transcript of マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

Page 1: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/

Page 2: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 2

Page 3: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 3

Page 4: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 4

Page 5: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 5

Page 6: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 6

Page 7: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/

7

Page 8: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/

8

Page 9: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 9

MonotaRO http://www.slideshare.net/monotaro-itd-pr/monotaro-20150320-devlove

Page 10: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 10

Page 11: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 11

Page 12: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 12

Page 13: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 13

Page 14: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 14

12 API

Page 15: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 15

Page 16: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 16

APIAPIAPI API

AP Server

Page 17: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 17

APIAPIAPI API

AP Server

Page 18: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 18

Page 19: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 19

Page 20: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 20

Page 21: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 21

Page 22: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 22

Ordered by: cumulative time

ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 3.330 3.330 run_web.py:134(application) 1 0.000 0.000 3.330 3.330 (フレームワーク初期化) 1 0.000 0.000 3.249 3.249 (フレームワーク初期化) 1 0.000 0.000 3.180 3.180 (フレームワーク初期化) 1 0.000 0.000 3.180 3.180 (画面実装部分) 19 0.000 0.000 2.991 0.157 (画面実装部分) 19 0.000 0.000 2.920 0.154 (画面実装部分) 10 0.000 0.000 2.865 0.286 (画面実装部分) 7591 2.784 0.000 2.784 0.000 {method 'recv' of '_socket.socket' objects} 19 0.000 0.000 2.275 0.120 lib\urllib2.py:122(urlopen) 19 0.000 0.000 2.275 0.120 lib\urllib2.py:373(open) 19 0.000 0.000 2.274 0.120 lib\urllib2.py:401(_open) (略)

Page 23: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 23

Page 24: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 24

Boost application performance using asynchronous I/O http://www.ibm.com/developerworks/library/l-async/

Page 25: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 25

Boost application performance using asynchronous I/O http://www.ibm.com/developerworks/library/l-async/

Page 26: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 26

Page 27: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 27

Page 28: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 28

# 標準ライブラリにモンキーパッチ # 必ず標準ライブラリの前に書くこと! from gevent import monkeymonkey.patch_all()

# urllib2が非同期IO版に置換される import urllib2 import gevent

Page 29: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 29

def get_json(self, url, params): response = urllib2.urlopen(url).read() return json.loads(response)

# 変更前 (urlopenで待たされる) result = self.get_json(any_url, any_params)

Page 30: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 30

def get_json(self, url, params): response = urllib2.urlopen(url).read() return json.loads(response)

# get_jsonはすぐには実行しない future = gevent.spawn(self.get_json, any_url, any_params) (他の処理を実行できる)

# future.get()実行結果が来るまでブロック result = future.get()

Page 31: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 31

future1 = gevent.spawn(self.get_json, url1, param1) future2 = gevent.spawn(self.get_json, url2, param2) future3 = gevent.spawn(self.get_json, url3, param3) future4 = gevent.spawn(self.get_json, url4, param4) future5 = gevent.spawn(self.get_json, url5, param5) …

Page 32: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 32

from gevent.lock import Semaphore

# セマフォを用いて同時処理数を50に制限 semaphore = Semaphore(50)

def get_json(self, url, params): # このコンテキスト内には同時に最大50しか入れない with semaphore: response = urllib2.urlopen(url).read() return json.loads(response)

Page 33: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 33

from gevent.pywsgi import WSGIServer

http_server = WSGIServer(('', 5000), app)http_server.serve_forever()

Page 34: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 34

gevent.spawn

Page 35: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 35

APIAPIAPI API

AP Server

Page 36: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/

API

[ms]

Page 37: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 37

APIAPIAPI API

AP Server

Page 38: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 38

Page 39: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/

APIAPIAPI API

AP Server

39

Page 40: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/

40

APIAPIAPI API

AP Server

Page 41: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 41

Page 42: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 42

Page 43: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 43

Page 44: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 44

Page 45: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 45

Page 46: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 46

Page 47: マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

https://www.monotaro.com/ 47