More Related Content Similar to 『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題 (20) More from Masahiro Nagano (20) 『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題1. 『How to build a High Performance
PSGI/Plack Server』のその後と
ISUCON3を受けての話題
Shibuya Plack/PSGI Conference (shibuya.pl) #1 #plackcon
Masahiro Nagano @kazeburo
13年11月20日水曜日
6. 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
7. 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日水曜日
12. 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
13. 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
16. 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
18. :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日水曜日
19. :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
23. 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
24. 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
31. 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日水曜日