全力で怠けたい

怠けるために全力を尽くしたいブログ。

既存の RDS の パラメータグループから CloudFormation テンプレートを簡単に作るやり方のメモ。

AWS コンソールから作成した RDS の DB パラメータグループ (DBParameterGroup) のパラメータから CloudFormation テンプレートを簡単に作るやり方のメモ。

AWS のリソースは Cloudmation で管理したいけど、古から伝わる AWS コンソールをポチポチして作成した既存の RDS のパラメータグループのパラメータを1つ1つ目で見ながらテンプレートに転記していく……のは面倒くさいし時間がかかるしなにより間違いが混入しやすいからやりたくない。

=> AWS CLI で DB パラメータグループのパラメーターを取得しちゃえばいい。

RDS の DB パラメータグループから CloudFormation テンプレートを作る

RDS の DB パラメータグループのパラメータは describe-db-parameters で取得できるので、取得結果をいじって CloudFormation テンプレートにしちゃえばいい。

AWS CLI のバージョン。

$ aws --version
aws-cli/1.16.300 Python/2.7.16 Linux/4.14.171-136.231.amzn2.x86_64 botocore/1.13.36

前準備: DB パラメータグループを作る

やり方の手順の前準備として DB パラメータグループを作っておく。

DB パラメータグループのファミリーは何でもいいけど今回は MySQL 5.7 ファミリーの DB パラメータグループを作っておく。

$ aws rds create-db-parameter-group \
    --db-parameter-group-name my-db-parameter-group \
    --db-parameter-group-family mysql5.7 \
    --description 'My DB Parameter Group'

あとでパラメーターの設定値を出力するためにどれでもいいのでパラメーターの設定値を変えておく。 今回は MySQL 5.7 の DB パラメータグループはデフォルトではスロークエリログを出さない設定なので、スロークエリログを出す設定の slow_query_log=1 にしておく。

$ echo '{
    "Parameters": [
        {
            "ApplyMethod": "immediate",
            "Description": "Enable or disable the slow query log",
            "DataType": "boolean",
            "IsModifiable": true,
            "AllowedValues": "0,1",
            "Source": "user",
            "ParameterValue": "1",
            "ParameterName": "slow_query_log",
            "ApplyType": "dynamic"
        }
    ]
}' > input.json

$ aws rds modify-db-parameter-group \
    --db-parameter-group-name my-db-parameter-group \
    --cli-input-json file://input.json
{
    "DBParameterGroupName": "my-db-parameter-group"
}

DB パラメータグループのパラメータの取得

describe-db-parameters で DB パラメータグループのパラメータを取得できる。

$ aws rds describe-db-parameters --db-parameter-group-name my-db-parameter-group --source user > output.json

describe-db-parameters の出力はこんな感じの JSON になっているので、

$ cat output.json
{
    "Parameters": [
        {
            "ApplyMethod": "immediate",
            "Description": "Enable or disable the slow query log",
            "DataType": "boolean",
            "IsModifiable": true,
            "AllowedValues": "0,1",
            "Source": "user",
            "ParameterValue": "1",
            "ParameterName": "slow_query_log",
            "ApplyType": "dynamic"
        }
    ]
}

jq でいい感じに整形する。

$ cat output.json | jq -r '.Parameters[] | .ParameterName + ": " + .ParameterValue'
slow_query_log: 1

DB パラメータグループのテンプレートを作る

DB パラメータグループのテンプレートを作ってさっき出力したパラメータを Parameters のところにコピペする。

AWSTemplateFormatVersion: "2010-09-09"
Description: DB Parameter Group
Resources:
  DBParameterGroup:
    Type: "AWS::RDS::DBParameterGroup"
    Properties:
      Family: mysql5.7
      Description: My DB Parameter Group
      Parameters:
        # ↓さっき出力したパラメータ
        slow_query_log: 1

以上。

参考ページ

URL から HTML の <a> タグにする url-anchor コマンドを作った。

URL から HTML の <a> タグにする url-anchor コマンドを作った。

url-anchor コマンドって?

url-anchor コマンドは URL を与えると URL とページのタイトルを HTML の <a> タグにする。

