WebObjects 5.1: Microsoft Windows 上で、IIS アダプタのパフォーマンスを向上させる方法
ある一定の条件下で、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 専用です。ほかのプラットフォームでは、使用しないでください。
コードパッチの適用方法
- ソースコードを見つけます。
以下のディレクトリに移動し、以下のパスにある Adaptor サブプロジェクトを見つけてください。
$NEXT_ROOT/Developer/Examples/WebObjects/Source/Adaptors/Adaptor - Adaptor サブプロジェクト内で、ファイル request.h と request.c を見つけてください。
- ファイル request.h と request.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 アダプタに対して起こり得る共有違反を回避します。
フィードバック |
検索や記事に関するご意見・ご要望はこちらからお送りください。 |