TIM Labs

SHIMANE, Yoshikazuによるエントリー一覧

前回に引き続きApache JMeterに関する話を書きます。 今回はシナリオ作成の際のちょっとした応用、それも結構頻繁に使うものです。

タイトルとして「Apache JMeterでASP.NETアプリをテストする」と書きましたが、要はリクエストの戻り値(レスポンスのHTML)中に含まれている値を、次のリクエストのPOST/GETパラメータに含める方法を説明します。 さて、なぜわざわざ「ASP.NETをテストする」と書いたかをASP.NETを知らない人に説明すると、所謂ポストバックというHttp Sessionに含めるような内容をレスポンス中のhiddenとして吐き出し、次のPOSTに含めることでHttp Sessionに近い状態管理を行うことができる仕組みを使っているからです。内部実装的にはSessionに含める情報(Object)をシリアライズしてBASE64エンコードしたものをhiddenに埋め込む感じです。

私ももともとJava開発中心でASP.NETは詳しくはありませんが、上記で大体あっているはずです。間違いがあったらご容赦ください。

さて、そのような仕組みで動いているため、ASP.NETアプリをテストする際にはレスポンスHTMLをパースしその中から特定の部分を抽出、次のPOSTに含めるということをしなければなりません。そのための簡単な方法を説明します。

みなさん、負荷テストはどうやっているでしょうか。
私は無償で且つ機能のそれなりということで、Apache JMeterをよく利用します。

さて、JMeterを利用し負荷をかける際に当然ログをとります。後で解析する必要があるからです。
その際、画面上時間表記になっている個所でもなにもせずログ出力を行うとJavaの実装通り1970年1月1日0時0分0秒UTCからのミリsecの値で出力されます。
たとえば、「2012年4月5日11:09:37(ミリ秒は省略)」であれば「1333591776885」のようになります。

これを人間が見てわかる形、たとえば上記の「2012年4月5日11:09:37」のような「yyyy/mm/dd hh:mm:ss」フォーマットにする場合どうすればよいでしょうか。

方法は二つあります。
ほとんどタイトルで言い尽くしてしまった感がありますが、Windows XP SP3 + .Net Framework 4.0 の環境では標準ライブラリにあるSHA256ハッシュ関数を使うことができません。いや、その環境では動かないと言ったほうがいいでしょう。

上記リンク先のMSDNのページをみると、.Net Framework 4.0の場合
Windows 7, Windows Vista SP1 以降, Windows Server 2008 (Server Core はサポート対象外), Windows Server 2008 R2 (SP1 以降で Server Core をサポート), Windows Server 2003 SP2
.Net Framework 3.5 では
Windows Vista, Windows XP SP2, Windows Server 2003
となっています。Windows XP SP3 では、どちらにも当てはまらないためSHA256が使うことができないのです。ちなみにWindows XP SP2+.Net Framework 3.5 の場合は動く模様です。見事な落とし穴です。

幸い、こちらの方が対応策を書いていますので、場合によってはレジストリをいじって回避するというのもありです。ただし、当然ランタイム環境で気にしなければならないのは確かですけどね。
私は基本的にプログラマでインフラは専門ではありませんが、開発環境の構築など必要に応じてLinux/UNIXを触ることがあります。今回はその開発環境構築の際にはまったことを書いてみたいと思います。

構築内容は
  • Solaris10 が NFSv4のサーバとして、/export/home をexport
  • Debian6.0 がNFSv4クライアントとして、SolarisからexportされたディレクトリをNFSv4でマウント
という比較的シンプルなものです。
Solaris10とDebianの混成とちょっと変わっていますが、今までお客様の環境はSolaris10のみで構成されていたものを、今回一部Debianに置き換えるためにこのような構成に変更となりました。つまりこの構成は未検証というものです。

NFSは以前少しだけサーバ/クライアントともにCentOS5.xで構築したことがあり、最低限動かすだけならばそんなに難しいものではないと思っていました。ただ、今回は
  • サーバとクライアントでOSが異なる
  • そもそもDebianおよびSolaris、特にSolarisに不慣れ
  • /etc/passwd, /etc/shadow, /etc/group がLDAPを参照している
という点で不安要素がありました。

さて、実際にNFSのexport/mount を行ってみたところ問題が発生しました。
Javaの開発者でEclipseを利用されている方は多いと思います。 通常のEclipseをインストールするとJavaの開発用ツールが一式はいりますが、その中にJavaのデバッグツールも含まれます。

TomcatやJetty、WebLogicなどのWebアプリケーションサーバ上で動くWebシステムを開発する際、ローカルにWebアプリケーションサーバを入れその上で動かしながら開発を進めていくのが一般的だと思います。

EclipseではTomcatプラグインなどWebアプリケーションサーバ固有のプラグインでのデバッグ実行、もしくはEclipseに「サーバ」としてWebアプリケーションサーバを登録し、そこからデバッグ起動することでEclipseからデバッグをすることができます。では、手元のマシン(ローカル)以外で動いているアプリケーション(Webアプリはもちろんバッチなど)はどのようにしてデバッグすればよいのでしょうか。
Javaのプログラムを実行した際、なんらかしらのバグや高負荷によりハングアップのような状態になることがあります。そうした際、jvmのスタックトレースを見ることでどこの処理まで到達しているか、またどの辺りでとまっているかを調査することが可能となります。

では、どのようにすればjvmで実行中のプログラムのスタックトレースを取得できるのでしょうか。

このアーカイブについて

このページには、SHIMANE, Yoshikazuが最近書いたブログ記事が含まれています。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。