SlideShare a Scribd company logo
1 of 24
Download to read offline
Webサーバ・bossanを書いた話




    @shitsyndrome /
    kubo39@github
bossan
話すこと
●   bossan とはなにか
●   なんで作ったか
●   基本構成
●   I/O戦略
●   セキュリティ
●   パフォーマンス
What's bossan?

●   Ruby's rack web server
●   高速
●   HTTP1.1サポート
●   Linux のみサポート
なんで作ったか
●   Cの勉強
●   就職活動の一環
●   既存のrackサーバに不満
    - パフォーマンス
    - Eventmachineに依存しすぎ
●   ゴリゴリなにか書きたかった!
基本構成

●   シングルプロセス、シングルスレッド
●   イベントドリブン(I/O多重化)
●   機能は最小限に、パフォーマンス重視
I/O戦略
●   readは全部読み込むまでread callback仕掛ける
●   writeはwritevを使用
    - writevについては後述
    - writeはまとめて書き出す
一般的なI/O特性

●   read(2) / write(2)
    fdが読み込み/書き込み完了するまで
    他のfdをブロック


      => 「I/Oブロッキング」
ネットワーク x I/O
●   ブロックすると、一人のレスポンス/リクエストが
    終わるまで他は待たされる
      => 単位時間当たりの処理能力低下

●   一般的に1:NなサーバはマルチスレッドやIO多重
    化で実装
I/O多重化
●   I/O可能になったfdを通知する仕組み
    - 順番が入れ替わったりすることもある
●   実装はいろいろ
    select,poll,epoll(linux),kqueue(bsd),..

●   Bossanはepollのみサポート
picoev
●   イベントループを扱うためのライブラリ
●   前述したepollを使いやすい形で提供
    - 本来はkqueueやpollなどの下のレイヤーの差
     異を隠蔽して使うためのもの
    - 素のepoll扱うのはめんどい
Asynchronous I/O(おまけ)
●   非同期にI/Oを行う
    fdのread/write自体が非同期
●   通知時にはすでにread/writeは完了
    - readの場合はバッファにデータが入ってる
●   実装が複雑
    - APIがクソ
    - bossanでは使ってません
セキュリティ
●   Max content length の設定
    - クソでかいデータきたら困る
    - 本体が16M越えたら413返す
●   遅いリクエストはばっさりclose
    - slowloris対策
●   Long Header DoS対策
    - http-parserで対処
http-parser
●   パース処理は重い → Cでかかれたもの使用
●   node.jsの作者のもの使用
●   コールバックスタイル
    - バッファ切れる度に呼び出し
●   ヘッダを全部読み込む前にパース開始
    - Long header DoS対策
パフォーマンス
●   ほとんどCで実装
    - Rubyは遅い
    - いかにRubyのコード減らすか
●   単純にCで書いてもそこまででない
    - システムコール減らす : writev
●   ソケットオプション
    - TCP_NODELAY, TCP_CORK
●   タイムキャッシュ
Rubyのコード減らす
●   Rubyは遅い
    - オブジェクトの生成コストが高い
●   例:文字列
    RubyのStringは生成の度にmemcpy()走る
    - 可能な限りCの文字列使用
    - staticな値で使いまわす
システムコール減らす
●   システムコールは遅い
    - OSのコンテキストスイッチが発生
    - Linuxはマルチスレッドなので相互排他必要

●   writev: 複数のバッファからの書き込みを同時に
    - 自前でバッファ連結する手間省く
    - カーネル内でatomicに連結
TCP_NODELAY / TCP_CORK
●   TCPで小さいバッファで通信してると遅延が
    起こりやすい
●   ソケットオプションで遅延させないようにできる
    ー writevと併用することで効果を発揮
●   参考URL
    https://access.redhat.com/knowledge/docs/ja-
    JP/Red_Hat_Enterprise_MRG/2/html/Realtime_R
    eference_Guide/chap-
    Realtime_Reference_Guide-Sockets.html
タイムキャッシュ

●   Dateヘッダ用に
●   HTTPの世界は秒オーダーでいい
    - 時間を毎回引かない(gettimeofday発生)
    - 1秒間はキャッシュした値を使いまわす
●   nginxのtime cacheを参考
ベンチマーク
●   条件(なるべく同一に)
    Content-Type: text/plain
    本文: “hello, world!”
    ログ出力なし
    apache bench : ab -c 25 -n 100000
