Hatena::ブログ(Diary)

ablog このページをアンテナに追加 RSSフィード

2017-09-29

Python スクリプトのデバッグ方法

Python 標準の pdbデバッグする方法をメモ。

$ python -m pdb foo.py
(Pdb) b 76 # ブレイクポイントを設定する
(Pdb) c # ブレイクポイントまで実行する

pudb など標準デバッガ以外にもいろいろあるらしい。


参考

2017-09-23

AWRレポートを CSV に変換する手順

AWRレポートを CSV に変換する手順。CSVEXCEL のピボットグラフなどを使って分析すると便利です。


$ git clone https://github.com/yasushiyy/awr2csv.git
$ cd awrrep
  • AWRレポートを CSV に変換する。
$ python ../awrhtml2csv.py *.html
  • 変換後のファイルを確認する。
$ ls -1 *.csv
events_background.csv
events_foreground.csv
events_topn.csv
inst_efficiency.csv
load_profile.csv
parameters.csv
seg_logical.csv
seg_phys_reads.csv
seg_phys_writes.csv
seg_unoptimized.csv
sql_cpu.csv
sql_elapsed.csv
sql_executions.csv
sql_gets.csv
sql_parses.csv
sql_reads.csv
sql_unoptimized.csv
sql_user_io.csv
sql_version.csv
time_model.csv

前提

  • NLS_LANG は American_America.<CHARACTERSET> で AWR レポートを出力する。

Tips

NLS_LANG が American_America... で出力されておらずAWRレポートの日付が "31-9月 -15" のようになっていて以下のエラーになる場合は、

$ python ../../awrhtml2csv.py *.html 
Processing awrrpt_1_41050_41051.html...
Traceback (most recent call last):
  File "../../awrhtml2csv.py", line 135, in <module>
    output = parse(filelist)
  File "../../awrhtml2csv.py", line 97, in parse
    st = datetime.strptime(snap.text, '%d-%b-%y %H:%M:%S')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u6708' in position 4: ordinal not in range(128)

月を英字に変換する。

$ perl -i.org -pe 's/8 /Aug/g;s/9 /Sep/g' *.html

参考


追記(2017/09/29):

$ python ../../awrhtml2csv.py *.html

xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 9192, column 13

とエラーになったので、調べたら、AWRレポートの末尾に「9317行が選択されました。」と入ってるのが原因だった。

End of Report
</body></html>

9317行が選択されました。

Perl ワンライナーで除去したらエラーが出なくなった。

$ perl -i.org -pe 's/.*行が選択されました。//g' *.html

2017-09-10

Oracle Database の PL/SQL を MySQL にどう移行するか

はじめに

Oracle Database の PL/SQL の MySQL への移行方法を説明します(MySQL 5.0 からストアドプロシージャに対応している)。

AWS Schema Conversion Tool (SCT) という GUI デスクトップアプリケーション(Windwos/Mac OS X/Linux版)をインストールし、移行元の Oracle Database に接続して自動的にPL/SQL を MySQL のルーチンに変換することができます。

SCT による変換方法は Oracle Database を Amazon Aurora に移行する方法 | Amazon Web Services ブログ をご覧ください。


移行先として適切なサービスを選ぶ

本題に入る前に Oracle Database からの移行先として MySQL、PostgreSQL、Redshift のどれが適切か説明します。

経験上、エンタープライズで Oracle Database を使っている場合は PostgreSQL が向いているケースが多いです。アクセスブロック数が少ないSQLのみで結合もネステッドループのみで問題ないシステムは MySQL が向いています。Exadata で OLTP(トランザクション) とOLAP(分析)を共存させている場合は PostgreSQL で OLTP、Redshift で OLAP(分析)という使い分けをオススメします。

MySQL が向いているケース
  • OLTP でシンプルでアクセスブロック数が少ないSQLが大半。
  • 結合はネステッドループのみで問題ない程度の軽い SQL のみ。
  • さらに結合も必要なく、キーのみにでアクセスするケースでは DynamoDB が向いています。
