サーバー実装いろいろ
Upcoming SlideShare
Loading in...5
×
 

サーバー実装いろいろ

on

  • 1,521 views

 

Statistics

Views

Total Views
1,521
Views on SlideShare
1,520
Embed Views
1

Actions

Likes
0
Downloads
1
Comments
0

1 Embed 1

http://s.deeeki.com 1

Accessibility

Upload Details

Uploaded via as Microsoft PowerPoint

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

サーバー実装いろいろ サーバー実装いろいろ Presentation Transcript

  • サーバー実装いろいろ その1 反復サーバー (iterative server) 並行サーバー (concurrent server)  ・ Fork server  ・ PreFork server
  • クライアント サーバー リクエスト レスポンス
  • 粒度を細かくすると下記のように (HTTP サーバとブラウザを想定。つまり TCP) クライアント サーバー SYN SYN, ack ack データ(要求) データ(応答) , 要求の ack 応答の ack FIN ack FIN ack socket,bind,listen accept( ブロック ) accept から戻る read( ブロック ) connect write read( ブロック ) read から戻る サーバが要求を処理 write read( ブロック ) read から戻る close close
  •  
  • 反復サーバ (iterative server)
    • use strict;
    • use warnings;
    • use IO::Socket;
    • my $socket = IO::Socket::INET->new(
    • Listen => 20,
    • LocalPort => 12345
    • ) or die;
    • while ( my $con = $socket->accept ) {
    • my $line = <$con>;
    • print $con $line;
    • close $con;
    • }
    サーバー リクエスト 確立待ちコネクションキュー 確立済みコネクションキュー Listen キュー 3way hand shake 完了後 accept 問題点: リクエストの read でブロックするので複数接続あった場合、 最初の接続がリクエストをもたつくと後の接続が待たされる ことになる
  • Fork サーバ (concurrent server)
    • use strict;
    • use warnings;
    • use IO::Socket;
    • my $socket = IO::Socket::INET->new(
    • Listen => 20,
    • LocalPort => 12345
    • ) or die;
    • while ( my $con = $socket->accept ) {
    • my $pid = fork;
    • if ( $pid == 0 ) {
    • ## child
    • close $socket;
    • my $line = <$con>;
    • print $con $line;
    • exit(0);
    • }
    • else {
    • ## parent
    • close $con;
    • }
    • }
    サーバー リクエスト 問題点: accept の度に fork するコスト accept サーバー accept fork サーバー サーバー サーバー サーバー 親 子
  • 余談: pipe(READ, WRITE) 関数 IPC 通信の基礎。親プロセス子プロセスの間で 対話できるようになる。 fork しないとできないわけではなく、より身近な例としてまさしく パイプコマンドがある。「 ls | wc 」 fork READ WRITE 親 親 子 子 READ WRITE READ WRITE READ WRITE READ WRITE READ WRITE
  • PreFork サーバ (concurrent server)
    • use strict;
    • use warnings;
    • use IO::Socket;
    • use POSIX 'WNOHANG';
    • my $socket = IO::Socket::INET->new(
    • Listen => 20,
    • LocalPort => 12345
    • ) or die;
    • for ( 1 .. 5 ) {
    • my $pid = fork;
    • if ( $pid == 0 ) {
    • ## child
    • while ( my $con = $socket->accept ) {
    • close $socket;
    • my $line = <$con>;
    • print $con $line;
    • close $con;
    • }
    • exit(0);
    • }
    • }
    • ## parent;
    • $SIG{CHLD} = sub {
    • while ( waitpid( -1, WNOHANG ) > 0 ) {
    • }
    • };
    • while (1) {
    • ## 子プロセスの数を調整するなど色々
    • }
    確立待ちコネクションキュー 確立済みコネクションキュー Listen キュー 子 子 子 accept accept accept
  • Net::Server
    • lib
    • `-- Net
    • |-- Server
    • | |-- Daemonize.pm
    • | |-- Fork.pm
    • | |-- HTTP.pm
    • | |-- INET.pm
    • | |-- MultiType.pm
    • | |-- Multiplex.pm
    • | |-- PreFork.pm
    • | |-- PreForkSimple.pm
    • | |-- Proto
    • | | |-- SSL.pm
    • | | |-- SSLEAY.pm
    • | | |-- TCP.pm
    • | | |-- UDP.pm
    • | | `-- UNIX.pm
    • | |-- Proto.pm
    • | |-- SIG.pm
    • | `-- Single.pm
    • |-- Server.pm
    • `-- Server.pod
    sub run { ### pass package or object my $self = ref($_[0]) ? shift() : shift->new; $self->_initialize(@_ == 1 ? %{$_[0]} : @_); # configure all parameters $self->post_configure; # verification of passed parameters $self->post_configure_hook; # user customizable hook $self->pre_bind; # finalize ports to be bound $self->bind; # connect to port(s) # setup selection handle for multi port $self->post_bind_hook; # user customizable hook $self->post_bind; # allow for chrooting, # becoming a different user and group $self->pre_loop_hook; # user customizable hook $self->loop; # repeat accept/process cycle ### routines inside a standard $self->loop # $self->accept # wait for client connection # $self->run_client_connection # process client # $self->done # indicate if connection is done $self->server_close; # close the server and release the port # this will run pre_server_close_hook # close_children # post_child_cleanup_hook # shutdown_sockets # and either exit or run restart_close_hook }
  • 課題
    • Starman
    • Starlet
    • Catalyst::Engine::HTTP
    • HTTP::Server::PSGI
    • Hoppy(?)
    • socket オプション等をもっと掘り下げる
    • non-blocking についてkwsk
  • 参考書籍