Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
How to build a High Performance PSGI/Plack Server
1. How to build a High Performance PSGI/Plack Server
PSGI/Plack・Monocerosで学ぶ
ハイパフォーマンス
Webアプリケーションサーバの作り方
YAPC::Asia 2013 Tokyo
Masahiro Nagano / @kazeburo
2. Me
• 長野雅広 Masahiro Nagano
• @kazeburo
• PAUSE:KAZEBURO
• Operations Engineer, Site Reliability
• LINE Corp.
Development support
LINE Family, livedoor
22. Reverse
Proxy
App
Server
GET / HTTP/1.1
Host: example.com
SYN
ACK
SYN+ACK
HTTP/1.1 200 OK
Content-Type: text/html
FIN
ACK
GET /favicon.ico HTTP/1.1
Host: example.com
SYN
ACK
SYN+ACK
HTTP/1.1 404 NOT FOUND
Content-Type: text/html
FIN
ACK
85. Wake up a process
when DATA arrived
not established
コネクションが完了したタイミングではなく、
データが到着した段階でプロセスを起こします
86. client
A
client
B
GET / HTTP/1.0
Host: example.com
Connection: keep-alive
SYN
ACK
SYN+ACK
SYN
ACK
SYN+ACK
GET / HTTP/1.0
Host: example.com
Connection: keep-alive
default defer_accept
Accept
RunApp
block
to
read
87. RunApp
client
A
client
B
GET / HTTP/1.0
Host: example.com
Connection: keep-alive
SYN
ACK
SYN+ACK
SYN
ACK
SYN+ACK
GET / HTTP/1.0
Host: example.com
Connection: keep-alive
default defer_accept
Accept
RunApp
Accept
block
to
read
88. RunApp
client
A
client
B
GET / HTTP/1.0
Host: example.com
Connection: keep-alive
SYN
ACK
SYN+ACK
SYN
ACK
SYN+ACK
GET / HTTP/1.0
Host: example.com
Connection: keep-alive
default defer_accept
Accept
RunApp
Accept
block
to
read
idle
89. RunApp
client
A
client
B
GET / HTTP/1.0
Host: example.com
Connection: keep-alive
SYN
ACK
SYN+ACK
SYN
ACK
SYN+ACK
GET / HTTP/1.0
Host: example.com
Connection: keep-alive
default defer_accept
Accept
RunApp
Accept
RunApp
Accept
RunApp
Accept
block
to
read
idle
95. use IO::Select;
my $READ_TIMEOUT = 5;
while( my $conn = $listen->accept ) {
$conn->blocking(0);
my $select = IO::Select->new($conn);
my @ready = $select->can_read($READ_TIMEOUT);
next unless @ready;
$conn->sysread($buf, 4096);
my $reqlen = parse_http_request($buf, $env);