IBM HTTP Serverのスレッド数をログから確認する

IBM HTTP Serverは標準でスレッドの状態とスレッド数をログに記録してくれています。
障害発生時にログを確認することで、処理中のスレッドで処理待ちになっていたのか、などを確認することができます。

■出力ファイル
error.log
  
■設定ファイル
httpd.conf
```
LoadModule mpmstats_module modules/debug/mod_mpmstats.so
<IfModule mod_mpmstats.c>
# Write a record every 10 minutes (if server isn't idle).
# Recommendation: Lower this interval to 60 seconds, which will
# result in the error log growing faster but with more accurate
# information about server load.
ReportInterval 600
# Include details of active module in the statistics.
TrackModules On
</IfModule>
```
  
■出力形式
>[Sat Apr 10 13:28:30 2021] [notice] mpmstats: rdy 0 bsy 600 rd 16 wr 578 ka 6 log 0 dns 0 cls 0

<各カラムの説明>
  
| 略 | スレッドの状態             |
|:----|:---------------------------------| 
| rdy | 待機状態のスレッド数             |
| bsy | 処理中のスレッド数               |
| rd  | 読み取り中のスレッド数           |
| wr  | 書き込み中のスレッド数           |
| ka  | キープアライブ接続中のスレッド数 |
| log | ログ出力中のスレッド数           |
| dns | DNSルックアップ中のスレッド数    |
| cls | 終了処理中のスレッド数           |
  

[mod_mpmstatsに付いての説明](https://publib.boulder.ibm.com/httpserv/ihsdiag/2.0/mod_mpmstats.html)

rdy + bsy がスレッド数の上限（httpd.confに設定）となります。  
IBM HTTP ServerのバックエンドであるWebSphere Application Serverで処理が滞留すると、
bsyが増加していきます。
  
障害発生時刻あたりを目視でみることもありますが、
一日、数日の推移を見たいこともあります。
力技ですが後述のバッチファイルを作成して、CSV形式に変換してExcelなどで確認しています。

元ファイル
[Sat Apr 10 13:28:30 2021] [notice] mpmstats: rdy 0 bsy 600 rd 16 wr 578 ka 6 log 0 dns 0 cls 0
[Sat Apr 10 13:28:59 2021] [notice] mpmstats: rdy 0 bsy 600 rd 16 wr 584 ka 0 log 0 dns 0 cls 0
[Sat Apr 10 13:31:30 2021] [notice] mpmstats: rdy 0 bsy 600 rd 9 wr 591 ka 0 log 0 dns 0 cls 0
↓
変換後
time,rdy,bsy,rd,wr,ka,log,dns,cls
13:28:30,0,600,16,578,6,0,0,0
13:28:59,0,600,16,584,0,0,0,0
13:31:30,0,600,9,591,0,0,0,0
  
■実行方法
check_TPC.bat error.log
```
@ECHO OFF
REM #**************************************************************************
REM # FILE_NAME  : check_TPC.bat
REM # FUNCTION   : IHSのエラーログからスレッド数(TreadsPerChild)を抜き出し
REM #**************************************************************************
REM # <各カラムの説明>
REM #**************************************************************************
REM # rdy 待機状態のスレッド数
REM # bsy 処理中のスレッド数
REM # rd  読み取り中のスレッド数
REM # wr  書き込み中のスレッド数
REM # ka  キープアライブ接続中のスレッド数
REM # log ログ出力中のスレッド数
REM # dns DNSルックアップ中のスレッド数
REM # cls 終了処理中のスレッド数

:SetCommonEnv
REM # ----------------------------------------------
REM # 共通処理
REM # ----------------------------------------------
TITLE [%0]

SET CURRDIR=%~dp0
SET WORKDIR="%CURRDIR%"
SET LOGDIR=%WORKDIR%

CD /D %WORKDIR%

REM ----------------------------------------------
REM  チェック対象ファイル名を設定
REM ----------------------------------------------
SET FILENAME=error.log
IF NOT "%1"=="" (
   SET FILENAME=%1
)
SET FILENAMEONLY=%FILENAME:~0,-4%

REM ----------------------------------------------
REM ファイルの存在チェック
REM ----------------------------------------------
IF NOT EXIST %FILENAME% (
   ECHO # FILE NOT EXIST : %FILENAME%
   GOTO ErrEnd
)

ECHO # ----------------------------------------------
ECHO # [%0] IHSスレッド数 チェック開始
ECHO # ----------------------------------------------
ECHO # [%0] 開始時間　　　　：[%DATE% %TIME%]
ECHO # [%0] 対象ファイル名　：%FILENAME%

:SetLogName1
REM # ----------------------------------------------
REM # ログファイル名を設定
REM # ----------------------------------------------
SET LOGSTEM1=TPC
SET LOGNAME1=%LOGSTEM1%_%FILENAMEONLY%.csv
SET LOGFILE1=%LOGNAME1%

IF EXIST %LOGFILE1% DEL %LOGFILE1%

FINDSTR /I /C:"mpmstats: rdy " /M %FILENAME% >NUL 2>&1
IF NOT "%ERRORLEVEL%"=="0" GOTO SetLogName2

ECHO time,rdy,bsy,rd,wr,ka,log,dns,cls> %LOGFILE1%
FINDSTR /I /C:"mpmstats: rdy " %FILENAME% > %LOGFILE1%.tmp
FOR /F "tokens=4,9,11,13,15,17,19,21,23 delims= " %%a in (%LOGFILE1%.tmp) DO (
 ECHO %%a,%%b,%%c,%%d,%%e,%%f,%%g,%%h,%%i>>%LOGFILE1%
)

DEL %LOGFILE1%.tmp

:SetLogName2
:END
ECHO # ----------------------------------------------
ECHO # [%0] IHSスレッド数チェック終了                    
ECHO # ----------------------------------------------
ECHO # [%0] 終了時間　　　　：[%DATE% %TIME%]
EXIT /b 0

:ErrEND
REM PAUSE
```

出力したファイルはExcelなどでグラフにすると推移が見やすいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/957366/b6aec909-58c7-a0a2-7350-f4bce12a8928.png)

■スレッド数の設定について

スレッド数の上限に達すると、error.logに以下のメッセージが記録されます。
>12:09:42 reached ThreadsPerChild (600/600)

スレッド数の上限を上げる場合は、httpd.confのThreadLimitとThreadsPerChildを変更します。
変更後に、反映するためにIBM HTTP Serverサービスの再起動が必要です。
  
■設定ファイル
httpd.conf
```
# Windows MPM
#
# For tuning recommendations, refer to <NEWINFOCENTERURL>.
#
# ThreadLimit: maximum setting of ThreadsPerChild
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_winnt.c>
ThreadLimit         600
ThreadsPerChild     600
MaxRequestsPerChild  0
</IfModule>
```

以上です。