『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
Upcoming SlideShare
Loading in...5
×
 

『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題

on

  • 6,849 views

 

Statistics

Views

Total Views
6,849
Views on SlideShare
2,661
Embed Views
4,188

Actions

Likes
8
Downloads
4
Comments
0

15 Embeds 4,188

http://blog.nomadscafe.jp 2869
http://kazuph.hateblo.jp 1230
http://cloud.feedly.com 35
https://twitter.com 14
http://feedly.com 13
http://drying28.rssing.com 6
http://reader.aol.com 6
http://www.feedspot.com 4
http://www.newsblur.com 2
http://newsblur.com 2
http://digg.com 2
http://s.deeeki.com 2
https://www.commafeed.com 1
http://translate.googleusercontent.com 1
http://131.253.14.98 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題 『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題 Presentation Transcript

  • 『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題 Shibuya Plack/PSGI Conference (shibuya.pl) #1 #plackcon Masahiro Nagano @kazeburo 13年11月20日水曜日
  • Me • • • • • 13年11月20日水曜日 長野雅広 Masahiro Nagano @kazeburo PAUSE: KAZEBURO Operations Engineer, Site Reliability LINE Corp. Development support on LINE Familly, livedoor
  • ISUCON3 優勝しました! We used nginx, Proclet, Starlet, Imager, Kossy 13年11月20日水曜日
  • WEB+DB PRESS Vol.78 (2013年12月発売) Perl Hackers Hub 【第23回】Plack/PSGI 実践入門 13年11月20日水曜日
  • YAPC::Asia 2013 Tokyo http://www.slideshare.net/kazeburo/yapc2013psgi-plack 13年11月20日水曜日
  • Summary of Slide • Monoceros • Plack/PSGI Basics • How to build a high performance PSGI/Plack server • 13年11月20日水曜日 Introduction of PSGI servers on CPAN
  • Performance Techniques for PSGI/Plack server • Prefork • no accept serialization • TCP_DEFER_ACCEPT • non blocking IO / reduce system calls • XS HTTP Parser • TCP_NODELAY 13年11月20日水曜日
  • その後にやったこと 13年11月20日水曜日
  • Monoceros 編 13年11月20日水曜日
  • 1. accept4(2) 13年11月20日水曜日
  • 13年11月20日水曜日
  • Set FD_CLOEXEC and O_NONBLOCK in one system call select(16, [4 10], NULL, NULL, {1, 0}) = 1 (in [4], left {0, 999997}) accept(4, {sa_family=AF_INET, sin_port=htons(41296), sin_addr=inet_addr("127.0.0.1")}, [16]) = 6 ioctl(6, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffc03016c0) = -1 EINVAL (Invalid argument) lseek(6, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek) ioctl(6, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffc03016c0) = -1 EINVAL (Invalid argument) lseek(6, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek) fcntl(6, F_SETFD, FD_CLOEXEC) = 0 fcntl(6, F_SETFL, O_RDONLY|O_NONBLOCK) = 0 setsockopt(6, SOL_TCP, TCP_NODELAY, [1], 4) = 0 read(6, "GET / HTTP/1.0rnHost: localhost:"..., 131072) = 82 gettimeofday({1381121587, 895814}, NULL) = 0 write(6, "HTTP/1.1 200 OKrnDate: Mon, 07 O"..., 112) = 112 close(6) 13年11月20日水曜日 = 0
  • Set FD_CLOEXEC and O_NONBLOCK in one system call select(16, [4 10], NULL, NULL, {1, 0}) = 1 (in [4], left {0, 999997}) accept4(4, {sa_family=AF_INET, sin_port=htons(42605), sin_addr=inet_addr("127.0.0.1")}, [16], SOCK_CLOEXEC| SOCK_NONBLOCK) = 6 ioctl(6, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffc03016c0) = -1 EINVAL (Invalid argument) lseek(6, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek) ioctl(6, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffc03016c0) = -1 EINVAL (Invalid argument) lseek(6, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek) setsockopt(6, SOL_TCP, TCP_NODELAY, [1], 4) = 0 read(6, "GET / HTTP/1.0rnHost: localhost:"..., 131072) = 82 gettimeofday({1381121587, 895814}, NULL) = 0 write(6, "HTTP/1.1 200 OKrnDate: Mon, 07 O"..., 112) = 112 close(6) 13年11月20日水曜日 = 0
  • パフォーマンスの変化はなかった。。。 13年11月20日水曜日
  • 2. :unix PerlIO 13年11月20日水曜日
  • select(16, [4 10], NULL, NULL, {1, 0}) 何コレ? = 1 (in [4], left {0, 999997}) accept4(4, {sa_family=AF_INET, sin_port=htons(42605), sin_addr=inet_addr("127.0.0.1")}, [16], SOCK_CLOEXEC|SOCK_NONBLOCK) = 6 ioctl(6, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffc03016c0) = -1 EINVAL (Invalid argument) lseek(6, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek) ioctl(6, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffc03016c0) = -1 EINVAL (Invalid argument) lseek(6, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek) setsockopt(6, SOL_TCP, TCP_NODELAY, [1], 4) = 0 read(6, "GET / HTTP/1.0rnHost: localhost:"..., 131072) = 82 gettimeofday({1381121587, 895814}, NULL) = 0 write(6, "HTTP/1.1 200 OKrnDate: Mon, 07 O"..., 112) = 112 close(6) 13年11月20日水曜日 = 0
  • :perlio adds these 13年11月20日水曜日
  • :unix PerlIO sub do_accept { my $self = shift; use open 'IO' => ':unix'; my ($conn,$peer); $peer = accept4($conn,$self->{listen_sock}); return ($conn, $peer); } 13年11月20日水曜日
  • :unix PerlIO select(16, [4 10], NULL, NULL, {1, 0}) = 1 (in [4], left {0, 999997}) accept4(4, {sa_family=AF_INET, sin_port=htons(42605), sin_addr=inet_addr("127.0.0.1")}, [16], SOCK_CLOEXEC|SOCK_NONBLOCK) = 6 setsockopt(6, SOL_TCP, TCP_NODELAY, [1], 4) = 0 read(6, "GET / HTTP/1.0rnHost: localhost:"..., 131072) = 82 gettimeofday({1381121587, 895814}, NULL) = 0 write(6, "HTTP/1.1 200 OKrnDate: Mon, 07 O"..., 112) = 112 close(6) 13年11月20日水曜日 = 0
  • パフォーマンスほぼ変わらなかった。。。 13年11月20日水曜日
  • 3. sendfile(2) 13年11月20日水曜日
  • 13年11月20日水曜日
  • read(7, "GET /static/jquery-1.10.2.min.js"..., 131072) = 185 open("./jquery-1.10.2.min.js.gz", O_RDONLY) = 9 write(7, "HTTP/1.1 200 OKrnDate: Wed, 20 N"..., 213) = 213 read(9, "372131010344207361Q03jquery-1.10.2.min.js0254"..., 8192) = 8192 read(9, "3402632542327315d344v3216jY346"..., 8192) = 8192 read(9, "2335|G3i1204205?3742514[,}u235"..., 8192) = 8192 read(9, "361307N-ns254212370p)`*276276"..., 8192) = 8192 read(9, "25027323263k10", 8192) = 7 read(9, "", 8192) = 0 brk(0x2eed000) = 0x2eed000 write(7, "372131010344207361Q03jquery-1.10.2.min.js0254"..., 32775) = 32775 close(7) 13年11月20日水曜日 = 0
  • read(7, "GET /static/jquery-1.10.2.min.js"..., 131072) = 185 open("./jquery-1.10.2.min.js.gz", O_RDONLY) = 9 write(7, "HTTP/1.1 200 OKrnDate: Wed, 20 N"..., 213) = 213 lseek(9, 0, SEEK_CUR) = 0 sendfile(7, 9, [0], 32775) close(7) 13年11月20日水曜日 = 32775 = 0
  • sendfile(2) benchmark jquery-min.js(90KB) Req/Sec 1471 1500 1125 1121 750 375 0 no-sendfile 13年11月20日水曜日 sendfile
  • ISUCON3 編 13年11月20日水曜日
  • ISUCON3予選のPerlアプリケーションの初期スコアが Rubyのそれより悪かったのでごにょごにょやっていた Ruby/Perl 初期スコア 3000 2361 2250 1500 865 750 0 Ruby 13年11月20日水曜日 Perl
  • やったこと ✓ ✓uri_forのキャッシュ ✓Response->finalizeの最適化 Plack::Middleware::Session::Simple ✓ ✓Monocerosアップデート ✓改造Starlet Kossy 13年11月20日水曜日
  • 改造 Starlet の中身 https://github.com/kazeburo/isucon3qualifier-myhack/blob/master/lib/Starlet/Server.pm 13年11月20日水曜日
  • 改造 Starlet • • • • • 13年11月20日水曜日 no use IO::Socket’s methods AnyEvent::Util::fh_nonblocking accept4(2) sendfile(2) supports unix domain socket (starmanはサポートしている)
  • unix domain socket $ plackup -s Starlet --socket-path /tmp/app.sock --max-workers 4 --max-reqs-per-child 1000 --min-reqs-per-child 800 -E production -a app.psgi 13年11月20日水曜日
  • nginx.conf upstream apps { #server localhost:5000; server unix:/tmp/app.sock; } location / { proxy_set_header Host $host; proxy_pass http://apps; } 13年11月20日水曜日
  • benchmark Kossy “Hello World” req/sec 11534.51 12000 9000 7974.09 6000 3000 0 tcp 13年11月20日水曜日 unix
  • ISUCON本選では使ってない。。。 13年11月20日水曜日
  • ISUCON本選では使ってない。。。 TCPでListenしないからデバックしにくい 試す時間がなかった 使ったとしても効果は限定的だったと思われる 13年11月20日水曜日
  • Plack/PSGIと パフォーマンスと 私とまとめ 13年11月20日水曜日
  • 普通のアプリケーション 数十msec∼ 数百msec アプリケーション側のコスト >>>>> (超えられない壁) >>>>> Plack/PSGIレイヤーのコスト 数msec∼ 数百μsec 13年11月20日水曜日
  • 特殊なアプリケーション eg: Games, advertisement, Large Scale SNS 数msec∼ 数十msec アプリケーション側のコスト >>> Plack/PSGIレイヤーのコスト 数msec∼ 数百μsec 13年11月20日水曜日
  • Improve Plack/PSGI • PSGI/Plackの適用領域を広げる = Perlの適用領域を広げる • 大規模サービスでのコスト削減 (Perlで働けるところ増えて、給料も増えてuma-) 13年11月20日水曜日
  • Found Problems? Github issues, pull reqs IRC, @kazeburo 13年11月20日水曜日
  • #fin. thank you 13年11月20日水曜日