【WingNest.COM】【作者について】
Process Nurse Service
■ ダウンロード
■ ご要望などは
メールでお願いします。
(ご返信などには時間が掛かることがあることご了承ください)
■ どんな仕事をするソフトか
Process Nurse Service は、Windows NT Service としてシステムに常駐し、INIファイル
の設定にしたがって、「プロセッサの関係の設定」や「優先度の設定」を自動で行う仕事
をします。
このサービスの仕事は、タスクマネジャーで行える「プロセッサの関係の設定」や「優先
度の設定」の自動化に相当します。
■ 内部動作
定期的にOS上で稼動しているプロセスを列挙し、INIファイルに設定されているプロセスの
状態を調べ、INIファイルに設定されている「プロセッサの関係」(Process Affinity)や
「優先度」と異なる場合に、自動で設定を変更します。
状態を変更する際、Process Nurse Service は、対象プロセスに対して、ProcessNurse.dll 
の注射を試みて、注射に成功するとその dll の中の API を呼び出し状態を変更します。
■ 動作環境
Windows 2000 以降のデュアル CPU またはデュアル・コア・マシンをサポートしたWindows OS。
■ 動作確認済み環境
- Windows XP Professional SP2
- Windows 2000 Server + SP4 
■ インストール方法
1.  任意の場所でProcess Nurse Service のアーカイブを解凍し、任意のフォルダに配置
    します。たとえば、アプリケーションを配置するために一般的に利用されている
    `Program Files'フォルダの下に`Process Nurse'フォルダを作成しその中にアーカイ
    ブを解凍して得ることができるすべてのファイルを移動します。
2. ProcessNurse.dll に `Everyone' グループを追加し、'許可'するものとし[読み取り
   と実行]と[読み取り]を与えます。
   [Windows XP Professional での設定例]
   - エクスプローラー上で、ProcessNurse.dll を選択しマウスの右ボタンクリックを
     し、プロパティダイアログを開きます。
   - セキュリティタブが存在するか確認します。
     ★ セキュリティタブが存在しない場合には、以下の設定は不要です。
     - セキュリティタブを選択します。
     - 「グループ名またはユーザ名」の窓の中に`Everyone'がない場合以下の操作をします。
       - [追加]ボタンを押します。「ユーザまたはグループの選択」ダイアログが開きま
         す。
       - [詳細設定]ボタンを押します。ダイアログの詳細領域が表示されます。
       - [今すぐ検索]ボタンを押します。
       - `Everyone'を選択し[OK]ボタンを押します。ダイアログの詳細領域が無くなります。
       - [OK]ボタンを押します。「ユーザまたはグループの選択」ダイアログが閉じ、
         `Everyone'ユーザが選択された状態のプロパティダイアログになります。
       - 「Everyoneのアクセス許可」窓の'許可'欄で、[読み取りと実行]と[読み取り]が
         チェックされていることを確認します。もしそららがチェックされていない場合は
         チェックし、[OK]ボタンを押します。
     
3. 以下の手順で動作確認をします。
   - スタートメニュー等からコマンドプロンプトを開き、`Process Nurse Service'のファイ
     ルを配置したフォルダに移動します。
   - `ProcessNurseService.exe -d'と入力し実行します。
     どのようなメッセージが出ようとも、実行している様子がコマンドプロンプトの中で表
     示され続ければ、正常動作確認完了です。
     途中で終了してしまう場合には、正常動作は期待できません。
    
   - Ctl-C を入力し、実行を中断します。
4. 以下の手順でサービスとして登録します。
   
  - 3.の確認が無事終了したら、コマンドプロンプトの中に、`ProcessNurseService.exe -i '
    と入力します。以下のようなメッセージが表示された場合には、サービスの登録に失敗し
    たことになりますが、何も表示されなければ登録成功です。
    [ERROR: 01:40:35.281000] not possible to insert Service.
  - コントロールパネルの中の'サービス'を開き、`Process Nurse Service' が登録されて
    いることを確認します。
