C 10 K Problem n Y 2 K
C 10 K Problem って何? n Y 2 K Problem n n Year 2, 000 Problem → 西暦 2000年問題 C 10 K Problem http: //www. kegel. com/c 10 k. html n C 10, 000 Problem n n n C = Clients C = Connections C = Concurrent access → 1万クライアント同時接続問題 mod_perl ではどうなるの? 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 2
Web Benchmark Software n n n Apache. Bench (Apache付属のabコマンド) http: //httpd. apache. org/docs/programs/ab. html Microsoft Web Application Stress Tool http: //www. microsoft. com/technet/archive/itsolutions/intranet/downloads/webstres. mspx http_load (thttpdの作者が作成) http: //www. acme. com/software/http_load/ Web. Stone (SGI → Mindcraft社) http: //www. mindcraft. com/webstone/ performance. exe (櫻井氏作) Shdocvw. dll と Get. Tick. Count による IEレスポンス計測ツール(VBで 120行) → 想定状況や用途によってツールを適切に使い分ける 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 5
Max. Clients による Apache の性能変化 n http_load によるベンチマーク結果 [シナリオ] HTTP/1. 0 で、/images/null. gif (47 bytes)を 20回連続して取得するクライアントを 並列に走らせて、サーバのリクエスト処理量を計測した。 (total 10, 000リクエスト) Server: Apache 1. 3. 27 CPU : Intel Celeron 800 MHz Mem : 640 MB OS : Red Hat Enterprise Linux AS 2. 1 Kernel: 2. 4. 9 -e. 27 Client : http_load-04 jan 2002 CPU : Intel Pentium III 450 MHz Mem : 64 MB OS : Red Hat Linux 9. 0 Kernel: 2. 4. 20 -8 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Max. Clients Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 7
適切な Max. Clients を設定するには(1) n Max. Clients とメモリ消費量の関係式 親プロセス Max_Process_Size httpd 親プロセスと共有されている部分 子プロセス Shared_RAM_per_Child fork() メモリ消費量 Max. Clients Total_RAM = Max_Process_Size + (Max_Process_Size - Shared_RAM_per_Child) × Max. Clients 上式を Max. Clients について解く Max. Clients = 2004 -08 -16 Total_RAM - Max_Process_Size - Shared_RAM_per_Child 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 8
適切な Max. Clients を設定するには(2) n Max. Clients の値を実際に計算してみる 親プロセス 20 MB httpd 親プロセスと共有されている部分 子プロセス 5 MB fork() メモリ消費量 Max. Clients Total_RAM = Max_Process_Size + (Max_Process_Size - Shared_RAM_per_Child) × Max. Clients Total_RAM = 1024 MB , Max_Proccess_Size = 20 MB , Shared_RAM_per_Child = 5 MB 条件をあてはめて計算してみる 空きメモリ容量 Max. Clients = 2004 -08 -16 1024 - 20 20 - 5 中国地方Linuxユーザ会 2004夏期セミナー = 1004 / 15 = 66. 9333… プロセス数 の上限 Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 9
INSUITE Enterprise 導入実績 【注: 2004年 3月末日のデータ】 50, 000 48, 800 45, 000 40 38 40, 000 35 導入社数 35, 000 30 30, 000 24 25 導入企業数 累計CL数 22 25, 000 24, 800 24, 180 20 20, 000 15 15, 000 12 10 10 10, 000 5 5 1 950 6, 720 6, 830 5, 000 2, 620 0 0 第 2四半期 第 3四半期 第 4四半期 2002年度 2004 -08 -16 導入ユーザ・ライセンス数 45 中国地方Linuxユーザ会 2004夏期セミナー 第 1四半期 第 2四半期 第 3四半期 第 4四半期 2003年度 Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 12
heavyweight な mod_perl アプリケーション n INSUITE Enterprise V. 1. 10. 0 n CGI n n Charset, HTMLDOMParser, Mail. Parser … CPAN Modules (or others) n n n 2004 -08 -16 *. pm … 212個 (129, 422行) Apache: : Registry. Loaderで すべてのCGIをロードすると httpd のプロセスサイズが 50 MB を超えます・・・ XS Modules n n *. cgi … 769個 (220, 246行) Perl Modules n n (開発版2004 -08 -09) Apache: : Registry, Apache: : Util, Apache: : DBI … HTML: : Template, Compress: : Zlib, Image: : Magick … LWP: : Parallel: : User. Agent, Net: : LDAP, IO: : Socket … Digest: : MD 5, Crypt: : CBC, Crypt: : Blowfish … Data: : Dumper, Storable, Devel: : Profiler … XML: : Parser, XML: : Simple, Apache: : SOAP … 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 15
構成例(1) AP× 1台 mod_perl のみ Port 80 users The Internet or intranet mod_perl アプリケーション AP server 1 RDBMS File Server 従来の構成では AP Server 1上で、mod_perlが動作し、 ユーザから直接アクセスが来る 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 19
構成例(2) AP× 1台 mod_perl + Esehttpd + Pound Port 80 users The Internet or intranet 負 荷 分 散 Esehttpd 画像サーバ mod_perl アプリケーション AP server 1 RDBMS File Server AP Server 1上に、mod_perl のほかに、 新しく Esehttpd と Pound を追加 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 20
INSUITE Enterprise のおまけ機能 n すべての画像を圧縮したアーカイブを用意 ■ 高速化オプション 【CGIで出力するHTML】 <img src="/images/null. gif" ↓mod_perl側でHTMLを書き換えてから出力 <img src="file: ///C|/INSUITE-E/null. gif" ※ ユーザ毎に設定可能 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 22
構成例(3) AP× 2台 mod_perl + Esehttpd + Pound Esehttpd Pound 負 荷 分 散 画像サーバ mod_perl アプリケーション Port 80 AP server 1 users The Internet or intranet RDBMS mod_perl アプリケーション AP server 2 File Server AP Server 1 のほかに、AP Server 2 を新しく追加し mod_perl を動作させる 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 23
構成例(3) Pound の設定ファイル n /etc/pound. cfg (例) Server. Name luck 2004. dreamarts. co. jp User nobody Group nobody Root. Jail /usr/share/empty Listen. HTTP *, 80 Listen. HTTPS *, 443 /etc/pound/server. pem Client 300 Server 3600 Alive 10 Extended. HTTP 1 Web. DAV 1 Log. Level 3 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー HTMLをカスタマイズできるようパッチで設定項目を追加 Err 500 "/etc/pound/500. html" Err 501 "/etc/pound/501. html" Err 503 "/etc/pound/503. html" Url. Group "^/images/. *" Back. End 127. 0. 0. 1, 8077, 1 End. Group Url. Group ". *" Back. End 127. 0. 0. 1, 8000, 1 Back. End 192. 168. 10. 202, 8000, 1 Session Cookie INSUITE-Enterprise 3600 End. Group Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 24
構成例(4) AP× 2台 + 負荷分散マシン× 1台 Pound Port 80 users 負 荷 分 散 Esehttpd 画像サーバ mod_perl アプリケーション AP server 1 負荷分散マシン The Internet or intranet RDBMS mod_perl アプリケーション AP server 2 File Server AP Server 1 と AP Server 2 上で、mod_perl を動作させ、 負荷分散マシンを前面に配置する(Disk less構成も可能) 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 25
構成例(5) AP× 2台 + DNSラウンドロビン Pound Port 80 DNS Server 負 荷 分 散 Esehttpd 画像サーバ mod_perl アプリケーション AP server 1 users Pound The Internet or intranet Port 80 負 荷 分 散 Esehttpd 画像サーバ RDBMS mod_perl アプリケーション AP server 2 File Server AP Server 1 と同じ構成で AP Server 2 を追加、 DNSラウンドロビンでリクエストの振り分けを行う 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 26
構成例(7) AP× 2台 + ハードウェア・ロードバランサ アプリケーション ド ウ ェ ア ・ ロ AP server 1 ー users mod_perl ー Port 80 ハ The Internet or intranet ド バ ラ ン サ mod_perl RDBMS アプリケーション AP server 2 File Server ハードウェア・ロードバランサに直接 mod_perl を接続、 ただし mod_perl が Keep. Alive off なので性能上不利 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 28
複数サーバ運用時に問題となる点 n Etag キャッシュ無効問題(Apache側) 1. Etag (Entity Tag) は、URI固有のコンテンツIDを返すもの 2. 複数のサーバ上のディスクで、同じコンテンツをrsync などで同期をとっていた場合に発生 3. 参照するサーバが異なった場合 If-None-Match条件が満たされず HTTP Status 200 になる 【例】 AP Server 1上でのEtag 【例】 AP Server 2上でのEtag HEAD /images/null. gif HTTP/1. 0 HTTP/1. 1 200 OK Date: Thu, 22 May 2003 06: 41: 43 GMT Server: Apache Last-Modified: Tue, 22 Jan 2002 07: 55: 23 GMT ETag: "40332 -2 b-3 c 4 d 1 aeb" Accept-Ranges: bytes Content-Length: 43 Connection: close Content-Type: image/gif HTTP/1. 1 200 OK Date: Thu, 22 May 2003 06: 42: 16 GMT Server: Apache Last-Modified: Tue, 22 Jan 2002 07: 55: 23 GMT ETag: "9 f 70 f-2 b-3 c 4 d 1 aeb" Accept-Ranges: bytes Content-Length: 43 Connection: close Content-Type: image/gif ※ Last-Modified: は同一だが、Etag: が異なるコンテンツIDを返しているのが原因 (1) Apache では i-node + size + mtime の3つの情報より unique な文字列を生成している (2) NFSで共有してる場合は大丈夫だが、NFSで共有していない場合、i-node が異なってしまう (3) ややこしいことに、Apache 1. 3/2. 0 で生成される文字列(mtimeの部分)が若干異なる 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 29
SSL Reverse Proxyを使用したときに問題となる点 n Internal Redirect 書き換え問題 内側の Apache で、Redirect Response (301) が発行されたときに Locationヘッダが外向きの https: // ではなく、 内側の http: // のままで出力されてしまうことがある 【例】URLのディレクトリ末尾 “/” を省略してアクセスした場合 (1) https: //www. example. com/dir (2) GET /dir HTTP/1. x で代理アクセス Internal HTTP Server External SSL Reverse Proxy (4) Location: https: //www. example. com/dir/ (3) Location: http: //internal-address/dir/ Reverse Proxy側で書き換える必要がある → Pound ではこの不具合を修正するパッチを作成して対応 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 31
HTTP Reverse Proxy ソフトウェア詳細比較 Server model Security Forward Proxy Reverse Proxy Load Balancer chroot Non. Disk I/O SSL Proxy Cache Rewrite Location Keep Alive Switch Layer Cache Fail-over Algorithm Apache 1. 3 mod_proxy pre-fork - - ○ ○ - Layer 7 ○ N/A Squid multithread - - ○ ○ ○ Layer 7 ○ N/A Dele. Gate - - - ○ ○ ◎ Layer 7 ○ N/A PLB libevent ○ ○ - - - ○ - Layer 4 - △ simple Pound multithread ○ ○ ○ - - ● ○ Layer 7 - ○ weight パッチで修正 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 32
UNIX Network Programming の歴史 n 伝統的な手法 n select n n FD_SETSIZE の制限あり(デフォルト: 1024) poll n n (blocking I/O, non-blocking I/O) kernel <-> user 空間で、巨大配列のやりとり 最近流行の手法 n /dev/poll(Solaris), kqueue(Free. BSD 4. 3+) n n システムコール型 edge-triggered poll replacement POSIX Realtime Signals(Linux kernel 2. 4+) n 2004 -08 -16 poll時に、毎回同じ引数を呼び出す必要がなくなる epoll(Linux kernel 2. 5. 46+) n n (non-blocking I/O) シグナル通知型 edge-triggered poll replacement 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 33
Esehttpd の紹介 n ESE HTTP Server (作者: Akira Higuchiさん) n http: //ghost. math. sci. hokudai. ac. jp/esehttpd/ 1. POSIX Realtime Signals (Linux 2. 4+) による実装 2. I/O多重化: 1つのプロセスで動作 3. 無駄なPollingがない: CPU占有率が少ない 4. 1パケットによるHTTP/1. 1 pipeline転送機能を持つ 5. セキュリティにも配慮、chroot できる 6. SSLの機能もある (今回のサーバ構成では使用しない) 7. Ruby組み込みも可(今回のサーバ構成では使用しない) 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 34
Esehttpd と Apache の性能比較 n http_load によるベンチマーク結果 [シナリオ] HTTP/1. 0 で、/images/null. gif (47 bytes)を 20回連続して取得するクライアントを 並列に走らせて、サーバのリクエスト処理量を計測した。 (total 10, 000リクエスト) Server: Apache 1. 3. 27 CPU : Intel Celeron 800 MHz Mem : 640 MB OS : Red Hat Enterprise Linux AS 2. 1 Kernel: 2. 4. 9 -e. 27 Client : http_load-04 jan 2002 CPU : Intel Pentium III 450 MHz Mem : 64 MB OS : Red Hat Linux 9. 0 Kernel: 2. 4. 20 -8 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Max. Clients Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 35
1パケットによる HTTP/1. 1 pipeline 転送 n Esehttpd の転送能力 - Esehttpd Apache 2. 0 TUX X 15 Esehttpd のページより引用 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 36
Esehttpd の設定ファイル(例) n esehttpd. conf Server. Root Port User Group Bind. Address Server. Name /usr/lib/esehttpd 8077 nobody * localhost Max. Files 8000 # # # # # 2048 0 128 2 300 Off 65536 8192 16777216 2004 -08 -16 File. Cache. Size File. Cache. Threshold Listen. Backlog Start. Servers Time. Out Force. Lingering. Close. Limit Request. Header. Limit Request. Body. Limit 中国地方Linuxユーザ会 2004夏期セミナー Default. Types. Config text/plain /usr/lib/esehttpd/conf/mime. types # Error. Document. Dir # Custom. Log /usr/lib/esehttpd/www/errors/ /usr/lib/esehttpd/log/access_log combined Change. Root Document. Root /usr/local/www/html Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 37
参考文献 n URL n The C 10 K Problem n n mod_perl Performance Tuning n n http: //www. kegel. com/c 10 k. html 男気あふれる現役 UNIX C Programmer な方には是非お勧め http: //perl. apache. org/docs/1. 0/guide/performance. html 書籍 n 2004 -08 -16 UNIX NETWORK Programming Vol. 1, Second Edition “Networking APIs: Sockets and XTI” by W. Richard Stevens, 1998 (日本語訳 1999) 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 39
Tips: Linux kernelパラメータの変更方法 n プロセス毎の FD のデフォルト値を増やす n /usr/src/linux/include/linux/fs. h n n /usr/src/linux/include/linux/limits. h n n #define INR_OPEN 8192 (デフォルトは 1024) #define NR_OPEN 8192 (デフォルトは 1024) FD_SETSIZE のデフォルト値を増やす n /usr/src/linux/include/linux/posix_types. h n #define __FD_SETSIZE 8192 (デフォルトは 1024) → 必要に応じて、Kernelの再コンパイル、プログラムの再コンパイル 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 43
Tips: Open. SSL にリンクしないバイナリを作る n #include “disable_ssl. h” の 1行を追加 #ifndef DISABLE_SSL_H #define #define #define SSL_new(ctx) SSL_read(ssl, buf, num) SSL_write(ssl, buf, num) SSL_free(ssl) SSL_get_verify_result(ssl) SSL_get_error(ssl, ret) SSL_get_peer_certificate(ssl) SSL_shutdown(ssl) NULL 0 0 X 509_V_OK SSL_ERROR_ZERO_RETURN NULL 1 : : #endif → 一見すると ad-hoc な手法に見えるが、ソースコードすべてに #ifdef を追加していくよりも現実的 2004 -08 -16 中国地方Linuxユーザ会 2004夏期セミナー Copyright © 2003, 2004 Dream. Arts Corporation. All Rights Reserved. 44
- Slides: 45