PostgreSQL が向いているケース
  • OLTP でも結合対象行数を絞れず HASH JOIN が必要な重いSQLが多い。
  • エンタープライズで Oracle Database を使っているシステムはこのケースが一番多い印象。
Redshift が向いているケース
  • Exadata で集計処理を投げていて Smart Scan を享受しているようなケースでは Redshift が向いている。
  • Exadata で OTLP(トランザクション処理)と分析の両方の用途で使っている場合は、OLTP は RDS で、分析は Redshift というように使い分けるアーキテクチャにする。

Oracle Database と MySQL のプロシージャ・ファンクションの構文の違い

SCT でプロシージャを変換した例

aws-database-migration-samples/generate_tickets.pls at master ? awslabs/aws-database-migration-samples ? GitHub を変換した例です。

  • Oracle Database(変換前)
procedure generate_tickets(P_event_id IN NUMBER) as
  CURSOR event_cur(P_ID NUMBER) IS
  SELECT id,location_id
  FROM   sporting_event
  WHERE  ID = P_ID;

  standard_price NUMBER(6,2);

BEGIN
  standard_price := DBMS_RANDOM.VALUE(30,50);

  FOR event_rec IN event_cur(P_event_id) LOOP
    INSERT /*+ APPEND */ INTO sporting_event_ticket(id,sporting_event_id,sport_location_id,seat_level,seat_section,seat_row,seat,ticket_price)
    SELECT sporting_event_ticket_seq.nextval
      ,sporting_event.id
      ,seat.sport_location_id
      ,seat.seat_level
      ,seat.seat_section
      ,seat.seat_row
      ,seat.seat
      ,(CASE
         WHEN seat.seat_type = 'luxury' THEN 3*standard_price
         WHEN seat.seat_type = 'premium' THEN 2*standard_price
         WHEN seat.seat_type = 'standard' THEN standard_price
         WHEN seat.seat_type = 'sub-standard' THEN 0.8*standard_price
         WHEN seat.seat_type = 'obstructed' THEN 0.5*standard_price
         WHEN seat.seat_type = 'standing' THEN 0.5*standard_price
      END ) ticket_price
    FROM sporting_event
       ,seat
    WHERE sporting_event.location_id = seat.sport_location_id
    AND   sporting_event.id = event_rec.id;
  END LOOP;
END;
  • MySQL(変換後)
    • コメントが入っている箇所は Oracle Database の構文に相当するものが MySQL になかった箇所で、この部分は自分でワークアラウンドを記述する必要があります。
CREATE PROCEDURE DMS_SAMPLE.GENERATE_TICKETS(IN par_P_EVENT_ID DOUBLE)
BEGIN
    DECLARE var$ID DOUBLE;
    DECLARE var$LOCATION_ID DOUBLE;
    DECLARE par_P_ID DOUBLE;
    DECLARE var_standard_price DECIMAL (6, 2);
    DECLARE done INT DEFAULT FALSE;
    DECLARE event_cur CURSOR FOR SELECT
        ID,a
        FROM SPORTING_EVENT
        WHERE ID = par_P_ID;
    DECLARE CONTINUE HANDLER FOR NOT FOUND
        SET done := TRUE
    /*
    [340 - Severity CRITICAL - MySQL doesn't support the SYS.DBMS_RANDOM.VALUE(NUMBER,NUMBER) function. Create a user-defined function.]
    standard_price := DBMS_RANDOM.VALUE(30,50)
    */;
    SET par_P_ID := par_P_event_id;
    OPEN event_cur;

    read_label:
    LOOP
        FETCH event_cur INTO var$ID, var$LOCATION_ID;

        IF done THEN
            LEAVE read_label;
        END IF;
        INSERT INTO SPORTING_EVENT_TICKET
            (ID, SPORTING_EVENT_ID, SPORT_LOCATION_ID, SEAT_LEVEL, SEAT_SECTION, SEAT_ROW, SEAT, TICKET_PRICE)
            SELECT
                aws_oracle_ext.sequence$nextval('SPORTING_EVENT_TICKET_SEQ', 'DMS_SAMPLE'), SPORTING_EVENT.ID, SEAT.SPORT_LOCATION_ID, SEAT.SEAT_LEVEL, SEAT.SEAT_SECTION, SEAT.SEAT_ROW, SEAT.SEAT, (CASE WHEN SEAT.SEAT_TYPE = 'luxury' THEN 3 * var_standard_price WHEN SEAT.SEAT_TYPE = 'premium' THEN 2 * var_standard_price WHEN SEAT.SEAT_TYPE = 'standard' THEN var_standard_price WHEN SEAT.SEAT_TYPE = 'sub-standard' THEN 0.8 * var_standard_price WHEN SEAT.SEAT_TYPE = 'obstructed' THEN 0.5 * var_standard_price WHEN SEAT.SEAT_TYPE = 'standing' THEN 0.5 * var_standard_price END) AS ticket_price
                FROM SPORTING_EVENT, SEAT
                WHERE SPORTING_EVENT.LOCATION_ID = SEAT.SPORT_LOCATION_ID AND SPORTING_EVENT.ID = var$ID;
    END LOOP;
    CLOSE event_cur;
