メインフレームTips ~RMFレポートをXML形式でも取ってみた~

RMF,xml,z/OS

こんにちは、システム基盤サービス部の田上です。

メインフレームTips第2弾です。(前回の記事はこちら)

今回はタイトルにある通り、RMFレポート(Postprocessor)についての記事を書こうと思います。過去のCPUやディスクI/Oといった性能情報を見たり集計したりするときに使うものですが、同じ情報を取得するのにも出力の仕方にいくつかの種類があります。

最近ある項目について過去の使用率グラフを作る必要があり、いつものように間隔レポートを取得してそれを加工しようとしたのですが、以下のメッセージが出力されレポートが取得できませんでした。(マニュアルをちゃんと読んでからやりなさいという話はあります)

ERB479I PPS: FOR TEXT REPORTING, PCIE OPTION IS IGNORED.

メッセージを調べてみると「指定したREPORTS制御ステートメントのオプションでは、XML出力フォーマットのみがサポートされます。」とのこと。
PCIEという項目はXML形式でしか取れないんだぁ・・・ということで、とりあえずXML形式で取得してみたわけなのですが、その際に付随していろいろと調べてみたので、z/OSを離れることが多い自分への覚書の意味も込めてRMFレポートの取り方をまとめておこうと思った次第です。

RMFレポート(Postprocessor)の種類

RMFレポートはざっくり分類すると3種類ほどあります。
マニュアルには「例外レポート」というのもありますが、私の使用目的には一致しなかったので今回は除外します。

  • 要約レポート
  • 間隔レポート(説明は省略しますがマニュアルの記載では「期間レポート」もあります)
  • 概要レポート

このうち、間隔レポートと概要レポートはテキスト形式の出力とXML形式の出力があります。
取得する項目によって先述のようにXML形式でしか取れないものや、逆にテキスト形式でしか取れないものもありますが、上記3種類のレポートと、テキスト形式/XML形式それぞれの取り方と実際の出力を紹介していこうと思います。

なお、今回はレポートを取得するのに必要となるデータの取得に関する設定やSMFタイプの説明は割愛させていただきます。

要約レポート

最初は要約レポートです。
JCLはこんな感じです。SYSOUTはなくても大丈夫ですのでお好みで指定しましょう。

//A206005J JOB CLASS=A,MSGCLASS=H,MSGLEVEL=(1,1),NOTIFY=&SYSUID
//RMFREP   EXEC PGM=ERBRMFPP
//SYSPRINT DD   SYSOUT=*
//MFPMSGDS DD   SYSOUT=*
//MFPINPUT DD   DISP=SHR,DSN=TARKU.SMF.RECORD.G1903V00
//SYSIN    DD   *
  SUMMARY(INT)
  SYSOUT(H)
