Apacheの同時接続スレッド数
- 表題の件を調べることになった、このページには最終的な手順のみ残す
workerで動いてるか、preforkで動いてるか確認
- Apacheのプロセス管理がなんのモジュールで行われているか確認する
$ apachectl -l Compiled in modules: core.c worker.c http_core.c mod_so.c
この場合workerで確定。worker, preforkが何であるかについてはググってください。
プロセス・スレッド設定を確認する
- /etc/httpd/conf/httpd.conf を確認する
- IfModule worker.cで囲われた部分がworkerの設定、IfModule prefork.cにはpreforkの設定が書いてある
- How do you increase the max number of concurrent connections in Apache? - Stack Overflow
- 以下の設定例について解説している
ServerLimit 16 StartServers 2 MaxClients 200 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25
TL;DR
- 上の場合ApacheはMaxClients 200の設定で動くので、同時接続ユーザは最大200になる
- 上限をあげたい場合はServerLimitとMaxClientsの数値を上げれば良い
詳しい説明
- 最初に、Apacheが起動した時はいつでもStartServersのパラメーターで定められた2つの子プロセスが起動する
- そして、そのいずれのプロセスでもThreadsPerChildのパラメーターで定められた25スレッドが起動する、これは2つのプロセスが50の同時接続/クライアントに対してのみ提供されるということを意味する(つまり25x2=50)
- より多くの同時接続ユーザがきたとすると、その時他の子プロセスが起動する。それはまた新たに25ユーザにページを表示させられる。
- しかし子プロセスを何個起動させられるかどうかはServerLimitパラメータでその総数が制御されている、どの子プロセスも25スレッド操作できるとすると、実行できるスレッドの総数は16x25=400の同時接続ユーザだ
- しかしMaxClientsが200以下で定義されていると(これは8つの子プロセスを意味するのだが)、MaxCilientsで上限が設定されていることになるので新しいプロセスを起動できないことになる
- これはまた、もしもMaxClientsを1000で設定(これは16の子プロセス、400接続を意味する)しても、新しいプロセスを起動させることができない(※ここの英語しつこい)
- この場合はServerLimitを1000/25、つまりMaxClients/ThreadsPerChild=40で設定することで同時接続1000ユーザに最適化された設定を実現できる
VisualVMが使ってみるとけっこうよかった件
仕事で負荷試験などを行ったのだが、ボトルネックがどこであるか非常にわかりやすい。
ボトルネックの見つけ方
VisualVMでできること
- WEBアプリケーションのスレッドごと、コールスタックごとのCPU処理時間算出
- WEBアプリケーションのSQLクエリの呼び出し回数とコールスタックと処理時間算出
コールスタック
- コールスタックとは関数の呼び出し履歴をツリー形式で見ることができるようにしたもので、どの関数でどのくらい時間がかかっているかとてもわかりやすい
気付きなど
- 意外にJavaのロジックで重そうであっても時間がかからない(レコードが10万程度にならないと繰り返し処理で問題が出ることはない)
- DBの呼び出しをできるだけへらすことがパフォーマンス向上につながる
- そういう意味ではキャッシュの実装もパフォーマンス向上に有効
Seleniumにおける待ち合わせの概念
Selenium
- このページの重要な点を翻訳
Implicit Wait(暗黙的待ち合わせ)
Explicit Wait(明示的待ち合わせ)
- 明示的待ち合わせは、コードを実行する前に特定の状態になるまでWebdriverのインスタンスのために設定、実装されるコードのこと
- WebDriverWaitとExpectedConditionで定義される特定のメソッドと状態は明示的待ち合わせを実装するための一つの手法です