END;


比較

CREATE PROCEDURE Statement

  • Converting stored procedures from Oracle to MySQL:
#OracleMySQL
1CREATE OR REPLACE PROCEDURE DROP PROCEDURE IF EXISTS and CREATE PROCEDURE
2param IN / OUT / IN OUT datatype Parameter definition IN / OUT / INOUT param datatype(length)
3IS / AS Removed
4Variable declaration is before BEGIN Variable declaration is after BEGIN
5END sp_name END

CREATE FUNCTION Statement

  • Converting user-defined functions from Oracle to MySQL:
#Oracle MySQL
1CREATE OR REPLACE FUNCTION DROP FUNCTION IF EXISTS and CREATE FUNCTION
2param IN / OUT / IN OUT datatype Parameter definition param datatype(length)
3RETURN datatype Return value RETURNS datatype(length)
4IS / AS Removed
5Variable declaration is before BEGIN Variable declaration is after BEGIN
6END func_name END

PL/SQL Statements

  • Converting PL/SQL statements and clauses from Oracle to MySQL:
#OracleMySQL
1variable datatype := value Variable declaration DECLARE variable datatype DEFAULT value
2variable := value Assignment statement SET variable = value
3CURSOR cur (params) IS SELECT Cursor declaration DECLARE cur CURSOR FOR SELECT
4Variable and cursor declarations can be mixed in any order Variable declarations must be before cursor and handlers
5FOR rec IN cursor LOOP Cursor loop OPEN cursor WHILE-FETCH-CLOSE
6IF THEN ELSIF ELSE END IF IF statement IF THEN ELSEIF ELSE END IF
7WHILE condition LOOP sql END LOOP A loop statement WHILE condition DO sql END WHILE
8EXIT WHEN condition Exit from a loop IF condition THEN LEAVE label END IF
  • EXCEPTION block:
#Oracle MySQL
1BEGIN stmts EXCEPTION … END Exception block structure BEGIN DECLARE HANDLER … stmts END
2WHEN DUP_VAL_ON_INDEX Duplicate key DECLARE EXIT HANDLER FOR SQLSTATE '23000'
3WHEN NO_DATA_FOUND No rows found DECLARE EXIT HANDLER FOR NOT FOUND
4WHEN OTHERS All exceptions DECLARE EXIT HANDLER FOR SQLEXCEPTION
http://www.sqlines.com/oracle-to-mysql#plsql-statements
  • パッケージ変数は MySQL ではセション変数(@)で代用できる。
  • 結果セットの返却は MySQL では SELECT 文を書くだけ。
  • %TYPE および %ROWTYPE データ型定義は MySQL にはない。

SCTを使った変換手順例

$ git clone https://github.com/awslabs/aws-database-migration-samples.git
$ sudo rpm -ivh oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
$ sudo rpm -ivh oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm
  • インストールされたファイルを確認する。
