WebObjects 5.1: Microsoft Windows 上で、IIS アダプタのパフォーマンスを向上させる方法

  • 最終更新: 2002.11.21
  • Article ID: 75450
(この情報は、こちらの記事を翻訳したものです。日本での使用環境、状況とは異なる場合があります。)

ある一定の条件下で、Microsoft Windows 上の IIS アダプタのパフォーマンスが低下します。このドキュメントでは、この問題の詳細を説明し、この問題を回避するために使用することができるソースコードを提供します。

現象
IIS アダプタを使用している場合、ある一定の条件下で、パフォーマンスが低下します。これらの条件は、各リクエストに対して割り当てられるメモリ総量を増加させ、レスポンスタイムの遅延という結果を招いたり、OutOfMemoryExceptions の原因ともなります。

注意:この現象は、ISAPI アダプタを使っている場合は、お使いのアプリケーションがほかのコンピュータ上の異なるオペレーティングシステムで使用されている場合でも起こります。


対象となる製品

  • Microsoft Windows 用の WebObjects 5.1 〜 5.1.3


解決方法

  • WebObjects 5.2 へアップデートしてください。
  • WebObjects 5.1 〜 5.1.3 を使用している場合は、問題を回避する善後策として、このセクションにあるコードパッチを使用してください。

重要:このパッチは Microsoft Windows 専用です。ほかのプラットフォームでは、使用しないでください。

コードパッチの適用方法

  1. ソースコードを見つけます。
    以下のディレクトリに移動し、以下のパスにある Adaptor サブプロジェクトを見つけてください。
    $NEXT_ROOT/Developer/Examples/WebObjects/Source/Adaptors/Adaptor

  2. Adaptor サブプロジェクト内で、ファイル request.hrequest.c を見つけてください。

  3. ファイル request.hrequest.c に対し、以下のようにコードを修正してください。

ファイル request.h

request.h で、#include "WOURLCUtilities.h" を探し、次の行をその下に追加してください。

#include "wastring.h"

ファイル request.c

request.c では、‘int req_sendRequest’ (217行目付近)メソッドの開始部分を探してください。このオリジナルのメソッド‘int req_sendRequest’ を削除してしまわないように注意してください。以下のコードブロックを、オリジナルのメソッド‘int req_sendRequest’の前に追加します。

#ifdef WIN32 
static void req_appendHeader(const char *key, const char *val, String *headers) { 
  int valLength = strlen(val); 
  while (val[valLength - 1] == 'r' || val[valLength - 1] == 'n') { 
    valLength--; 
  } 
  str_append(headers, key); 
  str_appendLiteral(headers, ": "); 
  str_appendLength(headers, val, valLength); 
  str_appendLiteral(headers, "rn"); 
} 

int req_sendRequest(HTTPRequest *req, net_fd socket) { 
  struct iovec *buffers; 
  int bufferCount, result; 
  String *headersString; 

  buffers = WOMALLOC(3 * sizeof(struct iovec)); 

  headersString = str_create(req->request_str, 0); 
  if (headersString) { 
    st_perform(req->headers, (st_perform_callback)req_appendHeader, headersString); 
  } 
  buffers[0].iov_base = headersString->text; 
  buffers[0].iov_len = headersString->length; 
  buffers[1].iov_base = "rn"; 
  buffers[1].iov_len = 2; 
  bufferCount = 2; 
  if (req->content_length > 0) { 
    bufferCount++; 
    buffers[2].iov_base = req->content; 
    buffers[2].iov_len = req->content_length; 
  } 
  result = transport->sendBuffers(socket, buffers, bufferCount); 
  str_free(headersString); 
  WOFREE(buffers); 
  if (result == 0) 
    result = transport->flush_connection(socket); 
  else 
    WOLog(WO_ERR, "error sending request"); 

  return result; 
} 
#else 
// End of the code to be added to request.c

#else のあとに、オリジナルのメソッド‘req_sendRequest’が続きます。

次にこのメソッドの終端に移動し、中かっこで閉じたあとの次の行に #endif を挿入します。

4.アダプタをコンパイルします。

makefile では、OS 環境変数に、空欄もしくは文字列“WINDOWS”が含まれている必要があります。

Bourne シェルで、以下のように明示的に OS 変数を設定することができます。

cd $NEXT_ROOT/Developer/Examples/WebObjects/Source/Adaptors
set OS=WINDOWS
make clean
make  
make IIS

注意:

  • まず、最初の make 操作によって、ディレクトリ $NEXT_ROOT/Developer/Examples/WebObjects/Source/Adaptors/CGI 内にファイル WebObjects.exe が生成されます。
  • 次の make IIS 操作によって、ディレクトリ $NEXT_ROOT/Developer/Examples/WebObjects/Source/Adaptors/IIS 内にファイル WebObjects.dll が生成されます。
  • setupIOVec is defined but not used(setupIOVec は定義されましたが使用されていません)」という警告が表示されますが、この警告は無視してください。

5.修正されたアダプタをインストールします。

コンパイルが完了すると、WebObjects.EXE$NEXT_ROOT/Developer/Examples/WebObjects/Source/Adaptors/CGI 内)と WebObjects.DLL$NEXT_ROOT/Developer/Examples/WebObjects/Source/Adaptors/IIS)の 2 つのファイルが、適切な場所にコピーされています。お使いのシステムに合わせて、c:inetpub を変更してください。

Bourne シェルで、以下のように実行します。

cd $NEXT_ROOT/Developer/Examples/WebObjects/Source/Adaptors

net stop w3svc

cp cgi/webobjects.exe c:/inetpub/scripts

cp iis/webobjects.dll c:/inetpub/scripts

net start w3svc

すでに IIS によってロードされたファイルがある場合は上書きできないので、コピーする前に IIS を停止して、ISAPI アダプタに対して起こり得る共有違反を回避します。

キーワード:
フィードバック

検索や記事に関するご意見・ご要望はこちらからお送りください。