/*

出力はこうなります。
グラフを作りたい項目がここに含まれていればこの出力をWindowsに持ってきてエクセルで区切り位置を決めてあげればほぼできあがりですね。
※この後のレポートも含め出力サンプルは左上の1ページのみとさせていただきます。

********************************* TOP OF DATA **********************************
                                               R M F   S U M M A R Y   R E P O R
                                                                                
            z/OS  V2R3               SYSTEM ID xxxx             START 06/24/2021
                                     RPT VERSION V2R3 RMF       END   06/25/2021
                                                                                
NUMBER OF INTERVALS 32                                                          
DATE   TIME     INT   CPU   DASD  DASD   JOB   JOB   TSO   TSO   STC   STC  ASCH
MM/DD HH.MM.SS MM.SS  BUSY  RESP  RATE   MAX   AVE   MAX   AVE   MAX   AVE   MAX
06/24 23.30.00 30.00   7.5   0.0   0.0     1     1     0     0   102   101     0
06/25 00.00.00 30.00   7.7   0.0   0.0     1     1     0     0   102   101     0
06/25 00.30.00 29.59   7.3   0.0   0.0     1     1     0     0   101   101     0
06/25 01.00.00 29.59   7.3   0.0   0.0     1     1     0     0   102   101     0
06/25 01.30.00 30.00   7.2   0.0   0.0     1     1     0     0   101   101     0
06/25 02.00.00 30.00   7.2   0.0   0.0     1     1     0     0   101   101     0
06/25 02.30.00 30.00   7.1   0.0   0.0     1     1     0     0   101   101     0
06/25 03.00.00 30.00   7.3   0.0   0.0     1     1     0     0   101   101     0
06/25 03.30.00 29.59   7.1   0.0   0.0     1     1     0     0   101   101     0
06/25 04.00.00 29.59   7.1   0.0   0.0     1     1     0     0   102   101     0
06/25 04.30.00 30.00   7.2   0.0   0.0     1     1     0     0   101   101     0

間隔レポート(テキスト形式)

JCLはこんな感じです。
今回はテキスト形式もXML形式も取れる項目を選んで、REPORTS(CPU)を指定しましたが、取得したい項目に合わせて"CPU"の部分を変更します。
PPRPTS DD は出力を1つのDDにまとめたい場合に指定します。
指定しない場合1レコード毎(時間間隔の情報毎)に1DDで出力されます。

//A206005J JOB CLASS=A,MSGCLASS=H,MSGLEVEL=(1,1),NOTIFY=&SYSUID
//RMFREP   EXEC PGM=ERBRMFPP
//SYSPRINT DD   SYSOUT=*
//MFPMSGDS DD   SYSOUT=*
//MFPINPUT DD   DISP=SHR,DSN=TARKU.SMF.RECORD.G1903V00
//PPRPTS   DD   SYSOUT=*
//SYSIN    DD   *
  NOSUMMARY
  REPORTS(CPU)
  SYSOUT(H)
/*

間隔レポートのテキスト形式での出力はこんな感じです。
私は要約レポートに必要な項目がない場合は、こんな感じのレポートから必要な情報を切り出すプログラムを書いてグラフ化をしていました。

********************************* TOP OF DATA **********************************
                                                       C P U  A C T I V I T Y   
                                                                                
            z/OS V2R3                SYSTEM ID xxxx             DATE 06/24/2021 
                                     RPT VERSION V2R3 RMF       TIME 23.30.00   
CPU        1090   CPC CAPACITY   N/A        SEQUENCE CODE 0000000000001229      
MODEL        6    CHANGE REASON=N/A         HIPERDISPATCH=YES                   
H/W MODEL  L03                                                                  
---CPU---    ---------------- TIME % ----------------     LOG PROC      --I/O IN
NUM  TYPE    ONLINE    LPAR BUSY    MVS BUSY   PARKED     SHARE %       RATE    
 0    CP     100.00     8.77         6.18        0.00     -----         17.60   
 1    CP     100.00     7.01         4.65        0.00     -----         17.31   
 2    CP     100.00     6.63         4.29        0.00     -----         19.07   
TOTAL/AVERAGE           7.47         5.04                 -----         53.98   
                                                                                
SYSTEM ADDRESS SPACE AND WORK UNIT ANALYSIS                                     
  ---------NUMBER OF ADDRESS SPACES---------     -----------------------DISTRIBU
  QUEUE TYPES          MIN      MAX      AVG      NUMBER OF              0    10
                                                  WORK UNITS     (%)     |....|.
  IN                    76       81     77.8                                    

間隔レポート(XML形式)

記事執筆時点で、XML形式でしか取得できない項目(REPORTS(xxx)に指定する項目)、逆にXML形式では取得できない項目は以下です。

XML形式のみテキスト形式のみ
PCIEDOMINO
SCMHTTP
SDELAYTRACE
取得形式(z/OS V2R4マニュアルより)

JCLはこうなります。
XPRPTS DDを指定することで出力がXML形式(のみ)になります。

//A206005J JOB CLASS=A,MSGCLASS=H,MSGLEVEL=(1,1),NOTIFY=&SYSUID
//RMFREP   EXEC PGM=ERBRMFPP
//SYSPRINT DD   SYSOUT=*
//MFPMSGDS DD   SYSOUT=*
//MFPINPUT DD   DISP=SHR,DSN=TARKU.SMF.RECORD.G1903V00
//XPRPTS   DD   SYSOUT=*
//SYSIN    DD   *
  NOSUMMARY
  REPORTS(CPU)
  SYSOUT(H)
/*

出力はこうなります。
この出力を得て、さてどうしたものかと悩みましたが、マニュアルによるとWindows上のツールとして「RMF Postprocessor XML Toolkit」なるものがあるそうなので、とりあえずこの出力をcpurep.xmlという名前でWindows上に持ってきておいてツールを試してみました。
※SPOOLから書き出す場合、1桁目に入るページ区切りは削除してください。

********************************* TOP OF DATA **********************************
<?xml version="1.0" encoding="UTF-8"?>                                          
<?xml-stylesheet type="text/xsl" href="include/ddsml-pp.xsl"?>                  
<!--    z/OS RMF Postprocessor    -->                                           
<ddsml>                                                                         
<postprocessor><metric id="CPU"><description>CPU Activity Report</description><t
</resource><time-data><display-start locale="en-us">06/24/2021-23.30.00</display
</time-data>                                                                    
<segment id="1"><name>CPU Activity</name>                                       
<part id="2">                                                                   
<var-list id="3"><var><name>CPU</name><value>1090</value></var><var><name>Model<
<var><name>HiperDispatch</name><value>YES</value></var><var><name>CPC Capacity</
</var-list>                                                                     
<table id="4">                                                                  
<column-headers><col type="T">CPU Number</col><col type="T">CPU Type</col><col t
<col type="T">HiperDispatch Priority</col><col type="N">I/O Interrupts Rate</col
<row refno="1"><col>0</col><col>CP</col><col>100.00</col><col>8.77</col><col>6.1
<row refno="2"><col>1</col><col>CP</col><col>100.00</col><col>7.01</col><col>4.6
<row refno="3"><col>2</col><col>CP</col><col>100.00</col><col>6.63</col><col>4.2
<row refno="4" type="SUM"><col>TOTAL/AVERAGE</col><col>CP</col><col/><col>7.47</

RMF Postprocessor XML Toolkit

IBMが提供しているツールです。
z/OS上の「SYS1.SERBPWSV(ERBXMLTK)」がインストーラーになっているので、これを「erbxmltk.msi」という名前でWindows上に持ってきてインストールします。
インストール中にインストール先の指定箇所があるので、インストール先フォルダを覚えておきます。

RMF Postprocessor XML Toolkit
インストール先の指定

インストールが終わったらインストール先のフォルダに先ほど取得したXML形式のレポートを配置して、XMLファイルを開きます。

RMF Postprocessor XML ToolkitにXMLファイルを入れる
ファイルの配置

私の環境の場合Internet Explorerで開くことができましたが、警告メッセージが表示されるため「ブロックされているコンテンツを許可」する必要がありました。

RMF Postprocessor XML Toolkit警告メッセージ
Internet Explorerの警告メッセージ

これで以下のように取得した情報を表示することができました。

RMF Postprocessor XML Toolkit間隔レポート表示
XML Report

さて、ようやく取得した情報が見やすい形(?)になったのですが、これでは特定の項目のグラフを作成するという私の目的には使えませんでした。

XML形式でしか出力されない項目のグラフ化

上記で紹介した項目(CPU)はテキスト形式もXML形式も取れるので、いつも通りテキスト形式で出力して情報を抽出すればよいのですが、先述の通り私が取りたかった項目(PCIE)はXML形式でしか出力できない項目でした。

次項で紹介しますが、場合によっては「概要レポート」を使えば問題は解決します。
ただ、この時のお客様の環境は概要レポートを使えないという事情があり、それ以外の手法を考えなくてはいけませんでした。私はたまたまXMLを扱ったことがあったので、VBAでDOMを使いXMLを読むプログラムを書くことで対応しました。

それはそれでいいとして、ふと最近アセンブラを勉強したという5年目の後輩に話をしたら「勉強のためにアセンブラでやってみます!」とのことで、アセンブラのマッピングマクロを使って、必要な情報を奇麗に抜いてくれました!

IBMの意図としては私のやり方がある意味正しい気がしますが、ホスト技術者としては後輩がやった手法のほうがカッコイイですよね・・・。こういった若手が育っているのはうれしいなぁと感じる一幕でした。後輩がアセンブラを忘れないようにどんどんアセンブラのプログラムを書かせようと思います。

概要レポート(テキスト形式&XML形式)

最後に概要レポートです。
存在は知っていたのですが、使い方を調べなくても事足りていたので今までは使っていませんでした。今回は諸事情で別の手段を取りましたが、これは便利だなぁと思ったので紹介します。
ただ取得できる項目はある程度限定されます。

概要レポートで取得できる項目

大枠だけ紹介しますので、細かい項目はマニュアルを参照してみてください。

マニュアルの記載箇所は以下です。
外部リンクを以下に貼りますが、マニュアルやIBMサイトの編成が変わるかもしれないことはご承知おきください。

z/OS RMF ユーザーズ・ガイド -> レポート作成の参照事項 -> 後処理プログラムによる長期的レポートの作成 ->概要条件と例外条件

大項目SMFレコード・タイプ
CPU 活動70-1
暗号ハードウェア活動70-2
ページング活動71
ワークロード活動72-3
チャネル・パス活動73
装置活動74-1
カップリング・ファシリティー活動74-4
キャッシュ活動74-5
Ficon ディレクター活動74-7
エンタープライズ・ディスク・システム統計74-8
PCIE 機能活動74-9
ページ・データ・セット活動75
エンキュー活動77
仮想記憶域活動78-2
入出力キューイング活動78-3
概要条件と例外条件(z/OS V2R4マニュアルより)

マニュアルのリンクをたどると、ほしい値をJCLで指定する場合に何と書けばいいかが書いてあります。一部だけ転載するとこんな感じの記載です。

条件条件名修飾子
汎用プロセッサー使用中率CPUBSYcoreid
区画の汎用プロセッサーに対する
論理プロセッサー使用中パーセント
LBUSYLlpar
CPU活動に関する条件(z/OS V2R4マニュアルより一部抜粋)

上記の条件で概要レポートを作成するJCLはこうなります。
OVWのカッコの直後にきている"CPU0″などはレポート中のヘッダーになります。
個別にJCLは記載しませんが、XPOVWRPT DDを追加すればテキスト形式が出力されなくなり、XML形式の概要レポートを取得できます。

//A206005J JOB CLASS=A,MSGCLASS=H,MSGLEVEL=(1,1),NOTIFY=&SYSUID
//RMFREP   EXEC PGM=ERBRMFPP
//SYSPRINT DD   SYSOUT=*
//MFPMSGDS DD   SYSOUT=*
//MFPINPUT DD   DISP=SHR,DSN=TARKU.SMF.RECORD.G1903V00
//*XPOVWRPT DD   SYSOUT=*
//SYSIN    DD   *
  NOSUMMARY
  OVW(CPU0(CPUBSY(0)))
  OVW(CPU1(CPUBSY(1)))
  OVW(CPU2(CPUBSY(2)))
  OVW(AVE(LBUSYL(RDTUSER)))
  SYSOUT(H)
/*

テキスト形式の出力はこうなります。

********************************* TOP OF DATA **********************************
                                              R M F   O V E R V I E W   R E P O

            z/OS  V2R3               SYSTEM ID S0W1             START 06/24/2021
                                     RPT VERSION V2R3 RMF       END   06/25/2021

NUMBER OF INTERVALS 48            TOTAL LENGTH OF INTERVALS 24.00.00
DATE    TIME     INT          CPU0      CPU1      CPU2      AVE
MM/DD HH.MM.SS HH.MM.SS
06/24 23.30.00 00.30.00        8.8       7.0       6.6       7.5
06/25 00.00.00 00.30.00        9.1       7.1       6.7       7.7
06/25 00.30.00 00.29.59        8.7       6.9       6.4       7.3
06/25 01.00.00 00.29.59        8.7       6.9       6.5       7.3
06/25 01.30.00 00.30.00        8.6       6.8       6.3       7.2
06/25 02.00.00 00.30.00        8.5       6.7       6.3       7.2
06/25 02.30.00 00.30.00        8.5       6.7       6.3       7.1
06/25 03.00.00 00.30.00        8.7       6.8       6.4       7.3
06/25 03.30.00 00.29.59        8.5       6.6       6.2       7.1
06/25 04.00.00 00.29.59        8.4       6.7       6.2       7.1
06/25 04.30.00 00.30.00        8.6       6.8       6.4       7.3

XML形式で取得した場合の出力はこんな感じです。

********************************* TOP OF DATA **********************************
<?xml version="1.0" encoding="UTF-8"?>                                          
<?xml-stylesheet type="text/xsl" href="include/ddsml-pp.xsl"?>                  
<!--    z/OS RMF Postprocessor    -->                                           
<ddsml>                                                                         
<postprocessor><metric id="OVW"><description>RMF Overview Report</description><t
</resource><time-data><display-start locale="en-us">06/24/2021-23.30.00</display
</time-data>                                                                    
<segment id="1"><name>Overview Report</name>                                    
<part id="2">                                                                   
<var-list id="3"><var><name>Number of Intervals</name><value>48</value></var><va
</var-list>                                                                     
<table id="4">                                                                  
<column-headers><col type="T">Date (mm/dd)</col><col type="T">Time (hh.mm.ss)</c
<col condition="CPUBSY" qualifier="02" type="N">CPU2</col><col condition="LBUSYL
<row refno="1"><col>06/24</col><col>23.30.00</col><col>00.30.00</col><col>8.8</c
<row refno="2"><col>06/25</col><col>00.00.00</col><col>00.30.00</col><col>9.1</c
<row refno="3"><col>06/25</col><col>00.30.00</col><col>00.29.59</col><col>8.7</c
<row refno="4"><col>06/25</col><col>01.00.00</col><col>00.29.59</col><col>8.7</c
<row refno="5"><col>06/25</col><col>01.30.00</col><col>00.30.00</col><col>8.6</c

概要レポートのXML形式ファイルも間隔レポート同様に「RMF Postprocessor XML Toolkit」で開くことができます。一応載せておくとこんな感じに表示されました。
これはこれでいいですね。そのままExcelに貼り付けて使えそうです。

RMF Postprocessor XML Toolkit概要レポート表示
XML概要レポート

あと関連して RMF Spreadsheet Reporter なるものがあるのですが、今回の私の用途では微妙に使えなかったので、割愛させていただきます。

まとめ

というわけで、特定の性能情報のグラフを作らなきゃとなったらこんな選択肢があるのかなと思います。

優先順位(私なり)種別情報取得難易度加工難易度備考
要約レポートほしい項目が含まれる場合のみ
概要レポートほしい項目が取れる場合のみ
間隔レポート取れない項目はない(はず)
アセンブラでマッピングマクロどやぁ!って言える
グラフ作成時のレポート優先度

概要レポートは自分が欲しい項目を指定する方法を特定するのにちょっと調査が必要なので取得難易度を中としてみました。参考にしてみていただければと思います。

最近思うこと

今回はメインフレーム技術者としてXML形式のレポートに悩まされましたが、オープン系の技術者にとってはきっと扱いやすい形式ですし、オープン系と合わせて統合的に監視するようなことを想定して作られていると感じました。
XML形式のレポート取得についても、取得する側が意識してJCLを書かなくてもよい仕組みも用意されているみたいで、オープン系技術の取り込みや「メインフレームの使い方がわからない」というイメージの払拭が活発なように思います。

RMFに限らず、WebやWindowsアプリと連携してメインフレームを扱えるようにする仕組みがどんどん追加されてきています。
メインフレームを使っている人たちは「変えなくていい」というかむしろ「変えたくない」が基本だと思っていたのですが、実際にWindows上のアプリケーションからJOBを実行するような仕組みを作ったというプロジェクトもあるようで、時代は動いてきているのだなぁと感じました。

近年追加されていく機能を活用することで、メインフレーム特有の知識がなくても扱いやすいようになっていくことは良い動きなのではないかと思います。
ただその機能を使えるようにしたり、裏で何か問題が起きた時の対応をしたりするには従来のメインフレーム技術が必要ですよね。
われわれメインフレーム技術者に今後求められるのはこういった仕組みの作りこみであると考えた場合、昔ながらのメインフレーム技術とメインフレームが実装していくオープン系よりな技術両方の習得が必要なのかなと思ったり思わなかったりする今日この頃でした。

  • 株式会社アークシステムの予約・来訪管理システム BRoomHubs
  • 低コスト・短納期で提供するまるごとおまかせZabbix