$ rpm -ql oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64
/usr/bin/sqlplus64
/usr/lib/oracle/12.2/client64/bin/sqlplus
/usr/lib/oracle/12.2/client64/lib/glogin.sql
/usr/lib/oracle/12.2/client64/lib/libsqlplus.so
/usr/lib/oracle/12.2/client64/lib/libsqlplusic.so
$ rpm -ql oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64
/usr/lib/oracle/12.2/client64/bin/adrci
/usr/lib/oracle/12.2/client64/bin/genezi
/usr/lib/oracle/12.2/client64/lib/libclntsh.so.12.1
/usr/lib/oracle/12.2/client64/lib/libclntshcore.so.12.1
/usr/lib/oracle/12.2/client64/lib/libipc1.so
/usr/lib/oracle/12.2/client64/lib/libmql1.so
/usr/lib/oracle/12.2/client64/lib/libnnz12.so
/usr/lib/oracle/12.2/client64/lib/libocci.so.12.1
/usr/lib/oracle/12.2/client64/lib/libociei.so
/usr/lib/oracle/12.2/client64/lib/libocijdbc12.so
/usr/lib/oracle/12.2/client64/lib/libons.so
/usr/lib/oracle/12.2/client64/lib/liboramysql12.so
/usr/lib/oracle/12.2/client64/lib/ojdbc8.jar
/usr/lib/oracle/12.2/client64/lib/xstreams.jar
  • 環境変数を設定する。
$ vi ~.bashrc
export PATH=$PATH:/usr/lib/oracle/12.2/client64/bin
export NLS_LANG=American_America.UTF8
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/oracle/12.2/client64/lib
  • git をインストールする。
$ sudo yum -y install git
$ git clone https://github.com/awslabs/aws-database-migration-samples.git
  • ソースの Oracle Database にスキーマとオブジェクトを作成する。
