2021年5月24日月曜日

SAS 9.4のシステムが遅いときの点検項目

 SAS9.4のシステムが遅いときに、どこから点検していけば素早く問題を解決できるか?思いつくままに、場当たり的に探すのは効率が悪い。また、基盤の問題はSASからは検出できないことが多いため、OS、N/Wも含めた調査が必要である。切り分け、問題を調査するときに役立つ点検ポイントを列挙する。

ホスト名とIPアドレス

ホスト名とIPアドレスは正引き・逆引きできるか?意外と正しい値が得られずに、複数のNIC、経路を辿って遅いケースが多いと感じる。ping, nslookupなどのコマンドを使いサーバ間の名前、名前からIPを引けることを確認する。

エラー・アラートの点検

SAS Environment Managerから点検すれば早い。もしSAS Environment Managerが使えないならば、めぼしいログファイルを片端から目視でチェックする。

N/W経路による違い

サーバ上からのアクセスと、クライアントからのアクセスによる差を見ることで、N/Wの経路の問題かサーバの問題か切り分けできる。N/Wの帯域を故意に絞っている環境だと、いかんともしがたい。

ユーザによる違い

認証のサーバによる違いで遅いケースがある。ローカルのユーザ、LDAPのユーザと比べて差を確かめる。

構築時の基準値と比較

あなたがもし慎重であれば、構築時にログインの時間、空のレポートを表示する時間をとっているはず。そのときの時間と比べて、どれだけ遅くなったかを比較すると、構築時の問題か、構築後の問題か切り分けできる。

システムの負荷

CPU、メモリ、ディスク、N/Wについて、JP1とかTivoliから確認する。

これらの点検で、問題の8割ぐらいは捕捉できると感じる。これらの点検には0.5人日あればできる。

2021年3月10日水曜日

Junitのダウンロード

curlでWebサイト等のファイルをダウンロードする方法。たまにしか使わないので忘れがち、メモしておきます。リモートで働いていると、ローカルのPCを経由していると何かと遅いから

curl -L https://sourceforge.net/projects/junit/files/junit/4.8.1/junit-4.8.1.jar/download > junit-4.8.1.jar

2021年2月10日水曜日

Metadataバックアップのステータスを取得するサンプル

運用ネタです。メタデータバックアップの履歴を参照して、最後のバックアップが成功したかどうかステータスを確認する方法をメモしておきます。xmllintは読みやすく整形するときにしか使っていませんでしたが、特定のタグを抽出するときに便利ですね。たまにしか使わないので指定の仕方を忘れるので、ここにメモします。
echo 'cat /MetadataServerBackupManifest/Backups/Backup[last()]/@*' | \
 xmllint --shell Lev1/SASMeta/MetadataServer/Backups/MetadataServerBackupHistory.xml | \
 grep =
実行すると以下のような結果が得られます。
 Status="Successful"
 StartingUserID="META:Scheduler"
 StartDateTime="2021-02-10T01:00:00+09:00"
 Name="2021-02-10T01_00_00+09_00"
 Directory="Backups/2021-02-10T01_00_00+09_00"
 Comment=""
 Reorg="N"
 Size="539963257"
 LastVerifyDateTime="2021-02-10T18:42:58+09:00"
 LastVerifyStatus="Successful"

2021年1月17日日曜日

タイムスタンプの文字列生成

よく使うけど、すぐに忘れるタイムスタンプの文字列 

%let dt=%sysfunc(putn(%sysfunc(datetime()), E8601DT20.));

2021-01-17T20:35:17


2021年1月8日金曜日

メタデータオブジェクトの検索例

 SAS9でメタデータサーバの情報を探し出して、リストを作ることは稀にあります。たまにしかやらないから、どんな検索式を与えるか忘れてしまいます。備忘としていくつか例を残してい置きます。メタデータのAPIは、情報を1個ずつとると遅いのでできれば検索式で絞り込んで少ない回数で取得した方が良いです。

配置済みのジョブの検索
JFJob?@id contains '.' and @PublicType = 'DeployedJob'

実行キューの名前からジョブフローを検索
omsobj:JFJob?JFjob[@id contains '.' ][Properties/Property[@DefaultValue='normal' and @Name='QUEUE']

トリガーの条件を設定している配置済みフローを検索
omsobj:JFJob?JFjob[@PublicType = 'DeployedFlow'][Steps/SyncStep/TriggeringEvents/Event]]

配置済みジョブフローのオブジェ口IDを指定してかつ、作成者を特定する検索式
omsobj:ResponsibleParty?ResponsibleParty[@Role='Created By'][Objects/JFJob[@id='A5MGMPLF.BZ001J44']]

プロパティの名前からメタデータオブジェクトを検索する例
omsobj:Property?@Name='SCHEDULINGDETAILS'

テーブルの名前をからメタデータオブジェクトを検索する例
PhysicalTable?@id contains '.' and @Name eq 'HMEQ'

2020年10月22日木曜日

ベッド横のスリムな照明+棚

ベッドの横にまぶしすぎない照明が欲しいと思い、東急ハンズで売っている木材で照明を組み込んだ小さな棚を作った。照明はセンサー付きのLEDで手をかざしてON/OFFできる。棚の部分には携帯電話、Kindleを置いて充電できるようにした。ほぼ直線だけで構成されているので簡単なはず。だがサイズ感を合わせたり、使い勝手を考慮するのはかなり手間がかかった。どこかに図面をおいとこうか思案中です。

2020年9月19日土曜日

SAS9のプロセスから環境変数の設定を生成

何かのスクリプトを使うときに億劫に感じるのが設定です。で考えたのが動いているプロセスから主要なプロダクトのディレクトリを探す方法です。
#!/bin/sh

function variable() {
    TEMPLSIT=`mktemp --tmpdir=/var/tmp XXX.sh`

    while read var cmd depth
    do
        ps --no-headers --format cmd -C $cmd | \
        awk -vcmd=$cmd '{ for(i = 1; i <= NF; i++) { if (index($i, cmd) > 0) { print $i; exit} } }' | \
        awk -vd=$depth '{ n = split($1, a, "/"); for (i = 2; i < (n + d); i++) { printf("/%s", a[i]) } print ""; }' | \
        awk -vvar=$var '{ printf("export %s=%s\n", var, $1 ) }'
    done << _EOF_
SAS_HOME   sasauth           -4
SAS_CONFIG MetadataServer.sh -3
LSF_HOME   mbatchd           -3
PM_HOME    jfd               -3
RTM_HOME   lsfpollerd        -2
GMS_HOME   gabd              -1
_EOF_

    rm -f $TEMPLSIT
}

variable
実行すると環境変数の定義を生成します。
[root@dwtcjp conf]# sh variable.sh
export SAS_HOME=/SAS/SAS_HOME
export SAS_CONFIG=/SAS/SAS_CONFIG
export LSF_HOME=/SAS/LSF_HOME
export PM_HOME=/SAS/PM_HOME
export RTM_HOME=/SAS/RTM_HOME
export GMS_HOME=/SAS/LSF_HOME/gms