●   nginxのみデフォルト設定
ベンチマーク
●   比較用サーバ
    - thin : Ruby,シングルスレッド+イベントループ
    - goliath : Ruby, シングルスレッド+イベントルー
         プ+軽量スレッド(fiber)
    - nginx: C, prefork+イベントループ
    - node.js : js, シングルスレッド+イベントループ
ベンチマーク
Bossan(0.1.3)     18453.22 [#/sec]
Thin(1.5.0)       9460.58 [#/sec]
Goliath(1.0.1)    940.56 [#/sec]
Nginx(1.1.19)     20297.02 [#/sec]
Node.js(0.8.15)   10013.64 [#/sec]
コード


●   https://github.com/kubo39/bossan
なにかあれば

More Related Content

What's hot

OSvの概要と実装
OSvの概要と実装OSvの概要と実装
OSvの概要と実装Takuya ASADA
 
Hadoop HDFS: The Ultimate Storage
Hadoop HDFS: The Ultimate StorageHadoop HDFS: The Ultimate Storage
Hadoop HDFS: The Ultimate StorageSATOSHI TAGOMORI
 
LT#7 Hello coffeeしてきた
LT#7 Hello coffeeしてきたLT#7 Hello coffeeしてきた
LT#7 Hello coffeeしてきたShingo Inoue
 
Containerで変わるDevOps
Containerで変わるDevOpsContainerで変わるDevOps
Containerで変わるDevOpsshokiri
 
Redisととあるシステム
RedisととあるシステムRedisととあるシステム
RedisととあるシステムTakehiro Torigaki
 
Web Service on SSD
Web Service on SSDWeb Service on SSD
Web Service on SSDKazuho Oku
 
社内勉強会(Docker)
社内勉強会(Docker)社内勉強会(Docker)
社内勉強会(Docker)Shinya Sasaki
 
Webサーバの性能測定
Webサーバの性能測定Webサーバの性能測定
Webサーバの性能測定Ryo Maruyama
 
ヤギにサーバーを管理してもらう話
ヤギにサーバーを管理してもらう話ヤギにサーバーを管理してもらう話
ヤギにサーバーを管理してもらう話Masaki Kobayashi
 
Rubyでバルクインサート
RubyでバルクインサートRubyでバルクインサート
RubyでバルクインサートFujimura Munehiko
 
処理概要図&構築手順書1124
処理概要図&構築手順書1124処理概要図&構築手順書1124
処理概要図&構築手順書1124Kazuki Miura
 
エコなWebサーバー
エコなWebサーバーエコなWebサーバー
エコなWebサーバーemasaka
 

What's hot (19)

OSvの概要と実装
OSvの概要と実装OSvの概要と実装
OSvの概要と実装
 
Hadoop HDFS: The Ultimate Storage
Hadoop HDFS: The Ultimate StorageHadoop HDFS: The Ultimate Storage
Hadoop HDFS: The Ultimate Storage
 
Redis速習会@Wantedly
Redis速習会@WantedlyRedis速習会@Wantedly
Redis速習会@Wantedly
 
LT#7 Hello coffeeしてきた
LT#7 Hello coffeeしてきたLT#7 Hello coffeeしてきた
LT#7 Hello coffeeしてきた
 
Containerで変わるDevOps
Containerで変わるDevOpsContainerで変わるDevOps
Containerで変わるDevOps
 
NanoStrand
NanoStrandNanoStrand
NanoStrand
 
Redisととあるシステム
RedisととあるシステムRedisととあるシステム
Redisととあるシステム
 
Web Service on SSD
Web Service on SSDWeb Service on SSD
Web Service on SSD
 
社内勉強会(Docker)
社内勉強会(Docker)社内勉強会(Docker)
社内勉強会(Docker)
 
Webサーバの性能測定
Webサーバの性能測定Webサーバの性能測定
Webサーバの性能測定
 
membase
membasemembase
membase
 
Sendslacker
SendslackerSendslacker
Sendslacker
 
ヤギにサーバーを管理してもらう話
ヤギにサーバーを管理してもらう話ヤギにサーバーを管理してもらう話
ヤギにサーバーを管理してもらう話
 
Rubyでバルクインサート
RubyでバルクインサートRubyでバルクインサート
Rubyでバルクインサート
 
Psql & proctitle
Psql & proctitlePsql & proctitle
Psql & proctitle
 
処理概要図&構築手順書1124
処理概要図&構築手順書1124処理概要図&構築手順書1124
処理概要図&構築手順書1124
 
Clack meetup #1 lt
Clack meetup #1 ltClack meetup #1 lt
Clack meetup #1 lt
 
エコなWebサーバー
エコなWebサーバーエコなWebサーバー
エコなWebサーバー
 
Lxc on cloud
Lxc on cloudLxc on cloud
Lxc on cloud
 

Similar to Bossan dentoo

ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますinfinite_loop
 
OSC2011Tokyo/Fall OpenStack Swift入門
OSC2011Tokyo/Fall OpenStack Swift入門OSC2011Tokyo/Fall OpenStack Swift入門
OSC2011Tokyo/Fall OpenStack Swift入門irix_jp
 
CouchDB JP & BigCouch
CouchDB JP & BigCouchCouchDB JP & BigCouch
CouchDB JP & BigCouchYohei Sasaki
 
たのしいNode.js
たのしいNode.jsたのしいNode.js
たのしいNode.jsishiki-takai
 
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドToru Tamaki
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜Taro Matsuzawa
 
DXライブラリでMMO作ったよ!
DXライブラリでMMO作ったよ!DXライブラリでMMO作ったよ!
DXライブラリでMMO作ったよ!h2so5
 
近頃のDockerネットワーク
近頃のDockerネットワーク近頃のDockerネットワーク
近頃のDockerネットワークYuji Oshima
 
20apr2012 kernelvm7-main
20apr2012 kernelvm7-main20apr2012 kernelvm7-main
20apr2012 kernelvm7-mainShotaro Uchida
 
Kyoto Tycoon Guide in Japanese
Kyoto Tycoon Guide in JapaneseKyoto Tycoon Guide in Japanese
Kyoto Tycoon Guide in JapaneseMikio Hirabayashi
 
LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!KLab株式会社
 
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4Emma Haruka Iwao
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
WebサーバのチューニングYu Komiya
 
OSC Tokyo fall LT~Dockerで分散処理をやってみた
OSC Tokyo fall LT~Dockerで分散処理をやってみたOSC Tokyo fall LT~Dockerで分散処理をやってみた
OSC Tokyo fall LT~Dockerで分散処理をやってみたatk1234
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Masahiro Nagano
 
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web service
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web serviceYAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web service
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web serviceKazuho Oku
 

Similar to Bossan dentoo (20)

ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せます
 
OSC2011Tokyo/Fall OpenStack Swift入門
OSC2011Tokyo/Fall OpenStack Swift入門OSC2011Tokyo/Fall OpenStack Swift入門
OSC2011Tokyo/Fall OpenStack Swift入門
 
CouchDB JP & BigCouch
CouchDB JP & BigCouchCouchDB JP & BigCouch
CouchDB JP & BigCouch
 
たのしいNode.js
たのしいNode.jsたのしいNode.js
たのしいNode.js
 
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルド
 
WalBの紹介
WalBの紹介WalBの紹介
WalBの紹介
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜
 
DXライブラリでMMO作ったよ!
DXライブラリでMMO作ったよ!DXライブラリでMMO作ったよ!
DXライブラリでMMO作ったよ!
 
Bsd suki
Bsd sukiBsd suki
Bsd suki
 
近頃のDockerネットワーク
近頃のDockerネットワーク近頃のDockerネットワーク
近頃のDockerネットワーク
 
20apr2012 kernelvm7-main
20apr2012 kernelvm7-main20apr2012 kernelvm7-main
20apr2012 kernelvm7-main
 
Kyoto Tycoon Guide in Japanese
Kyoto Tycoon Guide in JapaneseKyoto Tycoon Guide in Japanese
Kyoto Tycoon Guide in Japanese
 
LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!
 
LXC入門 - Osc2011 nagoya
LXC入門 - Osc2011 nagoyaLXC入門 - Osc2011 nagoya
LXC入門 - Osc2011 nagoya
 
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
Webサーバのチューニング
 
OSC Tokyo fall LT~Dockerで分散処理をやってみた
OSC Tokyo fall LT~Dockerで分散処理をやってみたOSC Tokyo fall LT~Dockerで分散処理をやってみた
OSC Tokyo fall LT~Dockerで分散処理をやってみた
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 
らくちん Go言語
らくちん Go言語らくちん Go言語
らくちん Go言語
 
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web service
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web serviceYAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web service
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web service
 

Bossan dentoo

  • 1. Webサーバ・bossanを書いた話 @shitsyndrome / kubo39@github
  • 3. 話すこと ● bossan とはなにか ● なんで作ったか ● 基本構成 ● I/O戦略 ● セキュリティ ● パフォーマンス
  • 4. What's bossan? ● Ruby's rack web server ● 高速 ● HTTP1.1サポート ● Linux のみサポート
  • 5. なんで作ったか ● Cの勉強 ● 就職活動の一環 ● 既存のrackサーバに不満 - パフォーマンス - Eventmachineに依存しすぎ ● ゴリゴリなにか書きたかった!
  • 6. 基本構成 ● シングルプロセス、シングルスレッド ● イベントドリブン(I/O多重化) ● 機能は最小限に、パフォーマンス重視
  • 7. I/O戦略 ● readは全部読み込むまでread callback仕掛ける ● writeはwritevを使用 - writevについては後述 - writeはまとめて書き出す
  • 8. 一般的なI/O特性 ● read(2) / write(2) fdが読み込み/書き込み完了するまで 他のfdをブロック   => 「I/Oブロッキング」
  • 9. ネットワーク x I/O ● ブロックすると、一人のレスポンス/リクエストが 終わるまで他は待たされる   => 単位時間当たりの処理能力低下 ● 一般的に1:NなサーバはマルチスレッドやIO多重 化で実装
  • 10. I/O多重化 ● I/O可能になったfdを通知する仕組み - 順番が入れ替わったりすることもある ● 実装はいろいろ select,poll,epoll(linux),kqueue(bsd),.. ● Bossanはepollのみサポート
  • 11. picoev ● イベントループを扱うためのライブラリ ● 前述したepollを使いやすい形で提供 - 本来はkqueueやpollなどの下のレイヤーの差  異を隠蔽して使うためのもの - 素のepoll扱うのはめんどい
  • 12. Asynchronous I/O(おまけ) ● 非同期にI/Oを行う fdのread/write自体が非同期 ● 通知時にはすでにread/writeは完了 - readの場合はバッファにデータが入ってる ● 実装が複雑 - APIがクソ - bossanでは使ってません
  • 13. セキュリティ ● Max content length の設定 - クソでかいデータきたら困る - 本体が16M越えたら413返す ● 遅いリクエストはばっさりclose - slowloris対策 ● Long Header DoS対策 - http-parserで対処
  • 14. http-parser ● パース処理は重い → Cでかかれたもの使用 ● node.jsの作者のもの使用 ● コールバックスタイル - バッファ切れる度に呼び出し ● ヘッダを全部読み込む前にパース開始 - Long header DoS対策
  • 15. パフォーマンス ● ほとんどCで実装 - Rubyは遅い - いかにRubyのコード減らすか ● 単純にCで書いてもそこまででない - システムコール減らす : writev ● ソケットオプション - TCP_NODELAY, TCP_CORK ● タイムキャッシュ
  • 16. Rubyのコード減らす ● Rubyは遅い - オブジェクトの生成コストが高い ● 例:文字列 RubyのStringは生成の度にmemcpy()走る - 可能な限りCの文字列使用 - staticな値で使いまわす
  • 17. システムコール減らす ● システムコールは遅い - OSのコンテキストスイッチが発生 - Linuxはマルチスレッドなので相互排他必要 ● writev: 複数のバッファからの書き込みを同時に - 自前でバッファ連結する手間省く - カーネル内でatomicに連結
  • 18. TCP_NODELAY / TCP_CORK ● TCPで小さいバッファで通信してると遅延が 起こりやすい ● ソケットオプションで遅延させないようにできる ー writevと併用することで効果を発揮 ● 参考URL https://access.redhat.com/knowledge/docs/ja- JP/Red_Hat_Enterprise_MRG/2/html/Realtime_R eference_Guide/chap- Realtime_Reference_Guide-Sockets.html
  • 19. タイムキャッシュ ● Dateヘッダ用に ● HTTPの世界は秒オーダーでいい - 時間を毎回引かない(gettimeofday発生) - 1秒間はキャッシュした値を使いまわす ● nginxのtime cacheを参考
  • 20. ベンチマーク ● 条件(なるべく同一に) Content-Type: text/plain 本文: “hello, world!” ログ出力なし apache bench : ab -c 25 -n 100000 ● nginxのみデフォルト設定
  • 21. ベンチマーク ● 比較用サーバ - thin : Ruby,シングルスレッド+イベントループ - goliath : Ruby, シングルスレッド+イベントルー      プ+軽量スレッド(fiber) - nginx: C, prefork+イベントループ - node.js : js, シングルスレッド+イベントループ
  • 22. ベンチマーク Bossan(0.1.3) 18453.22 [#/sec] Thin(1.5.0) 9460.58 [#/sec] Goliath(1.0.1) 940.56 [#/sec] Nginx(1.1.19) 20297.02 [#/sec] Node.js(0.8.15) 10013.64 [#/sec]
  • 23. コード ● https://github.com/kubo39/bossan