デフォルトの動作は与えた URL とページのタイトルを HTML の <a> タグにするけど、オプションを指定すると Markdown のリンクと reStructuredText のリンクにすることもできる。

使い方

URL から HTML の <a> タグにする。

$ url-anchor https://google.com/
<a href="https://google.com/">Google</a>

URL から Markdown のリンクにする。

$ url-anchor -m https://google.com/
[Google](https://google.com/)

URL から reStructuredText のリンクにする。

$ url-anchor -r https://google.com/
`Google <https://google.com/>`_

Docker

普通に docker container run する。 コマンドの実行が終わったらコンテナを削除したいので --rm オプションを付けてる。

$ docker container run --rm ebc2in2crc/url-anchor https://google.com/
<a href="https://google.com/">Google</a>

便利な使い方 (Mac のみ)

クリップボードを使う便利な使い方。

  1. URL をクリップボードにコピーしておく。
  2. 以下のコマンドを実行すると実行結果をクリップボードにコピーしてくれる。
$ url-anchor $(pbpaste) | pbcopy

エイリアスにしておくとかシェル関数にしておくとさらに便利。

インストール方法

Homebrew

$ brew tap ebc-2in2crc/tap
$ brew install url-anchor

Developer

$ go get -u github.com/ebc-2in2crc/url-anchor/...

手動でのインストール

https://github.com/ebc-2in2crc/url-anchor/releases からダウンロードした zip ファイルを展開した中にあるファイルをパスの通ったディレクトリに入れる。

動機

Twitter結城浩さんのツイートを見たのが url-anchor コマンドを作るきっかけ (だと思う。たぶん) ブラウザーでページを見てるときとかはブラウザー拡張機能で同じようなことができるんだけど、結構 CLI で作業してることが多いので同じようなことが CLI でできたら便利だなーと思って作った。

まとめ

バグとかあると思うし「おそいよ!」とか「こーしたら使いやすくなる」とかあったらイシュー作ったり声かけてもらえると嬉しいです!

du コマンドでよく使うオプションのメモ。

du コマンドでわりとよく使うオプションのメモ。

普段は AWS の EC2 インスタンスに入って使うことが多いのでこのエントリーを書くときも EC2 インスタンスに入って du コマンドを実行した結果とかをメモっている。

du コマンドのバージョン。

$ du --version
du (GNU coreutils) 8.22
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Torbjörn Granlund, David MacKenzie, Paul Eggert,
and Jim Meyering.

du コマンドのオプション

du コマンドはディスクの使用量を表示するコマンド。

自分はちょいちょい使うわりにはオプションとかよく覚えてなくて使うたびにググったりが多い気がするのでよく使うオプションをメモしておく。

コマンドの動作は以下のディレクトリ構造とそれぞれ 1MiB のサイズの dat ファイルを配置して確認いく。

$ tree
.
├── fuga
│   ├── fuga-1.dat
│   └── fuga-2.dat
├── hoge
│   ├── hoge-1.dat
│   └── hoge-children
│       ├── hoge-children-1.dat
│       ├── hoge-children-2.dat
│       ├── hoge-children-3.dat
│       ├── hoge-children-4.dat
│       └── hoge-children-5.dat
└── piyo
    ├── piyo-1.dat
    ├── piyo-2.dat
    └── piyo-3.dat

--help オプション: ヘルプ

--help オプションを指定すると du コマンドの使い方を表示する……んだけど man du が使えないときにしか使わない。

$ du --help
Usage: du [OPTION]... [FILE]...
  or:  du [OPTION]... --files0-from=F
Summarize disk usage of each FILE, recursively for directories.

Mandatory arguments to long options are mandatory for short options too.
  -0, --null            end each output line with 0 byte rather than newline

# 省略

オプションなし

du コマンドをオプションなしで実行するとカレントディレクトリ配下のサイズを再帰的に集計して表示する。

$ du
5120    ./hoge/hoge-children
6144    ./hoge
2048    ./fuga
3072    ./piyo
11264   .

-d, --max-depth オプション: 集計するディレクトリの階層を指定

-d オプションか --max-depth オプションで集計するディレクトリの階層を指定する。

du --max-depth 1 するとカレントディレクトリとカレントディレクトリ直下のディレクトリそれぞれのサイズをディレクトリごとに集計する。

$ du --max-depth 1
6144    ./hoge
2048    ./fuga
3072    ./piyo
11264   .

du --max-depth 0 を指定するとカレントディレクトリのサイズだけ集計する (= 階層がゼロ)

$ du --max-depth 0
11264   .

FILE: サイズを集計するディレクトリかファイル

オプションじゃないんだけど FILE についても書いておく。

$ du --help
Usage: du [OPTION]... [FILE]...
  or:  du [OPTION]... --files0-from=F

FILE はサイズを集計するディレクトリかファイルを指定する。

たとえば du fuga と指定すると fuga ディレクトリのサイズを集計するし du piyo と指定すると piyo ディレクトリのサイズを集計する。

$ du fuga
2048    fuga/

$ du piyo
3072    piyo

du fuga piyo みたいに FILE を複数指定すると fuga ディレクトリと piyo ディレクトリそれぞれのサイズを集計する。

$ du fuga/ piyo/
2048    fuga/
3072    piyo/

du みたいに FILE を指定しないときは du . みたいにカレントディレクトリを指定するのと同じ。

$ du
5120    ./hoge/hoge-children
6144    ./hoge
2048    ./fuga
3072    ./piyo
11264   .

$ du .
5120    ./hoge/hoge-children
6144    ./hoge
2048    ./fuga
3072    ./piyo
11264   .

-s, --summarize オプション: ディレクトリの合計サイズだけ表示

-s オプションか --summarize オプションを指定すると指定したディレクトリのサイズだけを表示する……と書くとなんのことやらだけど、ようはサブディレクトリごとのサイズは表示しなくなるということ。 => --summarize オプションは --max-depth 0 を指定するのと同じ

たとえば du . みたいに --summarize オプションを指定しないとカレントディレクトリとカレントディレクトリ配下のディレクトリそれぞれのサイズが表示されるけど、

$ du .
5120    ./hoge/hoge-children
6144    ./hoge
2048    ./fuga
3072    ./piyo
11264   .

du --summarize . みたいに --summarize` オプションを指定するとカレントディレクトリのサイズだけ表示する。

$ du --summarize .
11264   .

-B, --block-size オプション: サイズの単位を指定

-B オプションか --block-size オプションでサイズの単位を指定する。 -B オプションか --block-size オプションを指定しないときは K (KiB) を指定するのと同じ。

$ du --summarize .
11264   .

$ du --summarize --block-size K .
11264K  .

$ du --summarize --block-size M .
11M .

-B オプションか --block-size オプションは以下を指定できる。

指定できる値 表示単位
KB キロバイト (KB)
K キビバイト (KiB)
MB ガバイト (MB)
M メビバイト (MiB)
GB ギビバイト (GB)
G ギビバイト (GiB)
TB テビバイト (TB)
T テビバイト (TiB)

実は -B オプションか --block-size オプションは数字なら何でも指定できる。面倒くさいからやらないけど……

$ du --summarize --block-size KB .
11535kB .

$ du --summarize --block-size 1000 .
11535   .

$ du --summarize --block-size K .
11264K  .

$ du --summarize --block-size 1024 .
11264   .

-k, -m オプション: --block-size オプションの短縮形

-k オプションと -m オプションはそれぞれ --block-size K--block-size M を指定するのと同じ。

$ du -k --summarize .
11264   .

$ du -m --summarize .
11  .

-h, --human-readable オプション: 人間が読みやすくするやつ

-h オプションか, --human-readable オプションを指定するとサイズに応じた単位で表示する。

個人的にはディレクトリのサイズでソートしちゃうことが多いのであまり使わないオプション。

$ du --human-readable --summarize .
11M .

CloudFormation の Fn::Cidr 組み込み関数の使い方のメモ。

AWS の CloudFormation の Fn::Cidr 関数 を使うとサブネットとかの CIDR ブロックを動的に指定することができて便利なので使い方をメモ。

Fn::Cidr 関数を使わないとき

Fn::Cidr 関数を使わないときは CIDR ブロックはベタ書きのハードコーディングする感じになる。

たとえば 10.0.0.0/16 の16ネットマスクの CIDR ブロックを VPC に割り当てて、その VPC のサブネットを2つ作ってそれぞれのサブネットは 10.0.x.0/24 の24ネットマスクの CIDR ブロックを割り当てるときはこんなテンプレートを書く感じ。

AWSTemplateFormatVersion: "2010-09-09"
Description: Example of Cidr function
Resources:
  ExampleVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16

  ExampleSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.0.0/24
      VpcId: !Ref ExampleVPC

  ExampleSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.1.0/24
      VpcId: !Ref ExampleVPC

別にこれでもいいんだけど VPC の CIDR ブロックが変わったりすると VPC だけじゃなくてサブネットの CIDR ブロックも変えないといけなくて面倒くさい。

Fn::Cidr 関数を使うとき

Fn::Cidr 関数を使うと CIDR ブロックはベタ書きのハードコーディングしなくていい。

たとえば 10.0.0.0/16 の16ネットマスクの CIDR ブロックを VPC に割り当てて、その VPC のサブネットを2つ作ってそれぞれのサブネットは 10.0.x.0/24 の24ネットマスクの CIDR ブロックを割り当てるときはこんなテンプレートを書く感じ。 サブネットの CIDR ブロックのところがベタ書きじゃなくなっているのが分かると思う。

AWSTemplateFormatVersion: "2010-09-09"
Description: Example of Cidr function
Resources:
  ExampleVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16

  ExampleSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: !Select [0, !Cidr [!GetAtt ExampleVPC.CidrBlock, 2, 8]]
      VpcId: !Ref ExampleVPC

  ExampleSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: !Select [1, !Cidr [!GetAtt ExampleVPC.CidrBlock, 2, 8]]
      VpcId: !Ref ExampleVPC

でも、さっきよりはいい感じなんだけど VPC の CIDR ブロックが変わったりすると VPC の CIDR ブロックのところを変えないといけないのが面倒くさい。

なので、実際の開発では VPC の CIDR ブロックは↓みたいにパラメーターにしてテンプレート外部からもらうのがよさそう。

AWSTemplateFormatVersion: "2010-09-09"
Description: Example of Cidr function
Parameters: 
  VPCCidrBlock: 
    Type: String
    Default: 10.0.0.0/16

Resources:
  ExampleVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VPCCidrBlock

  ExampleSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: !Select [0, !Cidr [!GetAtt ExampleVPC.CidrBlock, 2, 8]]
      VpcId: !Ref ExampleVPC

  ExampleSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: !Select [1, !Cidr [!GetAtt ExampleVPC.CidrBlock, 2, 8]]
      VpcId: !Ref ExampleVPC

CIDR ブロックはパラメーターにしてテンプレート外部からもらうと Resources セクションのベタ書きの CIDR ブロックが消えてすっきりするしメンテナンスもしやすくなっていい感じ。

参考ページ

mysql コマンドのステートメント履歴の削除とか履歴を保存しない設定のメモ。

mysql コマンドは実行する SELECT とか UPDATE ステートメントを記録するので、カーソルキーの上下でステートメント履歴をたどることができる。 ステートメント履歴は便利なんだけどパスワードとかの機密情報は記録したくないとか、過去に実行した UPDATE とか DELETE の履歴は削除したいとかそもそも履歴に残したくないときがあるので、mysql コマンドのステートメント履歴の削除方法とかをメモしておく。

mysql コマンドのステートメント履歴

すべてのステートメント履歴の削除

mysql コマンドは実行したステートメントを履歴ファイルに記録する。

デフォルトでは .mysql_history というファイル名でユーザーのホームディレクトリに記録しているので、.mysql_history を消すとすべてのステートメント履歴を削除できる。

$ rm ~/.mysql_history

個別のステートメント履歴の削除

個別のステートメントの履歴だけ削除するときは .mysql_history の中身を編集する。 エディターで .mysql_history を開いて編集してから保存してもいいし、sed コマンドとかで編集してもいい。

ステートメントの履歴ファイルの指定

mysql コマンドは実行したステートメントをデフォルトでは .mysql_history というファイル名でユーザーのホームディレクトリに記録するけど、履歴ファイルの保存場所は MYSQL_HISTFILE 環境変数で指定できる。 たとえば履歴ファイルをホームディレクトリの .mymysql_history というファイルに保存するなら .bashrc とかに MYSQL_HISTFILE=~/.mymysql_history と追加しておく。

ステートメント履歴を記録しない方法: --batch オプション, --execute オプション

mysql コマンドは対話的に実行しているときだけステートメントを履歴ファイルに保存するので、ステートメントをファイルとかパイプから mysql コマンドに流し込むときはステートメントは履歴ファイルに保存しない。

たとえば以下の select * from sample_table ステートメントは履歴ファイルには保存しない。

$ echo 'select * from sample_table' | mysql -h127.0.0.1 -uroot -proot -P3306

mysql コマンドを実行するときに --batch オプション か --execute オプションを指定することでもステートメントを履歴ファイルに保存するのを抑制できる。

たとえば以下の show databases ステートメントexit ステートメントは履歴ファイルに保存しない。

$  mysql -h127.0.0.1 -uroot -proot -P3306 --batch
show databases;
Database
information_schema
mysql
performance_schema
exit

以下の show databases ステートメントは履歴ファイルに保存しない。

$ mysql -h127.0.0.1 -uroot -proot -P3306 --execute='show databases'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+

任意のステートメントを履歴ファイルに保存しない方法

ステートメントの履歴は保存したいけどパスワードとかの機密情報は保存したくないとか、 SELECT は保存したいけど INSERT, UPDATEDELETE は保存したくないときがあると思う。 任意のステートメントを履歴ファイルに保存したくないときは MYSQL_HISTIGNORE 環境変数--histignore オプションを指定すると履歴ファイルへの保存を抑制できる。

たとえば '*INSERT*'MYSQL_HISTIGNORE 環境変数を指定しておくと以下の use sample_db, select * from sample_tableexit ステートメントは履歴ファイルに保存するけど insert into sample_table values (2) ステートメントは履歴ファイルに保存しない。

$ MYSQL_HISTIGNORE='*INSERT*' mysql -h127.0.0.1 -uroot -proot -P3306

mysql> use sample_db;
mysql> select * from sample_table;
+------+
| id   |
+------+
|    1 |
+------+
1 rows in set (0.00 sec)

mysql> insert into sample_table values (2);
Query OK, 1 row affected (0.01 sec)

mysql> exit
Bye

--histignore オプションでも同じことができる。

たとえば *INSERT*--histignore= オプションに指定すると以下の use sample_db, select * from sample_tableexit ステートメントは履歴ファイルに保存するけど insert into sample_table values (3) ステートメントは履歴ファイルに保存しない。

$ mysql -h127.0.0.1 -uroot -proot -P3306 --histignore='*INSERT*'

mysql> use sample_db;
mysql> select * from sample_table;
+------+
| id   |
+------+
|    1 |
+------+
1 rows in set (0.00 sec)

mysql> insert into sample_table values (3);
Query OK, 1 row affected (0.01 sec)

mysql> exit
Bye

ちなみに mysql コマンドはデフォルトでは *IDENTIFIED*:*PASSWORD* を無視するのでパスワードとかが履歴ファイルに保存されることはない。 MYSQL_HISTIGNORE 環境変数あるいは --histignore オプションを指定すると指定したステートメントがデフォルトの無視リスト(*IDENTIFIED*:*PASSWORD*) に追加される。

すべてのステートメントを履歴ファイルに保存しない方法

すべてのステートメントを履歴ファイルに保存したくないときは履歴ファイルを /dev/null へのシンボリックリンクにしてしまえばよい。

たとえば履歴ファイルが ~/.mysql_history なら以下のコマンドを実行すれば以後すべてのステートメントは履歴ファイルに保存しなくなる。

$ ln -s /dev/null ~/.mysql_history

あるいは /dev/nullMYSQL_HISTFILE 環境変数指定しておくことでもすべてのステートメントを履歴ファイルに保存しないようにできる。 たとえば .bashrc とかに MYSQL_HISTFILE=/dev/null と書いておくとよい。

参考ページ

curl コマンドでメッセージを Slack に post するメモ。

Slack はデスクトップアプリとかブラウザーで使っているけど CLI からメッセージを post したりファイルをアップロードしたりがちょいちょいあるので、curl コマンドでメッセージを Slack に post したりするのをメモしておく。

curl コマンドでメッセージを Slack に post

シンプルなメッセージ

curl コマンドでシンプルなメッセージを Slack に post するには chat.postMessage メソッドを使う。

$ curl --request POST \
        --form channel=${SLACK_CHANNEL} \
        --form token=${SLACK_TOKEN} \
        --form 'text=Hello World!' \
        https://slack.com/api/chat.postMessage

SLACK_CHANNEL はメッセージを post する Slack のチャンネルとかグループの ID を指定する。 ブラウザーで Slack を表示するとアドレスバーが https://app.slack.com/client/xxxxxxxxx/yyyyyyyyy みたいになっていると思うので yyyyyyyyy の部分を指定すればよい。 SLACK_TOKEN は Slack OAuth トークンを指定しておく。

ファイルのアップロード

curl コマンドでファイルを Slack に upload するには files.upload メソッドを使う。

 curl --request POST \
     --form channels=${SLACK_CHANNEL} \
     --form token=${SLACK_TOKEN} \
     --form file=@${FILEPATH} \
     --form title=タイトル \
     --form initial_comment=コメント \
     https://slack.com/api/files.upload

FILEPATH はアップロードするファイルのパスを指定する。

参考ページ

sar コマンドでよく使うオプションのメモ (CPU とメモリ)

sar コマンドでわりとよく使うオプションのうち CPU とメモリに関するメモ。

普段は AWS の EC2 インスタンスに入って使うことが多いのでこのエントリーを書くときも EC2 インスタンスに入って sar コマンドを実行した結果とかをメモっている。

sar コマンドのバージョン。

$ sar -V
sysstat version 10.1.5

sar コマンドのオプション

sar コマンドはプロセスのメモリ、プロセス、スワップ、ディスク IO、ネットワーク、ロードアベレージ、CPU ……等の統計情報を表示するコマンド。

システムの一通りの情報が揃っているので「なにか変だな」みたいなときはまず使ってみる、みたいな使い方をすることが多いように思う。

sar コマンドはリアルタイムの統計情報を取得して表示することのほかに過去の統計情報を表示することもできるが、このページではリアルタイムの統計情報の表示についてメモしておく。

自分はなんとなく使うことが多い気がするのでよく使うオプションをメモしておく => オプションがかなり多いので CPU とメモリに関してメモしておく

-h オプション: ヘルプ

-h オプションを指定すると sar コマンドの使い方を表示する……んだけど man sar が使えないときにしか使わない。

$ sar -h
Usage: sar [ options ] [ <interval> [ <count> ] ]
Main options and reports:
    -b  I/O and transfer rate statistics
    -B  Paging statistics
    -d  Block device statistics
    -F [ MOUNT ]
        Filesystems statistics
    -H  Hugepages utilization statistics
    -I { <int> | SUM | ALL | XALL }
        Interrupts statistics
    -m { <keyword> [,...] | ALL }
# 省略

interval, count

オプションじゃないんだけど sar コマンドでリアルタイムの統計情報を取得するときは必ずといっていいほど指定するやつ。

sar みたいに interval なしで実行するとこんな感じで起動 (再起動) してからシステムが一定間隔で記録してくれている統計情報を表示するんだけど、

$ sar

12:25:16 PM       LINUX RESTART

12:30:01 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
12:40:01 PM     all      0.01      0.00      0.02      0.00      0.00     99.96
12:50:01 PM     all      0.01      0.00      0.02      0.00      0.00     99.97
01:00:01 PM     all      0.02      0.00      0.01      0.00      0.00     99.97
01:10:01 PM     all      0.01      0.00      0.02      0.00      0.01     99.96
Average:        all      0.01      0.00      0.02      0.00      0.00     99.97

sar 5 みたいに interval を指定すると指定した interval 秒ごとに表示を更新する。

$ sar 5

01:21:41 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
01:21:46 PM     all      0.00      0.00      0.00      0.00      0.00    100.00
01:21:51 PM     all      0.00      0.00      0.00      0.00      0.00    100.00
01:21:56 PM     all      0.00      0.00      0.00      0.00      0.00    100.00
01:22:01 PM     all      0.00      0.00      0.00      0.00      0.00    100.00
01:22:06 PM     all      0.00      0.00      0.00      0.00      0.00    100.00

sar 5 3 みたいに interval と count を指定すると指定した interval 秒ごとに count 回分だけ表示を更新する。

$ sar 5 3

01:22:46 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
01:22:51 PM     all      0.00      0.00      0.00      0.00      0.00    100.00
01:22:56 PM     all      0.00      0.00      0.00      0.00      0.00    100.00
01:23:01 PM     all      0.00      0.00      0.00      0.00      0.00    100.00
Average:        all      0.00      0.00      0.00      0.00      0.00    100.00

-u: CPU 使用率の表示

-u オプションを指定すると CPU 使用率を表示する。

sar コマンドは表示するリソースをオプションで指定しないときは -u オプションを指定するときと同じように動くので sarsar -u は実質同じ。

表示項目の単位はパーセンテージ。

$ sar -u 5 2

02:04:21 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
02:04:26 PM     all      0.00      0.00      0.00      0.00      0.00    100.00
02:04:31 PM     all      0.00      0.00      0.00      0.00      0.00    100.00
Average:        all      0.00      0.00      0.00      0.00      0.00    100.00

ALL を指定するとすべての表示項目を出力する。

$ sar -u ALL 5 2

02:05:00 PM     CPU      %usr     %nice      %sys   %iowait    %steal      %irq     %soft    %guest    %gnice     %idle
02:05:05 PM     all      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00    100.00
02:05:10 PM     all      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00    100.00
Average:        all      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00    100.00

-u オプションを指定して CPU 使用率を表示するときの表示項目について軽くメモしておく。

表示項目の単位はパーセンテージ。

項目 意味
%user カーネル以外が CPU を使用した時間。仮想マシンの実行に使用した時間も含まれる
%usr カーネル以外が CPU を使用した時間。仮想マシンの実行に使用した時間は含まれない
%nice nice 値を変更しているプロセスが CPU を使用した時間
%system カーネルが CPU を使用した時間。ハードウェア割り込みとソフトウェア割り込みの処理に使用した時間も含まれる
%sys カーネルが CPU を使用した時間。ハードウェア割り込みとソフトウェア割り込みの処理に使用した時間も含まれる
%iowait IO 待ちで CPU がアイドルだった時間
%steal 仮想マシンから盗まれた時間 ※
%irq ハードウェア割り込みの処理に CPU を使用した時間
%soft ソフトウェア割り込みの処理に CPU を使用した時間
%guest 仮想マシンの実行に CPU を使用した時間
%gnice nice 値を変更している仮想マシンの実行に CPU を使用した時間
%idle CPU がアイドルだった時間

%steal: 仮想マシンから盗まれた時間

仮想マシンから盗まれた時間」とはなにを意味するのか。

sar の man page は以下が書いてある。

Percentage of time spent in involuntary wait by the virtual CPU or CPUs while the hypervisor was servicing another virtual processor.

Google 翻訳にかけると ハイパーバイザーが別の仮想プロセッサーにサービスを提供している間に、1つまたは複数の仮想CPUが不本意に待機した時間の割合 って感じで、OS が仮想マシン (仮想サーバー) 上で動いているときに意味を持ってくる値で、仮想マシンが CPU を要求するけど CPU の使用率の上限が決められていて仮想マシンが CPU を利用できないときとか、仮想マシンが CPU を要求するけど 他の仮想マシンが CPU を使いまくってて CPU を利用できないときに %steal が上昇する。

自分は普段あまり %steal の上昇は見ないような気がするけど AWS の EC2 の t2 とかのバーストパフォーマンスインスタンスを使ってるときに見たりする。 たとえば、t2 インスタンスとかで CPU をぶん回して CPU バーストして CPU 使用率が 100% に張り付くような状態を続けていくといずれ CPU クレジットを使い切って CPU 使用率が落ちていく。 このへんを sar で見てると %steal の値が上昇していくのが分かる。

プログラムが仮想マシン上で動いていて CPU 使用率はそんなに高くないんだけど CPU バウンドっぽい……みたいなときは %steal の値が上昇しているかチェックしてみるのがよさそう。

-P: コアごとの CPU 使用率の表示

-P オプションを指定するとコアごとの CPU 使用率を表示する。

表示項目の単位はパーセンテージ。

-P オプションはどのコアの CPU 使用率を表示するかも指定することができる。

-P オプションに続けて ALL を指定するとすべてのコアそれぞれの CPU 使用率とすべてのコアの合計の CPU 使用率を表示する。 CPU のところにどのコアかが表示する。コアは 0 始まり。

t2.micro インスタンスで sar コマンドを実行しているのでコアが1つしかないが、複数コアがあるときはコアごとの情報を出力する。

$ sar -P ALL 5 2

01:41:58 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
01:42:03 PM     all      0.00      0.00      0.00      0.00      0.00    100.00
01:42:03 PM       0      0.00      0.00      0.00      0.00      0.00    100.00

01:42:03 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
01:42:08 PM     all      0.00      0.00      0.00      0.00      0.00    100.00
01:42:08 PM       0      0.00      0.00      0.00      0.00      0.00    100.00

Average:        CPU     %user     %nice   %system   %iowait    %steal     %idle
Average:        all      0.00      0.00      0.00      0.00      0.00    100.00
Average:          0      0.00      0.00      0.00      0.00      0.00    100.00

-P オプションに続けて表示するコアを指定すると指定したコアそれぞれの CPU 使用率を表示する。 CPU のところにどのコアかが表示する。コアは 0 始まり。

$ sar -P 0 5 2

01:47:33 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
01:47:38 PM       0      0.00      0.00      0.00      0.00      0.00    100.00
01:47:43 PM       0      0.00      0.00      0.00      0.00      0.00    100.00
Average:          0      0.00      0.00      0.00      0.00      0.00    100.00

-r: メモリ使用率の表示

-r オプションを指定するとメモリ使用率を表示する。

表示項目の単位はキロバイト

$ sar -r 5 2

01:50:11 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
01:50:16 PM    536276    470688     46.74      2088    347508    191396     19.01    160256    220424       296
01:50:21 PM    536276    470688     46.74      2088    347508    191396     19.01    160256    220424       296
Average:       536276    470688     46.74      2088    347508    191396     19.01    160256    220424       296

-r オプションを指定してメモリ使用率を表示するときの表示項目について軽くメモしておく。

表示項目の単位はキロバイト

表示項目 意味
kbmemfree 使用可能な空きメモリの量
kbmemused 使用中のメモリの量。カーネルが使用中のメモリの量は含まない
%memused メモリ使用率
kbbuffers カーネルがバッファとして使用中のメモリの量
kbcached カーネルがキャッシュとして使用中のメモリの量
kbcommit システムの動作に必要な事前に確保されているメモリの量 (RAM + swap)
%commit システムの動作に必要な事前に確保されているメモリの総メモリ量に対する割合 (RAM + swap) ※
kbactive アクティブなメモリの量 (最近使用されたメモリ。絶対に必要がない限り通常は再利用されないメモリ)
kbinact アクティブではないメモリの量 (最近使用されたメモリ。他に用途があれば再利用されるメモリ)
kbdirty ディスクに書き戻すのを待機しているメモリの量

カーネルはオーバーコミット (実メモリ以上にメモリをプロセスに割り当てる) することがあるので %commit は 100% 以上になることがある。

参考ページ