5. process_nurse.iniを編集し、「プロセッサの関係の設定」や「優先度の設定」を行います。
  - アーカイブの中にあるprocess_nurse.ini を`メモ帳'など任意のエディタで開きます。
    デフォルトでは、IIS と PostgreSQL というデータベースの 「プロセッサの関係の設
    定」を自動で行うサンプルが記述されています。
  - 「プロセッサの関係の設定」を自動で行うプロセスの登録をします。
     - process_nurse.ini ファイルの中で以下の行を見つけます。
       [process]
       list = iis, postgres, postmaster
     - [process]セクションの listキー の箇所を次のように書き換え、コメントアウト(無効に)
       します。
       [process]
       #list = iis, postgres, postmaster
    【以下、メモ帳に対して「プロセッサの関係の設定」する例】
     - list キーに、「プロセッサの関係の設定」を行いたいプロセスの管理名を記述しま
       す。管理名は英数字であれば任意です。何を管理しているのかが分かりやすい名前を
       つけてください。複数のプロセスを管理したい場合には、','(カンマ)で区切って複
       数記述します。
       ここでは、メモ帳に対して「プロセッサの関係の設定」を自動で行いたいというシ
       ナリオで、「管理名」として 'notepad'を選び、次のように記述したことにします。
       [process]
       #list = iis, postgres, postmaster
       list = notepad
     - listキーに登録した notepad という「管理名」の詳細設定記述を行います。
       詳細設定記述は、「管理名」の後に '.'を 付けた、moduleBaseName キーと 
       cpuNumbersキーで行います。moduleBaseNameキー にはモジュール名を記述し、
       cpuNumbersキーには、「プロセッサの関係の設定」するCPU番号を列挙記述
       します。
       たとえば、`メモ帳'のモジュール名の設定と、「プロセッサの関係の設定」
       を CPU0 と行いたい場合の設定は、次のように記述します。
       notepad.moduleBaseName = notepad.exe
       notepad.cpuNumbers = 0
       モジュール名は、タスクマネージャーの「プロセス」タブの「イメージ名」欄
       で表示されている名前に相当します。アプリケーションやサービスのモジュー
       ル名がなんであるかは、システムに詳しくない方には、一番難しい作業になる
       と思います。その場合は身近な詳しい方にご相談ください。
       cpuNumbersキーに設定する CPUの番号は、0 から始まります。CPU が2以上
       ある場合には、','(カンマ)で区切って複数列挙することができます。
       たとえば、CPU が4つあるOSで CPU 0とCPU 3に「プロセッサの関係の設定」
       をしたい場合には、次のように記述することになります。
       notepad.moduleBaseName = notepad.exe
       notepad.cpuNumbers = 0,3
    【引き続き、メモ帳に対して「優先度の設定」する例】
     - 「優先度の設定」の詳細設定記述は、priorityClassキーで行います。
       priorityClassキーには、以下の表にしたがった数値を一つ記述します。
       優先度の設定前のプロセスは、「通常クラス」(値3)で実行されますので、
       それを基準に優先度を設定します。
       ------------------------------------------------------------------
         値   |   説明
       ------------------------------------------------------------------
          0   | リアルタイムクラス
       ------------------------------------------------------------------
          1   | 優先クラス
       ------------------------------------------------------------------
          2   | (通常クラスより高く、優先クラスよりも低い優先度)
       ------------------------------------------------------------------
          3   | 通常クラス   (ここを基準にして設定します)
       ------------------------------------------------------------------
          4   | (通常クラスよりも低く、アイドルクラスよりも高い優先度)
       ------------------------------------------------------------------
          5   |  アイドルクラス
       ------------------------------------------------------------------
       たとえば、`メモ帳'の「優先度」を「優先クラス」に設定する場合、次のよ
       うに記述します。
       notepad.moduleBaseName = notepad.exe
       notepad.cpuNumbers = 0
       notepad.priorityClass = 1
       上の例では、「プロセッサの関係の設定」と「優先度の設定」の両方を行って
       いますが、どちらか一方だけを設定することも可能です。
       例えば、次の記述は「優先度の設定」だけを設定したものです。
       notepad.moduleBaseName = notepad.exe
       notepad.priorityClass = 1
       この様に記述すると、「プロセッサの関係の設定」は行われず、「優先度の設定」
       だけが行われます。
6. サービスを起動します。
    - コントロールパネルの`サービス'を起動し、`Process Nurse Service'を
      選択し[開始]ボタンを押します。
    - 無事サービスが動作していれば、Process Nurse Service のファイルを配置した
      フォルダに process_nurse.log というファイルが作成され実行ログが記録され
      ます。
    - サービスの起動は、コマンドプロンプトから `ProcessNurseService.exe -s'
      と入力することでも可能です。
■ ProcessNurseService.exe 起動オプション
    -i: サービスマネージャーに登録します。
    -r: サービスマネージャーから削除します。
    -s: サービスを開始します。
    -k: サービスを停止します。
    -d: デバッグモードで起動します。このモードではサービスとして起動されてい
        るプロセスに対する「プロセッサの関係の設定」は失敗します。
        INIファイルの記述が正しいかどうか確認したい場合などに利用します。
■ ini ファイル設定リファレンス
○ [service]セクション
   [service]セクションにはサーバの動作設定を記述します。
   config.idleTime : 何秒おきに「プロセッサの関係の設定」の仕事を行うかを設定します。
   config.logMask  : ログファイルに記録する内容を設定します。','(カンマ)で区切って
                     列挙できます。
        error :  エラーが起きた場合にその内容を記録します。
        info  :  仕事を正常に行ったことを記録します。
        warn  :  仕事を正常に行えなかった場合で、エラーと呼べないものを記録します。
        debug :  内部動作状況を把握するために利用します。
   config.logFile  : ログを記録するファイルを設定します。デフォルトは、Process Nurse
                     Service を配置したフォルダの中の process_nurse.log です。
○ [process]セクション
   [process]セクションには、「プロセッサの関係の設定」を自動で行いたいプロセスに
   関する設定項目を記述します。
   list           : 「プロセッサの関係の設定」を行いたいプロセスの「管理名」を列挙
                     します。
                    「管理名」は半角の英数字であれば任意です。
                    「管理名」を複数記述する場合には、','(カンマ)で区切って記述します。
  (管理名).moduleBaseName : モジュール名を記述します。
  (管理名).cpuNumbers     : 関係性の設定したい CPU 番号を記述します。
  (管理名).priorityClass  : 優先度を記述します。設定可能な値は下の表の通りです。
       ------------------------------------------------------------------
         値   |   説明
       ------------------------------------------------------------------
          0   | リアルタイムクラス
       ------------------------------------------------------------------
          1   | 優先クラス
       ------------------------------------------------------------------
          2   | (通常クラスより高く、優先クラスよりも低い優先度)
       ------------------------------------------------------------------
          3   | 通常クラス
       ------------------------------------------------------------------
          4   | (通常クラスよりも低く、アイドルクラスよりも高い優先度)
       ------------------------------------------------------------------
          5   |  アイドルクラス
       ------------------------------------------------------------------
■ FAQ
- Q. Process Nurse Service が稼動中に ini ファイルを編集した場合どうなりますか?
  A. 現在は、Process Nurse Serviceが稼動している時に iniファイルを編集してもサー
     ビス内容は変わりません。
     iniファイルの編集結果を反映するには、サービスの再起動が必要です。
- Q. CPUの割り当てが正常に完了した事はどのようにして確認すればよいでしょうか?
  A. サービスとして稼動しているプロセスはタスクマネージャーの「プロセッサの関係
     の設定」ダイアログで確認ができませんが、それ以外のプロセスはタスクマネージャ
     のそれで確認できます。サービスとして稼動しているプロセスについては、
     Process Nurse Serviceのログを確認し、以下のような CHANGED と記述された行を
     見つけ確認します。
     [INFO:  21:33:13.553000] CHANGED : PROCESS AFFINITY : postmaster.exe : 
                                     new mask = 2, old mask = 3, process_id = 5428
     このログ記述は、postmaster.exe の CPUの割り当てを mask 3 から mask 2 に変更した
     という意味になります。
     mask <数字>形式のログの、<数字>の部分を二進数に直すとCPU番号が判断できます。
     たとえば、mask 1 は二進数で01、mask 2は二進数で10、mask 3は二進数で11です。
     そして二進数で01はCPU 0をあらわし、二進数で10はCPU1、二進数で11はCPU0とCPU1
     に割り当てていることをあらわします。つまり二進数で表現して右から1桁目がCPU0、
     2桁目がCPU1といった表現をしていることになり、その組み合わせで割り当てるCPU
     を表現しています。
- Q. postmaster.exe の変更がログに記述されているのに postgres.exe の変更がログに
     記述されていません。これはどういうことでしょう?
  A. postgres.exeはpostmaster.exeから起動されます。つまりpostgres.exeはpostmaster.exe
     の子プロセスになります。
     子プロセスは親プロセスの「プロセッサの関係の設定」(Process Affinity)を受け継ぐ
     為、Process Nurse Serviceを起動した後で PostgreSQLに関係するモジュールが起動され
     た場合には子プロセスの変更は必要ではなく、結果としてログに記述されないことになり
     ます。
■ 免責事項
本ソフトを利用して発生した如何なる問題に対しても責任は負いません。
ご利用者の責任で行っていただきますようお願いいたします。
■ 更新履歴
・ Ver. 0.9.1 : 2007-04-14
   - 優先度の設定を可能にした。
・ Ver. 0.9.0 : 2006-02-07
   - 初版リリース
以上