$ cd aws-database-migration-samples/oracle/sampledb/v1
$ sqlplus awsuser/******@******.******.ap-northeast-1.rds.amazonaws.com:1521/ORCL
SQL> install-rds.sql
  • SCT でソースとターゲットを指定して、変換する。

補足


参考

2017-08-11

Amazon Redshift からテーブル作成DDLを自動生成する

Amazon Redshift 自体にはクラスターに存在するテーブルなどのオブジェクトのDDLを生成する機能はないが、以下のスクリプトやツールで生成することができる。

つまり、Oracle Database の DataPump の CONTENT=METADATA_ONLYexp の rows=n ような機能はないが、DBMS_METADATA.GET_DDL 相当のことができるスクリプトやツールは存在する。

以下のツールでDDL文を生成できる*1


具体的な手順例は以下の通り。

SQL Workbench/J を使う

  • SQL Workbench/J で Redshift に接続する。
  • [Tools]-[Show Database Explorer] を選択する。
  • [Schema] を選択する。
  • 左ペインでテーブルを選択し、[Control]+クリックでショートカットメニューを表示する。
  • [Create DDL Script] を選択する。

f:id:yohei-a:20170812000948p:image:w640

f:id:yohei-a:20170812000944p:image:w360 f:id:yohei-a:20170812000937p:image:w640

25. SQL Workbench/J to generate DDL commands を見るとコマンドラインからでも同じことができそう。


Amazon Redshift Utilities のスクリプトを使う方法

$ git clone https://github.com/awslabs/amazon-redshift-utils.git
$ cd amazon-redshift-utils/src/AdminViews
  • Redshift クラスターに接続する
$ psql "host=******.******.ap-northeast-1.redshift.amazonaws.com user=master dbname=mydb port=5439"
Password:
psql (9.6.2, server 8.0.2)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: on)
Type "help" for help.
mydb=#
  • admin スキーマを作成する。
mydb=# CREATE SCHEMA admin;
CREATE SCHEMA
  • v_generate_tbl_ddl ビューを作成する。
mydb=# \i ./v_generate_tbl_ddl.sql
CREATE VIEW
  • pager を OFF にする。
mydb=# \pset pager
Pager usage is off.
  • DDL を生成する(pg_catalog スキーマの全てのテーブル)。
mydb=# select * from admin.v_generate_tbl_ddl where schemaname='pg_catalog' limit 30;
 schemaname |      tablename      |    seq    |                              ddl
------------+---------------------+-----------+---------------------------------------------------------------
 pg_catalog | padb_config_harvest |         0 | --DROP TABLE "pg_catalog"."padb_config_harvest";
 pg_catalog | padb_config_harvest |         2 | CREATE TABLE IF NOT EXISTS "pg_catalog"."padb_config_harvest"
 pg_catalog | padb_config_harvest |         5 | (
 pg_catalog | padb_config_harvest | 100000001 |         "name" CHAR(136) NOT NULL  ENCODE lzo
 pg_catalog | padb_config_harvest | 100000002 |         ,"harvest" INTEGER NOT NULL  ENCODE lzo
 pg_catalog | padb_config_harvest | 100000003 |         ,"archive" INTEGER NOT NULL  ENCODE lzo
 pg_catalog | padb_config_harvest | 100000004 |         ,"directory" CHAR(500) NOT NULL  ENCODE lzo
 pg_catalog | padb_config_harvest | 299999999 | )
 pg_catalog | padb_config_harvest | 300000001 | DISTSTYLE EVEN
 pg_catalog | padb_config_harvest | 600000000 | ;
 pg_catalog | pg_aggregate        |         0 | --DROP TABLE "pg_catalog"."pg_aggregate";
 pg_catalog | pg_aggregate        |         2 | CREATE TABLE IF NOT EXISTS "pg_catalog"."pg_aggregate"
 pg_catalog | pg_aggregate        |         5 | (
 pg_catalog | pg_aggregate        | 100000001 |         "aggfnoid" REGPROC NOT NULL
 pg_catalog | pg_aggregate        | 100000002 |         ,"aggtransfn" REGPROC NOT NULL
 pg_catalog | pg_aggregate        | 100000003 |         ,"aggfinalfn" REGPROC NOT NULL
 pg_catalog | pg_aggregate        | 100000004 |         ,"aggtranstype" OID NOT NULL
 pg_catalog | pg_aggregate        | 100000005 |         ,"agginitval" TEXT
 pg_catalog | pg_aggregate        | 299999999 | )
 pg_catalog | pg_aggregate        | 300000001 | DISTSTYLE EVEN
 pg_catalog | pg_aggregate        | 600000000 | ;
 pg_catalog | pg_am               |         0 | --DROP TABLE "pg_catalog"."pg_am";
 pg_catalog | pg_am               |         2 | CREATE TABLE IF NOT EXISTS "pg_catalog"."pg_am"
 pg_catalog | pg_am               |         5 | (
 pg_catalog | pg_am               | 100000001 |         "amname" NAME NOT NULL
 pg_catalog | pg_am               | 100000002 |         ,"amowner" INTEGER NOT NULL
 pg_catalog | pg_am               | 100000003 |         ,"amstrategies" SMALLINT NOT NULL
 pg_catalog | pg_am               | 100000004 |         ,"amsupport" SMALLINT NOT NULL
 pg_catalog | pg_am               | 100000005 |         ,"amorderstrategy" SMALLINT NOT NULL
 pg_catalog | pg_am               | 100000006 |         ,"amcanunique" BOOLEAN NOT NULL
(30 rows)
  • 出力先ファイル名を設定する。
mydb=# \o ddl.sql
  • DDL のみ生成する。
mydb=# select ddl from admin.v_generate_tbl_ddl where schemaname='pg_catalog';
  • 切断する。
mydb=# \q
  • 出力ファイルを確認する。
$ head -10 ddl.sql 
                                         ddl
--------------------------------------------------------------------------------------
 --DROP TABLE "pg_catalog"."padb_config_harvest";
 CREATE TABLE IF NOT EXISTS "pg_catalog"."padb_config_harvest"
 (
         "name" CHAR(136) NOT NULL  ENCODE lzo
         ,"harvest" INTEGER NOT NULL  ENCODE lzo
         ,"archive" INTEGER NOT NULL  ENCODE lzo
         ,"directory" CHAR(500) NOT NULL  ENCODE lzo
 )
$ tail -10 ddl.sql
 CREATE TABLE IF NOT EXISTS "pg_catalog"."systable_topology"
 (
         "hash" INTEGER NOT NULL  ENCODE lzo
         ,"slice" INTEGER NOT NULL  ENCODE lzo
         ,"mirror" INTEGER NOT NULL  ENCODE lzo
 )
 DISTSTYLE EVEN
 ;
(4815 rows)

Aginity Workbench for Amazon Redshift


参考

*1:以下は一例で他にもある

2017-07-30

macOS の標準パフォーマンス分析ツール

macOS の標準*1パフォーマンス分析ツールを Brendan Gregg のスライドでざっと調べてみた。


環境

  • macOS Sierra

ツール

Activity Monitor.app
  • [ウインドウ]-[アクティビティモニタ]、[CPU使用率]、[CPUの履歴]でウインドウの表示/非表示を切替える。

f:id:yohei-a:20170730172136p:image

  • アクティビティモニタでプロセスを選択して、[表示]-[プロセスの詳細を表示]

f:id:yohei-a:20170730173148p:image

  • アクティビティモニタでプロセスを選択して、[表示]-[プロセスのサンプルを収集]

f:id:yohei-a:20170730233523p:image

f:id:yohei-a:20170730233513p:image

uptime
$ uptime
17:38  up 1 day,  7:05, 1 user, load averages: 1.79 2.10 2.56
top
$ top -o cpu
Processes: 303 total, 2 running, 301 sleeping, 1697 threads                                                                                                                                         17:40:05
Load Avg: 2.40, 2.20, 2.54  CPU usage: 15.85% user, 7.31% sys, 76.82% idle  SharedLibs: 149M resident, 42M data, 74M linkedit. MemRegions: 59858 total, 6021M resident, 151M private, 3008M shared.
PhysMem: 16G used (2306M wired), 226M unused. VM: 823G vsize, 627M framework vsize, 72657(0) swapins, 95531(0) swapouts. Networks: packets: 767009/623M in, 679460/181M out.
Disks: 782083/24G read, 382735/9943M written.

PID    COMMAND      %CPU TIME     #TH   #WQ  #PORTS MEM    PURG   CMPRS  PGRP  PPID  STATE    BOOSTS          %CPU_ME %CPU_OTHRS UID        FAULTS   COW    MSGSENT   MSGRECV   SYSBSD    SYSMACH
12555  Microsoft Ou 25.2 21:33.78 43    31   15148+ 1481M+ 290M   0B     12555 1     sleeping *0[4038]        0.64662 0.00000    1037328352 2268449+ 10594  3311268+  1257213+  22280995+ 7447771+
14181  Google Chrom 12.8 01:54.42 16    1    148    363M+  0B     0B     1919  1919  sleeping *0[1]           0.00000 0.00000    1037328352 283212+  1601   225873+   15276+    641869+   2287322+
1051   jamfAgent    12.0 02:55.65 4     3    64     6068K  0B     0B     1051  1     sleeping *0[1]           0.21362 0.00000    0          6670     218    55684+    31971+    603555+   150024+
0      kernel_task  7.0  17:12.96 129/4 0    2      1152M+ 0B     0B     0     0     running   0[0]           0.00000 0.00000    0          95289    0      54129734+ 51758498+ 0         0
13876  iTerm2       4.7  00:27.87 11    5    283    74M+   1464K  0B     13876 1     sleeping *0[1282+]       0.10389 0.06503    1037328352 554414+  1849   121834+   40506+    445150+   272151+
1919   Google Chrom 2.8  11:59.27 44    5    736    164M   4304K  2692K  1919  1     sleeping *0[6177]        0.00000 0.00000    1037328352 1716077  5037   4238431+  1292194+  16897037+ 23244409+
14511  top          2.3  00:00.47 1/1   0    20     3300K  0B     0B     14511 13879 running  *0[1]           0.00000 0.00000    0          5026+    115    209532+   104759+   11246+    128306+
161    mDNSResponde 2.2  03:16.65 6     4    99     3800K  0B     36K    161   1     sleeping *0[1]           0.00000 0.00000    65         6686     159    249506+   319874+   15091358+ 329850+
116    hidd         2.2  04:41.81 7     4    222    2700K  0B     0B     116   1     sleeping *0[1]           0.00000 0.00000    261        102387   181    5464519+  2985797+  8617680+  7987882+
99     securityd    2.0  02:02.02 7     3    224+   4908K  0B     48K    99    1     sleeping *0[1]           0.67463 0.00000    0          378333+  196    1580562+  97314+    5375325+  9439277+
vm_stat
$ vm_stat 1
Mach Virtual Memory Statistics: (page size of 4096 bytes)
    free   active   specul inactive throttle    wired  prgable   faults     copy    0fill reactive   purged file-backed anonymous cmprssed cmprssor  dcomprs   comprs  pageins  pageout  swapins swapouts
   81761  1941557     4845  1555659        0   584538   633902 77598904  2786572 36178726  1090282   800963      549601   2952460    99718    25665  1470331  2795334  5794930    18186    72657    95531
   81411  1949655     4845  1555659        0   576453   635641      967        0      243        0        0      549601   2960558    99718    25665        0        0        0        0        0        0
   81725  1942542     4845  1555659        0   583570   631950      186        0      140        0        0      549601   2953445    99718    25665        0        0        0        0        0        0
   81601  1949782     4845  1555659        0   576376   635619      177        0      176        0        0      549601   2960685    99718    25665        0        0        0        0        0        0
   81595  1949782     4847  1555659        0   576376   642064      156        0      155        0        0      549603   2960685    99718    25665        0        0        0        0        0        0
   81272  1949774     4847  1555659        0   576376   642064      133        0      133        0        0      549603   2960677    99718    25665        0        0        0        0        0        0
iostat
$ iostat 1
              disk0       cpu    load average
    KB/t  tps  MB/s  us sy id   1m   5m   15m
   30.40   10  0.31  17 10 74  3.28 2.89 2.76
    6.00    2  0.01  18  5 77  3.28 2.89 2.76
    0.00    0  0.00  17  5 78  3.28 2.89 2.76
    6.00    6  0.04  15  4 81  3.28 2.89 2.76
    0.00    0  0.00  17  5 78  3.28 2.89 2.76
    0.00    0  0.00  20  5 75  3.18 2.88 2.76
netstat
$ netstat  1
            input        (Total)           output
   packets  errs      bytes    packets  errs      bytes colls
        36     0      24346         32     0      10190     0
        12     0      11938         10     0       3592     0
        33     0      27327         28     0       9033     0
        22     0      11766         20     0       7109     0
        38     0      27328         27     0       8142     0
DTrace
$ man -kP cat dtrace
Tcl_CommandTraceInfo(3tcl), Tcl_TraceCommand(3tcl), Tcl_UntraceCommand(3tcl) - monitor renames and deletes of a command
bitesize.d(1m)           - analyse disk I/O size by process. Uses DTrace
cpuwalk.d(1m)            - Measure which CPUs a process runs on. Uses DTrace
creatbyproc.d(1m)        - snoop creat()s by process name. Uses DTrace
dappprof(1m)             - profile user and lib function usage. Uses DTrace
dapptrace(1m)            - trace user and library function usage. Uses DTrace
diskhits(1m)             - disk access by file offset. Uses DTrace
dispqlen.d(1m)           - dispatcher queue length by CPU. Uses DTrace
dtrace(1)                - generic front-end to the DTrace facility
dtruss(1m)               - process syscall details. Uses DTrace
errinfo(1m)              - print errno for syscall fails. Uses DTrace
execsnoop(1m)            - snoop new process execution. Uses DTrace
fddist(1m)               - file descriptor usage distributions. Uses DTrace
filebyproc.d(1m)         - snoop opens by process name. Uses DTrace
hotspot.d(1m)            - print disk event by location. Uses DTrace
httpdstat.d(1m)          - realtime httpd statistics. Uses DTrace
iofile.d(1m)             - I/O wait time by file and process. Uses DTrace
iofileb.d(1m)            - I/O bytes by file and process. Uses DTrace
iopattern(1m)            - print disk I/O pattern. Uses DTrace
iopending(1m)            - plot number of pending disk events. Uses DTrace
iosnoop(1m)              - snoop I/O events as they occur. Uses DTrace
iotop(1m)                - display top disk I/O events by process. Uses DTrace
kill.d(1m)               - snoop process signals as they occur. Uses DTrace
lastwords(1m)            - print syscalls before exit. Uses DTrace
loads.d(1m)              - print load averages. Uses DTrace
newproc.d(1m)            - snoop new processes. Uses DTrace
opensnoop(1m)            - snoop file opens as they occur. Uses DTrace
pathopens.d(1m)          - full pathnames opened ok count. Uses DTrace
perldtrace(1)            - Perl's support for DTrace
pidpersec.d(1m)          - print new PIDs per sec. Uses DTrace
plockstat(1)             - front-end to DTrace to print statistics about POSIX mutexes and read/write locks
priclass.d(1m)           - priority distribution by scheduling class. Uses DTrace
pridist.d(1m)            - process priority distribution. Uses DTrace
procsystime(1m)          - analyse system call times. Uses DTrace
runocc.d(1m)             - run queue occupancy by CPU. Uses DTrace
rwbypid.d(1m)            - read/write calls by PID. Uses DTrace
rwbytype.d(1m)           - read/write bytes by vnode type. Uses DTrace
rwsnoop(1m)              - snoop read/write events. Uses DTrace
sampleproc(1m)           - sample processes on the CPUs. Uses DTrace
seeksize.d(1m)           - print disk event seek report. Uses DTrace
setuids.d(1m)            - snoop setuid calls as they occur. Uses DTrace
sigdist.d(1m)            - signal distribution by process. Uses DTrace
syscallbypid.d(1m)       - syscalls by process ID. Uses DTrace
syscallbyproc.d(1m)      - syscalls by process name. Uses DTrace
syscallbysysc.d(1m)      - syscalls by syscall. Uses DTrace
topsyscall(1m)           - top syscalls by syscall name. Uses DTrace
topsysproc(1m)           - top syscalls by process name. Uses DTrace
weblatency.d(1m)         - website latency statistics. Uses DTrace
$ sudo cpuwalk.d
dtrace: system integrity protection is on, some features will not be available

Sampling... Hit Ctrl-C to end.
^C

...

     PID: 1919     CMD: Google Chrome

           value  ------------- Distribution ------------- count
             < 0 |                                         0
               0 |@@@@@@@@@@@@@@                           10
               1 |@@@@@@                                   4
               2 |@@@@@@@@@@@@@@@@@@@                      14
               3 |@                                        1
               4 |                                         0

     PID: 172      CMD: coreaudiod

           value  ------------- Distribution ------------- count
             < 0 |                                         0
               0 |@@@@@@@@@                                18
               1 |@@@@@@@@@                                17
               2 |@@@@@@@@@@@@@                            25
               3 |@@@@@@@@                                 16
               4 |                                         0

     PID: 12555    CMD: Microsoft Outloo

           value  ------------- Distribution ------------- count
             < 0 |                                         0
               0 |@@@@@@@@@@@@@@@@                         125
               1 |@@@@@                                    37
               2 |@@@@@@@@@@@@@@@                          119
               3 |@@@@@                                    41
               4 |                                         0
Instruments
  • GUI で裏で DTrace などを使っているらしい。

f:id:yohei-a:20170730235028p:image


参考


関連

*1:macOSに同梱されていてインストールしなくても使えるツール