SlideShare a Scribd company logo
How to build a High Performance PSGI/Plack Server
PSGI/Plack・Monocerosで学ぶ
ハイパフォーマンス
Webアプリケーションサーバの作り方
YAPC::Asia 2013 Tokyo
Masahiro Nagano / @kazeburo
Me
• 長野雅広 Masahiro Nagano
• @kazeburo
• PAUSE:KAZEBURO
• Operations Engineer, Site Reliability
• LINE Corp.
Development support
LINE Family, livedoor
livedoorBlog
One of the largest Blog Hosting Service in Japan
livedoorBlog uses
Perl (5.16and 5.8)
Carton
Plack/PSGI and mod_perl
$ curl -I http://blog.livedoor.jp/staff/| grep Server
Server: Plack::Handler::Starlet
Starlet handles
1 Billion(10億) reqs/day
To get over
this burst traffic,
We need to improve
Performance
across all layers
この負荷を乗り切るために様々なレイヤーで最適化をしています
Layers
Hardware / Network
OS
App Server
Routing
Cache Logic
SQL
Template Engine
RDBMS
Cached
Web Server
Hardware / Network
OS
Routing
Cache Logic
SQL
Template Engine
RDBMS
Cached
Web Server
Today’s Topic
Hardware / Network
OS
Routing
Cache Logic
SQL
Template Engine
RDBMS
Cached
Web Server
Today’s Topic
App Server
By the way..
“Open & Share”
is our driver
for excellence.
And LOVE CPAN/OSS
Open & Share は私たちの目指すところです。
CPAN/OSSを多く使い、また貢献もしています
Improving
Performance of livedoorBlog
directly linked
Performance of Plack/Starlet
on CPAN
livedoorBlogのパフォーマンス改善で行った事は
CPAN上のPlack/Starletにも当然影響してきます
0
3500
7000
10500
14000 13083
6241
“Hello World”Reqs/Sec
Plack 1.0016 1.0029
Starlet 0.16 0.20
2013/02 2013/09
mod_perl era plack era
Monoceros
Monoceros is
a yet another
Plack/PSGI Server
for Performance
the Goal
Reduce
TCP 3way hand shake
between
Proxy and PSGI Server
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
HTTP/1.0-1.1 have
KeepAlive
Reverse
Proxy
App
Server
GET / HTTP/1.0
Host: example.com
Connection: keep-alive
SYN
ACK
SYN+ACK
HTTP/1.0 200 OK
Content-Type: text/html
Connection: keep-alive
Content-Length: 941
GET /favicon.ico HTTP/1.1
Host: example.com
HTTP/1.1 200 OK
Content-Type: image/vnd.microsoft.icon
Transfer-Encoding: chunked
GET /site.css HTTP/1.1
Host: example.com
HTTP/1.1 200 OK
Content-Type: text/css
Content-Length: 1013
C10K problem
nginx
C10K
Ready
Reverse
Proxy
nginx
nginx
Starlet
Starman
App
Server
KeepAlive Req
KeepAlive Req
KeepAlive Req
Starman, Starlet’s
Preforking model requires
1 connection per 1 process
By default
Starman: 5 procs
Starlet: 10 procs
Monoceros adopts
Preforking model,
But C10K ready
Worker
Process
Worker
Process
Worker
Process
Worker
Process
Manager
Process
SOCK
Client
GET / HTTP/1.1
Host: example.com
200 OK
Content-Type: text/html
Worker
Process
Worker
Process
Worker
Process
Worker
Process
Manager
Process
SOCK
Client
GET / HTTP/1.1
Host: example.com
200 OK
Content-Type: text/html
Worker
Process
Worker
Process
Worker
Process
Worker
Process
Manager
Process
SOCK
Client
GET / HTTP/1.1
Host: example.com
200 OK
Content-Type: text/html
GET / HTTP/1.1
Host: example.com
Event Driven
Worker
Process
Worker
Process
Worker
Process
Worker
Process
Manager
Process
SOCK
Client
GET / HTTP/1.1
Host: example.com
200 OK
Content-Type: text/html
GET / HTTP/1.1
Host: example.com
200 OK
Content-Type: text/html
Event Driven
Monoceros Workers
that inherits“Starlet”
not C10K ready
Event Driven
Manager Process
C10K ready
built with AnyEvent
KeepAlive Benchmark
like a Browser
1) connect
2) do requests certain number
3) leave alone a socket
4) timeout and close
250 conn / 200 reqs
Starlet Monoceros
Total time (sec) 54.51 8.74
Failed reqs 971 0
Plack/PSGI
Basics
PSGI = specification
Plack = implementation
PSGI Interface
my $app = sub {
my $env = shift;
...
return [200,
[‘Content-Type’ => ‘text/html’],
[‘Hello World’]
];
};
PSGI environment hash
* CGI keys
REQUEST_METHOD,SCRIPT_NAME,
PATH_INFO,REQUEST_URI,
QUERY_STRING,SERVER_PROTOCOL,HTTP_*
* PSGI-specific keys
psgi.version, psgi.url_scheme,
psgi.input, psgi.errors,
psgi.multiprocess, psgi.streaming
psgi.nonblocking
$env->{...}
PSGI Response (1)
ArrayRef
[200, #status code
[
‘Content-Type’ => ‘text/html’,
‘Content-Length => 10
],
[
‘Hello’,
‘World’
]
];
PSGI Response (1’)
arrayref+IO::Handle
open my $fh, ‘<’, ‘/path/icon.jpg’;
[200,
[
‘Content-Type’ => ‘image/jpeg’,
‘Content-Length => 123456789
],
$fh
];
PSGI Response (2)
Delayed and Streaming
sub {
my $env = shift;
return sub {
my $responder = shift;
...
$responder->([ 200,
$headers, [$body] ]);
}
};
PSGI Response (2’)
Delayed and Streaming
return sub {
my $responder = shift;
my $writer = $responder->([200, $headers]);
wait_for_events(sub {
my $new_event = shift;
if ($new_event) {
$writer->write($new_event->as_json . "n");
} else {
$writer->close;
}
});
};
Role of“PSGI Server”
PSGI Server
“A PSGI Server is a Perl program
providing an environment for a PSGI
application to run in”
PSGI
Server
App
$env
$res
Apache
Nginx
Apache
Proxy
Browser
CGI
mod_perl
FCGI
HTTP
Perl direct
PSGI Server
is called
“Plack Handler”
Plack Handler
Adaptor interface Plack and PSGI Server.
Make PSGI Server to run
with“plackup”
e.g. Starman
Starman::Server
= PSGI Server
Plack::Handler::Starman
= Plack Handler
Make
PSGI/Plack
Server
a High Performance
Tiny Standalone
PSGI Web Server
my $null_io = do { open my $io, "<", ""; $io };
my $app = sub {
my $env = shift
return [200,['Content-Type'=>'text/html'],['Hello','World',"n"]];
};
my $listen = IO::Socket::INET->new(
Listen => 5,
LocalAddr => 'localhost',
LocalPort => 5000,
ReuseAddr => 1,
);
while ( my $conn = $listen->accept ) {
my $env = {
SERVER_PORT => '5000',
SERVER_NAME => 'localhost',
SCRIPT_NAME => '',
REMOTE_ADDR => $conn->peerhost,
'psgi.version' => [ 1, 1 ],
'psgi.errors' => *STDERR,
'psgi.url_scheme' => 'http',
'psgi.run_once' => Plack::Util::FALSE,
'psgi.multithread' => Plack::Util::FALSE,
'psgi.multiprocess' => Plack::Util::FALSE,
'psgi.streaming' => Plack::Util::FALSE,
'psgi.nonblocking' => Plack::Util::FALSE,
'psgi.input' => $null_io,
};
$conn->sysread( my $buf, 4096);
my $reqlen = Plack::HTTPParser::parse_http_request($buf, $env);
my $res = Plack::Util::run_app $app, $env;
my @lines = ("HTTP/1.1 $res->[0] @{[ status_message($res->[0]) ]}015012");
for (my $i = 0; $i < @{$res->[1]}; $i += 2) {
next if $res->[1][$i] eq 'Connection';
push @lines, "$res->[1][$i]: $res->[1][$i + 1]015012";
}
push @lines, "Connection: close0151201512";
$conn->syswrite(join "",@lines);
Plack::Util::foreach($res->[2], sub {
$conn->syswrite(shift);
});
$conn->close;
}
60 lines
Listen and Accept
my $listen = IO::Socket::INET->new(
Listen => 5,
LocalAddr => 'localhost',
LocalPort => 5000,
ReuseAddr => 1,
);
while ( my $conn = $listen->accept ) {
...
}
Read a request
use Plack::HTTPParser qw/parse_http_request/;
my $null_io = do { open my $io, "<", ""; $io };
while ( my $conn = $listen->accept ) {
my $env = {
SERVER_PORT => '5000',
SERVER_NAME => 'localhost',
SCRIPT_NAME => '',
REMOTE_ADDR => $conn->peerhost,
'psgi.version' => [ 1, 1 ],
'psgi.errors' => *STDERR,
'psgi.url_scheme' => 'http',
'psgi.multiprocess' => Plack::Util::FALSE,
'psgi.streaming' => Plack::Util::FALSE,
'psgi.nonblocking' => Plack::Util::FALSE,
'psgi.input' => $null_io,
};
$conn->sysread(my $buf, 4096);
my $reqlen = parse_http_request($buf, $env);
Run App
my $res = $app->($env);
or
my $res = Plack::Util::run_app $app, $env;
Write a response
use HTTP::Status qw/status_message/;
my $res = ..
my @lines = ("HTTP/1.1 $res->[0] 
@{[ status_message($res->[0]) ]}015012");
for (my $i = 0; $i < @{$res->[1]}; $i += 2) {
next if $res->[1][$i] eq 'Connection';
push @lines, "$res->[1][$i]: $res->[1][$i + 1]015012";
}
push @lines, "Connection: close0151201512";
$conn->syswrite(join "",@lines);
foreach my $buf ( @{$res->[2]} ) {
$conn->syswrite($buf);
});
$conn->close;
This PSGI Server
has some problem
* handle only one at once
* no timeout
* may not fast
Increase concurrency
Multi Process
IO Multiplexing
or
Both
Preforking model
Simple, Scaling
Manager
Manager
bind
listen
Worker
accept
Worker
accept
Worker
accept
Worker
accept
Manager
bind
listen
fork fork fork fork
Worker
accept
Worker
accept
Worker
accept
Worker
accept
Manager
bind
listen
fork fork fork fork
Client Client ClientClient
use Parallel::Prefork;
my $listen = IO::Socket::INET->new(
Listen => 5,
LocalAddr => 'localhost',
LocalPort => 5000,
ReuseAddr => 1,
);
my $pm = Parallel::Prefork->new({
max_workers => 5,
trap_signals => {
TERM => 'TERM',
HUP => 'TERM',
}
});
while ( $pm->signal_received ne 'TERM') {
$pm->start(sub{
while ( my $conn = $listen->accept ) {
my $env = {..}
NO Accept
Serialization
os/kernel
Worker
accept
Worker
accept
Worker
accept
Worker
accept
Manager
bind
listen
Zzz.. Zzz.. Zzz.. Zzz..
os/kernel
Worker
accept
Worker
accept
Worker
accept
Worker
accept
Client
Manager
bind
listen
Zzz.. Zzz.. Zzz.. Zzz..
os/kernel
Worker
accept
Worker
accept
Worker
accept
Worker
accept
Client
Manager
bind
listen
Zzz.. Zzz.. Zzz.. Zzz..
os/kernel
Worker
accept
Worker
accept
Worker
accept
Worker
accept
Client
Manager
bind
listen
Thundering Herd突然の負荷
WakeUp WakeUp WakeUp WakeUP
os/kernel
Worker
accept
Worker
accept
Worker
accept
Worker
accept
Client
Manager
bind
listen
Thundering Herd突然の負荷
WakeUp WakeUp WakeUp WakeUP
Thundering Herd
is an old story
Worker
accept
Worker
accept
Worker Worker
Manager
bind
listen accept accept
Client
Zzz.. Zzz.. Zzz..Zzz..
Worker
accept
Worker
accept
Worker Worker
Manager
bind
listen accept accept
Client
Zzz.. Zzz.. Zzz..Zzz..
Worker
accept
Worker
accept
Worker Worker
Manager
bind
listen accept accept
Client
modern os/kernel
Zzz.. Zzz.. Zzz..Zzz..
Worker
accept
Worker
accept
Worker Worker
Manager
bind
listen accept accept
Client
modern os/kernel
Zzz.. Zzz.. Zzz..Zzz..
Worker
accept
Worker
accept
Worker Worker
Manager
bind
listen accept accept
Client
modern os/kernel
Zzz.. Zzz..Zzz..
WakeUp
NO Accept Serialization
(except for multiple interface)
TCP_DEFER_ACCEPT
Wake up a process
when DATA arrived
not established
コネクションが完了したタイミングではなく、
データが到着した段階でプロセスを起こします
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
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
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
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
use Socket qw(IPPROTO_TCP);
my $listen = IO::Socket::INET->new(
Listen => 5,
LocalAddr => 'localhost',
LocalPort => 5000,
ReuseAddr => 1,
);
if ($^O eq 'linux') {
setsockopt($listen, IPPROTO_TCP, 9, 1);
}
timeout to
read header
alarm
my $READ_TIMEOUT = 5;
eval {
local $SIG{ALRM} = sub { die "Timed outn"; };
alarm( $READ_TIMEOUT );
$conn->sysread(my $buf, 4096);
};
alarm(0);
next if ( $@ && $@ =~ /Timed out/ );
my $reqlen = parse_http_request($buf, $env);
nonblocking + select
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);
alarm
vs.
nonblocking + select
Fewer syscalls is good
Hardwares
User Application
OS/Kernel
system calls
listen,fork, accept, read, write, select, alarm
Worker Worker Worker Worker Worker
alarm
rt_sigprocmask(SIG_BLOCK, [ALRM], [], 8) = 0
rt_sigaction(SIGALRM, {0x47e5b0, [], SA_RESTORER,
0x7ff7d6e0cba0}, {SIG_DFL, [], SA_RESTORER,
0x7ff7d6e0cba0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
alarm(5) = 0
read(7, "GET / HTTP/1.1rnUser-Agent: curl"...,
65536) = 155
rt_sigprocmask(SIG_BLOCK, [ALRM], [], 8) = 0
rt_sigaction(SIGALRM, {SIG_DFL, [], SA_RESTORER,
0x7ff7d6e0cba0}, {0x47e5b0, [], SA_RESTORER,
0x7ff7d6e0cba0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
alarm(0) = 5 9 syscalls
non-blocking + select
fcntl(5, F_GETFL) = 0x2 (flags O_RDWR)
fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK) = 0
select(8, [5], NULL, [5], {300, 0}) = 1
(in [5], left {299, 999897})
read(5, "GET / HTTP/1.1rnUser-Agent:
curl"..., 131072) = 155
4 syscalls
Parse a request with“C”
$ cpanm HTTP::Parser::XS
Plack::HTTPParser uses H::P::XS if installed
TCP_NODELAY
When data was written
TCP packets does not
immediately send
“TCP uses Nagle's algorithm to
collect small packets
for send all at once by default”
write(“foo”)
write(“bar”)
os/kernel
network
interface
Application
buffering
“foobar”
write(“foo”)
write(“bar”)
os/kernel
network
interface
Application
“foo”
TCP_NODELAY
“bar”
Take care of excessive
fragmentation of TCP
packets
Write in once
join content in Server
my @lines = ("HTTP/1.1 $res->[0]
@{[ status_message($res->[0]) ]}015012");
for (my $i = 0; $i < @{$res->[1]}; $i += 2) {
next if $res->[1][$i] eq 'Connection';
push @lines,
"$res->[1][$i]: $res->[1][$i + 1]015012";
}
push @lines, "Connection: close0151201512";
$conn->syswrite(join "",@lines, @{$res->[2]});
accept4, writev
Choose
PSGI/Plack
Server
CPAN has many
PSGI Server &
Plack::Hanlder:**
Standalone
(HTTP::Server::PSGI)
Default server for plackup
Single process Web Server
For development
Starman
Preforking Web Server
HTTP/1.1, HTTPS,
Multiple interfaces,
unix-domain socket,
hot deploy using Server::Starter
Starlet
Preforking Web Server
HTTP/1.1(0.20~)
hot deploy using Server::Starter
Simple and Fast
Monoceros
C10K Ready Preforking Web Server
HTTP/1.1
hot deploy using Server::Starter
Twiggy
based on AnyEvent
nonblocking, streaming
Single Process
Twiggy::Prefork
based on Twiggy and
Parallel::Prefork
nonblocking, streaming
Multi Process
hot deploy using Server::Starter
Feersum
Web server based on EV/libev
nonblocking, streaming
Single/Multi Process
How to choose
PSGI Server
Single
Process
Multi
Process
CPU Intensive -
Starlet
Starman
Monoceros
Requires
Event Driven
Twiggy
Feersum
Twiggy::Prefork
Feersum
TypeofWebApplication
Finding
Bottlenecks of
Performance
use Devel::NYTProf
How to build a High Performance PSGI/Plack Server
Flame Graph is awesome
Profile nytprof.out.{PID}
for preforking server
$ nytprofhtml -f nytprof.out.1210
$ open nytprof/index.html
use strace or dtruss
trace syscalls
$ strace -tt -s 200 -p {pid} 
2>&1 | tee /tmp/trace.txt
Process 30929 attached - interrupt to quit
16:13:46.826828 accept(4, {sa_family=AF_INET, sin_port=htons(43783), sin_addr=inet_addr("127.
16:13:48.916233 ioctl(5, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff2fb61730) = -1 EINVAL (Invalid
16:13:48.916392 lseek(5, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
16:13:48.916493 ioctl(5, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff2fb61730) = -1 EINVAL (Invalid
16:13:48.916573 lseek(5, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
16:13:48.916661 fcntl(5, F_SETFD, FD_CLOEXEC) = 0
16:13:48.916873 fcntl(5, F_GETFL) = 0x2 (flags O_RDWR)
16:13:48.916959 fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK) = 0
16:13:48.917095 setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
16:13:48.917362 read(5, "GET / HTTP/1.0rnHost: 127.0.0.1:5005rnUser-Agent: ApacheBench/2.
16:13:48.917613 brk(0x1e8e000) = 0x1e8e000
16:13:48.917746 gettimeofday({1379402028, 917802}, NULL) = 0
16:13:48.917953 write(5, "HTTP/1.1 200 OKrnDate: Tue, 17 Sep 2013 07:13:48 GMTrnServer: P
16:13:48.918187 close(5) = 0
16:13:48.918428 accept(4, {sa_family=AF_INET, sin_port=htons(43793), sin_addr=inet_addr("127.
16:13:48.923736 ioctl(5, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff2fb61730) = -1 EINVAL (Invalid
16:13:48.923843 lseek(5, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
16:13:48.923924 ioctl(5, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff2fb61730) = -1 EINVAL (Invalid
16:13:48.924461 lseek(5, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
16:13:48.924600 fcntl(5, F_SETFD, FD_CLOEXEC) = 0
16:13:48.924762 fcntl(5, F_GETFL) = 0x2 (flags O_RDWR)
16:13:48.924853 fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK) = 0
16:13:48.924939 setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
16:13:48.925162 read(5, "GET / HTTP/1.0rnHost: 127.0.0.1:5005rnUser-Agent: ApacheBench/2.
16:13:48.925445 gettimeofday({1379402028, 925494}, NULL) = 0
16:13:48.925629 write(5, "HTTP/1.1 200 OKrnDate: Tue, 17 Sep 2013 07:13:48 GMTrnServer: P
16:13:48.925854 close(5) = 0
16:13:48.926084 accept(4, {sa_family=AF_INET, sin_port=htons(43803), sin_addr=inet_addr("127.
16:13:48.930480 ioctl(5, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff2fb61730) = -1 EINVAL (Invalid
16:13:48.930626 lseek(5, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
16:13:48.930744 ioctl(5, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff2fb61730) = -1 EINVAL (Invalid
16:13:48.930838 lseek(5, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
16:13:48.930915 fcntl(5, F_SETFD, FD_CLOEXEC) = 0
16:13:48.931070 fcntl(5, F_GETFL) = 0x2 (flags O_RDWR)
in conclusion
PSGI Server get Faster.
PSGI/Plack Rocks
Stable, Fast
Found problems?
RT, GitHub Issue, PullReqs
IRC #perl @kazeburo
#fin. Thank you!

More Related Content

PDF
Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon
PDF
Gazelle - Plack Handler for performance freaks #yokohamapm
PDF
Big Master Data PHP BLT #1
PDF
AnyMQ, Hippie, and the real-time web
PDF
Bootstrapping multidc observability stack
PDF
Static Typing in Vault
PDF
Securing Prometheus exporters using HashiCorp Vault
PDF
Modern tooling to assist with developing applications on FreeBSD
Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon
Gazelle - Plack Handler for performance freaks #yokohamapm
Big Master Data PHP BLT #1
AnyMQ, Hippie, and the real-time web
Bootstrapping multidc observability stack
Static Typing in Vault
Securing Prometheus exporters using HashiCorp Vault
Modern tooling to assist with developing applications on FreeBSD

What's hot (20)

PDF
Top Node.js Metrics to Watch
PDF
"Swoole: double troubles in c", Alexandr Vronskiy
KEY
About Data::ObjectDriver
PDF
Integrating icinga2 and the HashiCorp suite
PDF
Web前端性能优化 2014
PDF
Introduction to Flask Micro Framework
PPTX
Creating Reusable Puppet Profiles
PPTX
Construindo APIs Usando Rails
PDF
Pycon - Python for ethical hackers
PDF
Speed up web APIs with Expressive and Swoole (PHP Day 2018)
KEY
Site Performance - From Pinto to Ferrari
PDF
HashiCorp's Vault - The Examples
PPTX
Elastic stack
PPT
Triple Blitz Strike
KEY
Operation Oriented Web Applications / Yokohama pm7
PPTX
Vault - Secret and Key Management
PDF
ApacheConNA 2015: What's new in Apache httpd 2.4
ODP
Remove php calls and scale your site like crazy !
PDF
Facebook的缓存系统
PDF
Puppet and the HashiStack
Top Node.js Metrics to Watch
"Swoole: double troubles in c", Alexandr Vronskiy
About Data::ObjectDriver
Integrating icinga2 and the HashiCorp suite
Web前端性能优化 2014
Introduction to Flask Micro Framework
Creating Reusable Puppet Profiles
Construindo APIs Usando Rails
Pycon - Python for ethical hackers
Speed up web APIs with Expressive and Swoole (PHP Day 2018)
Site Performance - From Pinto to Ferrari
HashiCorp's Vault - The Examples
Elastic stack
Triple Blitz Strike
Operation Oriented Web Applications / Yokohama pm7
Vault - Secret and Key Management
ApacheConNA 2015: What's new in Apache httpd 2.4
Remove php calls and scale your site like crazy !
Facebook的缓存系统
Puppet and the HashiStack
Ad

Similar to How to build a High Performance PSGI/Plack Server (20)

KEY
Kansai.pm 10周年記念 Plack/PSGI 入門
KEY
Plack at YAPC::NA 2010
KEY
PSGI/Plack OSDC.TW
PDF
Mojolicious. Веб в коробке!
KEY
Plack - LPW 2009
PDF
Do you want a SDK with that API? (Nordic APIS April 2014)
KEY
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
KEY
Intro to PSGI and Plack
KEY
Psgi Plack Sfpm
KEY
Psgi Plack Sfpm
PPTX
PSGI and Plack from first principles
PDF
Nko workshop - node js crud & deploy
KEY
Mojolicious - A new hope
KEY
Using and scaling Rack and Rack-based middleware
PDF
PerlDancer for Perlers (FOSDEM 2011)
KEY
KEY
Plack perl superglue for web frameworks and servers
PPT
Frontend Servers and NGINX: What, Where and How
ODP
Modern Web Development with Perl
PPTX
REST with Eve and Python
Kansai.pm 10周年記念 Plack/PSGI 入門
Plack at YAPC::NA 2010
PSGI/Plack OSDC.TW
Mojolicious. Веб в коробке!
Plack - LPW 2009
Do you want a SDK with that API? (Nordic APIS April 2014)
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Intro to PSGI and Plack
Psgi Plack Sfpm
Psgi Plack Sfpm
PSGI and Plack from first principles
Nko workshop - node js crud & deploy
Mojolicious - A new hope
Using and scaling Rack and Rack-based middleware
PerlDancer for Perlers (FOSDEM 2011)
Plack perl superglue for web frameworks and servers
Frontend Servers and NGINX: What, Where and How
Modern Web Development with Perl
REST with Eve and Python
Ad

More from Masahiro Nagano (20)

PDF
Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min
PDF
Rhebok, High Performance Rack Handler / Rubykaigi 2015
PDF
Stream processing in Mercari - Devsumi 2015 autumn LT
PDF
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
PDF
ISUCONの勝ち方 YAPC::Asia Tokyo 2015
PDF
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
PDF
メルカリでのNorikraの活用、 Mackerelを添えて
PDF
Gazelle & CPAN modules for performance. Shibuya.pm Tech Talk #17 LT
PDF
Mackerel & Norikra mackerel meetup #4 LT
PDF
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
PDF
Isucon makers casual talks
PDF
blogサービスの全文検索の話 - #groonga を囲む夕べ
PDF
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
PDF
Web Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LT
PDF
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
PDF
Webアプリケーションの パフォーマンス向上のコツ 実践編
PDF
Webアプリケーションの パフォーマンス向上のコツ 概要編
PDF
Webアプリケーションとメモリ
PDF
最近作ったN個のCPANモジュール Yokohama.pm #10
PDF
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min
Rhebok, High Performance Rack Handler / Rubykaigi 2015
Stream processing in Mercari - Devsumi 2015 autumn LT
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
ISUCONの勝ち方 YAPC::Asia Tokyo 2015
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
メルカリでのNorikraの活用、 Mackerelを添えて
Gazelle & CPAN modules for performance. Shibuya.pm Tech Talk #17 LT
Mackerel & Norikra mackerel meetup #4 LT
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
Isucon makers casual talks
blogサービスの全文検索の話 - #groonga を囲む夕べ
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Web Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LT
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
Webアプリケーションの パフォーマンス向上のコツ 実践編
Webアプリケーションの パフォーマンス向上のコツ 概要編
Webアプリケーションとメモリ
最近作ったN個のCPANモジュール Yokohama.pm #10
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題

Recently uploaded (20)

PPTX
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
A comparative study of natural language inference in Swahili using monolingua...
PDF
August Patch Tuesday
PPTX
1. Introduction to Computer Programming.pptx
PPTX
TLE Review Electricity (Electricity).pptx
PDF
Machine learning based COVID-19 study performance prediction
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
Accuracy of neural networks in brain wave diagnosis of schizophrenia
PDF
Encapsulation theory and applications.pdf
PPTX
Machine Learning_overview_presentation.pptx
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
SOPHOS-XG Firewall Administrator PPT.pptx
Spectral efficient network and resource selection model in 5G networks
A comparative study of natural language inference in Swahili using monolingua...
August Patch Tuesday
1. Introduction to Computer Programming.pptx
TLE Review Electricity (Electricity).pptx
Machine learning based COVID-19 study performance prediction
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
gpt5_lecture_notes_comprehensive_20250812015547.pdf
Programs and apps: productivity, graphics, security and other tools
Accuracy of neural networks in brain wave diagnosis of schizophrenia
Encapsulation theory and applications.pdf
Machine Learning_overview_presentation.pptx
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Mobile App Security Testing_ A Comprehensive Guide.pdf
Building Integrated photovoltaic BIPV_UPV.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
Diabetes mellitus diagnosis method based random forest with bat algorithm

How to build a High Performance PSGI/Plack Server