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 アダプタに対して起こり得る共有違反を回避します。
| フィードバック |
検索や記事に関するご意見・ご要望はこちらからお送りください。 |