Technical Guide 1999 5 Internet and E-Commerce Solutions Business Unit Enterprise Solutions Division Apache Web Server Compaq Linux Apache HTTP Compaq Computer Corporation...3...3...4...5...6...7...7...7...8...10...10...16...16 CGI...16 CGI...17 CGI...18 CGI...19
Apache Web Server 2 Compaq ActiveAnswers Deskpro Compaq Insight Manager Fastart Systempro Systempro/LT ProLiant ROMPaq Qvision SmartStart NetFlex QuickFind PaqFax Prosignia Compaq Computer Corporation Netelligent Systempro/XL SoftPaq QuickBlank Compaq Computer Corporation Linux Linus Torvalds Pentium Intel Corporation 1999 Compaq Computer Corporation. All rights reserved. Printed in Japnan. 1999 Apache Web Server Technical Guide Enterprise Solutions Division 1 1999 5
Apache Web Server 3 Linux Apache Web Server SuSE 6.0 Linux Linux Apache HTTP Server Linux Web Linux Apache HTTP Server 2 CPU Apache HTTP Server CPU Compaq Sizer for Apache Web Server On Linux Web Compaq ActiveAnswers Web http://www.compaq.com/activeanswers/
Apache Web Server 4 Web Compaq ProLiant 1850R 1 1 ProLiant 1850R Pentium II 450MHz 512 KB 1 2 128MB 256MB 512MB 10/100 TX UTP Compaq PCI Netelligent Intel NIC 9.1GB 10000 RPM SCSI OS 1 4.3GB 10000 RPM SCSI 1
Apache Web Server 5 1 SUT 1 SUT 2 100BaseTx 2 テスト対象のシステムユニットコントローラ 負荷生成用ステーション サーバ ワークステーション コンピュータコンピュータコンピュータコンピュータコンピュータコンピュータ HUB コンピュータコンピュータコンピュータコンピュータコンピュータコンピュータ HUB コンピュータコンピュータコンピュータコンピュータコンピュータコンピュータ HUB コンピュータコンピュータコンピュータコンピュータコンピュータコンピュータ HUB 1
Apache Web Server 6 Compaq ProLiant 1850R SuSE Linux 6.0 Apache HTTP Server 1.3.4 Linux 2.2.4 2.2.4 /usr/src/linux.config 2.2.4 1 crond klogd httpd inetd 2 Linux Apache Linux Web 3 64MB 256MB 512MB 3 CGI 4 CGI Web Bench 2.0 HTML CGI Web CGI CGI simcgi Web Bench 2.0 CGI Web CGI CGI ID 1 ActiveAnswers 2 inctd 3 6kB 4 CGI
Apache Web Server 7 HTTP Ziff-Davis WebBench 2.0 5 CPU 3 2 6 10 4 5 1 vmstat Web Ziff-Davis WebBench 2.0 Web Web Apache HTTP Server MaxClient Web TCP/IP Linux TCP/IP 2.2.3 2.2.4 5 CPU 100 6 2 3
Apache Web Server 8 Apache Web Linux crond klogd httpd inetd SuSE YaST Caldera LISA OpenLinux 1.3 Red Hat linuxconfig /etc/rc.d /etc/rc.d/init.d /etc/sysconfig inode Web echo 16384 > /proc/sys/fs/file-max echo 49152 > /proc/sys/fs/inode-max Linux /proc top vmstat inode 2.2.4 4 Web 4 Apache Apache Web http://www.apache.org/docs/misc/perf-tuning.html httpd.conf HostnameLookups off <Files ~ "\.(html cgi)$> HostnameLookups on </Files>
Apache Web Server 9 httpd.con httpd.conf DocumentRoot /usr/local/httpd/htdocs <Directory /> AllowOverride none </Directory> httpd.conf DocumentRoot /usr/local/httpd/htdocs <Directory /> Options -FollowSymLinks </Directory> <Directory /cgi-bin> Options FollowSymLinks </Directory> httpd.conf DirectoryIndex index.html httpd httpd.conf MinSpareServers 50 MaxSpareServers 150 MaxRequestsPerChild 3,000,000 MaxClient 256 StartServers 150 Web OS /var/log httpd.access_log httpd.error_log noatime Web OS noatime Apache
Apache Web Server 10 Linux 2.2.4 Linux 2.2.4 6x86 ProLiant 1850R.config 7 CGI Web Web HTML Web CPU Web 1 T1 Linux Apache HTTP T1 1 2 128MB Compaq 512MB 128MB 5 T1 7 ActiveAnswers
Apache Web Server 11 スループット : Mb/s 1 秒あたりのメガビット数 スループット : Mb/s 作業負荷のサイズ / メモリ量 2 5 7 T1 Web 1 T3 2 3 1 CGI 4 Web CGI CGI
リクエスト数 リクエスト数 Apache Web Server 12 静的コンテンツのリクエストに対する 1 秒あたりの処理数 リクエスト数 /s 64MB の作業負荷 256MB の作業負荷 512MB の作業負荷 メモリ 3 1
リクエスト数 リクエスト数 Apache Web Server 13 128MB における CGI と静的コンテンツのリクエスト処理数比較 リクエスト数 /s やや複雑な CGI 単純な CGI 静的コンテンツ 作業負荷のサイズ 4 128MB 1 CGI
リクエスト数 リクエスト数 Apache Web Server 14 256MB における CGI と静的コンテンツのリクエスト処理数比較 リクエスト数 /s やや複雑なCGI 単純なCGI 静的コンテンツ 作業負荷のサイズ 5 256MB 1 CGI
リクエスト数 リクエスト数 Apache Web Server 15 512MB における CGI と静的コンテンツのリクエスト処理数比較 リクエスト数 /s やや複雑なCGI 単純なCGI 静的コンテンツ 作業負荷のサイズ 6 512MB 1 CGI 4 5 6 Web
Apache Web Server 16 Web Web CGI Web Web Web 1GB 70 80 256MB 1 Web 5 T1 CGI 4 5 6 Web CGI 1 CGI 1. CGI 2. CGI 3. CGI CGI
リクエスト数 リクエスト数 Apache Web Server 17 CGI CGI CGI 7 1 8 1 プロセッサと 2 プロセッサの比較 1 秒あたりのリクエスト処理数 512MB メモリ 64MB の作業負荷 リクエスト数 /s シングルプロセッサデュアルプロセッサ 静的 単純な CGI リクエストの種類 やや複雑な CGI 7
パーセント Apache Web Server 18 2 基目のプロセッサを追加した場合の 1 秒あたりのリクエスト処理数の増加 静的単純な CGI やや複雑な CGI CGI 性能向上 8 2 CGI Web Web 2 CGI CGI
Apache Web Server 19 CGI #include <stdio.h> #include <stdlib.h> #include <unistd.h> int HexToDec( char c ) switch( c ) case '0': return 0; case '1': return 1; case '2': return 2; case '3': return 3; case '4': return 4; case '5': return 5; case '6': return 6; case '7': return 7; case '8': return 8; case '9': return 9; case 'a' : case 'A' : return 10; case 'b' : case 'B' : return 11; case 'c' : case 'C' : return 12; case 'd' : case 'D' : return 13; case 'e' : case 'E' : return 14; case 'f' : case 'F' : return 15; default: return 0; // uh-oh return 0; // uh-oh
Apache Web Server 20 void dump( char *p, FILE *fp, int len ) int iasciiescape; int iasciivalue; int i; char *pout; int j; pout = (char *)calloc( len, sizeof(char) ); iasciiescape = 0; j = 0; for( i = 0; i < strlen(p); i++ ) if( iasciiescape ) if( iasciiescape == 1 ) // first digit iasciivalue = HexToDec( p[i] ); iasciivalue *= 16; iasciiescape++; else // second digit iasciiescape = 0; iasciivalue += HexToDec( p[i] ); pout[j++] = iasciivalue; else if( p[i] == '+' ) pout[j++] = ' '; else if( p[i] == '&' ) // separator pout[j++] = '\n'; else if( p[i] == '%' ) // begin ASCII escape sequence iasciiescape = 1; continue; else pout[j++] = p[i]; pout[j] = '\0'; fprintf( stdout, "%s", pout ); fprintf( fp, "%s", pout ); free( pout );
Apache Web Server 21 main() pid_t id; int u; FILE *fp; char *p; char fn[64]; char buffer[2048]; id = getpid(); u = (int) id; sprintf( fn, "./File%d.dat", u ); fp = fopen(fn, "a+"); if(!fp )// could not open file printf( "Server-Type: Apache 1.3.4\n\n<html>\ <body><h1>could not open file./file.dat</h1></body></html>\ \r\n"); exit(-1); printf( "Server-Type: Apache 1.3.4\n\n<html>\ <body><p><strong>"); p = getenv("query_string"); fprintf( stdout, "QUERY_STRING:\n"); fprintf( fp, "QUERY_STRING:\n"); dump( p, fp, strlen(p) ); fprintf( stdout, "<br>post_data:\n"); fprintf( fp, "POST_DATA:\n"); while( (p = fgets( buffer, 2047, stdin))!= NULL ) dump( p, fp, 2048 ); printf( "</body></html>\r\n" ); fprintf( fp,\ "\n=============================================\n" ); fclose( fp ); return 0;