none
IIS8 の ARRによる リバースプロキシ先のWebサイトで、Reqeust Queue が一方的に増加する現象が発生する RRS feed

  • 質問

  • Windows Server 2012 上の IIS8 で、ARRを使ったリバースプロキシによるWebサイトを構築しています。(以下、概念図)

    Webサイト1は主にURL書き換え機能により不正なリクエストを拒否したりしているサイトです。
    ASP.NET で作成しているアプリ本体はWebサイト2にあり、Webサイト1からはARRによるリバースプロキシによりアクセスされます。

    このような状況下で、同時に多数のリクエスト(同時接続数がCPUコア数を大きく超えるような数)が来た場合、このサーバーのCPUやメモリ消費量が増えずに、パフォーマンスカウンタのRequest Queueのみが一方的に増加していくような状況になってしまいます。

    CPUがほぼ100%処理しつつ、かつ処理しきれない分のリクエストがQueueに積まれているのであれば理解できるのですが、なぜCPUがまったく使われないかが理解できておりません。
    サービス運用としては、複数台のサーバーを水平分散しているのですが、アクセス数が増えると上のような状況が発生しCPU使用率が上がらないままリクエストが処理できなくなってしまうため、監視しづらいという状況になっております。

    また、同じ程度の量の負荷をWebサイト1を経由せずに直接Webサイト2にかけると、こちらの想定通り、CPU使用率が100%近くになり、さばききれない分のリクエストがエラーになります。リバースプロキシ経由との挙動の違いについても理解できずにいます。

    同時接続数が増えた際に、なぜCPUを使わずにQueueに積まれていく状況になるのかの理由、もしくはその対策をご存知の方、教えていただけないでしょうか。

    2014年1月24日 12:04

回答

  • すでに参照されているかもしれませんが、iis.netで公開されている「Troubleshooting 502 Errors in ARR」が
    解決策のヒントになる情報があるかもしれません。
    Queueにたまっているだけで、エラーになっていない状況のようですので、
    そのまままるっとは参考にならないかもしれませんが・・・。

    あとは、Webサイト1とWebサイト2のローカルポートの状況やnetstatの状況を確認すると、
    一つの切り分けにはなるかなっと思います。

    2014年1月28日 6:52

すべての返信

  • serverfault で議論されていたのですが、

    http://serverfault.com/questions/548351/arr-troubleshooting-502-3-winhttp-tracing-on-server-2012/565956#565956

    どうもリバースプロキシする際に、バックエンドに投げるリクエストのタイムアウトがリバースプロキシ受ける側のタイムアウトに比べて非常に長いため、バックエンド側にリクエストがQueueにたまっていくのではないか、と今のところ推測しています。

    2014年1月28日 5:31
  • すでに参照されているかもしれませんが、iis.netで公開されている「Troubleshooting 502 Errors in ARR」が
    解決策のヒントになる情報があるかもしれません。
    Queueにたまっているだけで、エラーになっていない状況のようですので、
    そのまままるっとは参考にならないかもしれませんが・・・。

    あとは、Webサイト1とWebサイト2のローカルポートの状況やnetstatの状況を確認すると、
    一つの切り分けにはなるかなっと思います。

    2014年1月28日 6:52
  • ありがとうございます。たしかにそのサイトも参考にしておりました。

    挙動まで理解したわけではありませんが、バックエンドに投げるときのタイムアウトの設定とQueueの長さを制限することで負荷テストの範囲では回避できることが確認できました。

    2014年2月7日 11:12