vmstat
はじめに
Linuxの性能指標を確認するコマンドのうちvmstatについてまとめる。
vmstatとは
仮想メモリやCPU、ディスクI/Oの統計情報を表示するコマンド。システム*1全体に関する統計情報を表示するため、CPUごとやプロセスごとの情報を取得する場合は別のコマンドを利用する(mpstat -P
やtop
、ps aux
)。
導入方法
多くの環境では標準でインストールされている。
見方
実行例は以下の通り。vmstat (秒数) (回数)
の形式になっており、指定した秒数ごとに回数分の行数出力する。1行目は前回起動時からの各項目の平均値になっているため、直近の性能が必要なケース*2では2行目以降を用いる。
# vmstat 1 5 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 0 3593060 2108 133724 0 0 94 8 52 96 0 0 99 0 0 0 0 0 3593080 2108 133724 0 0 0 0 21 21 0 0 100 0 0 0 0 0 3593080 2108 133724 0 0 0 0 16 17 0 0 100 0 0 0 0 0 3593080 2108 133724 0 0 0 0 13 20 0 0 100 0 0 0 0 0 3593080 2108 133724 0 0 0 0 14 17 0 0 100 0 0
各項目(列)が示している内容は次の通り。
procs
r
はCPUでの実行待ちプロセス数。ランキューと呼ばれる待ち行列に入っているプロセスの数だが、通常はランキューに入るとほぼ同時に処理される。したがって、多くても平常時は0~2程度だが、この値が大きいとCPUの処理が追い付いていないということがわかる。
b
はディスクやネットワークなどのデータI/O処理で待ち状態のプロセスの数。
r
とb
を足したものをロードアベレージと呼ぶ。つまり、ロードアベレージは平均での実行待ちプロセスである。
memory
free
は空いている物理メモリの量(KB単位)。
buff
はバッファとして用いられているメモリの量(KB単位)。バッファとはデータの一時的な記憶領域。ディスクの読み書きをキャッシュしてデータへのアクセスを高速化する目的で用意される*4。主にカーネルが利用する。
cache
はキャッシュに用いられているメモリの量(KB単位)。キャッシュもバッファと同様、一時的なディスクへの読み書き領域で、データへのアクセスを高速化する。
swap
si
はスワップインされているメモリの量(KB/s)。スワップ→メモリの方向。
so
はスワップアウトされているメモリの量(KB/s)。メモリ→スワップの方向。*5
io
bi
はディスクから読み込んだブロック数の秒間平均。
bo
はディスクへ書き込んだブロック数の秒間平均。
system
in
は1秒あたりの割り込み回数。interruptのin。
cs
は1秒あたりのコンテキストスイッチ回数。CPUは複数のプロセスを高速に切り替えることによって、マルチタスクを実現している。コンテキストスイッチはこの切り替えの回数。切り替えは性能ロスになる*6
cpu
us
はユーザープログラム、すなわちカーネル以外のプログラムが動いていた時間の割合(%)。
sy
はカーネルが動いていた時間の割合(%)。
id
はCPUが全く動いていなかった時間の割合(%)。idleのid。
wa
はデータやネットワークへのI/O待ち時間の割合(%)。
st
は「仮想環境でプログラムを実行している場合に、他VMとCPUを取り合った結果、実際に実行されていなかった」ケースの時間の割合(%)。stealのst。
参考にしたもの
*1:ある物理マシンもしくは仮想マシン、単独のLinux OSが動いている範囲。
*2:多くの場合はこちらが該当すると思われる。
*3:参考文献含め、swpdの定義に「使用しているスワップ領域の量を表す。」という文が追加されているケースが散見する。しかし、仮想メモリ≠スワップのはずなので、「使用しているスワップ領域を表す。」という文章は適切ではないと思う。仮想メモリの実体として、物理メモリが対応しているケースと、スワップ領域(ディスク)が対応しているケースがあるので、ここを正確に言うなら「使用しているスワップ領域と物理メモリの合計を表す」くらいだろうか。
*4:ディスクよりメモリへの読み書きのほうが高速である。
*5:自分は「スワップからイン」「スワップへアウト」と覚えている。どちらも8文字になるというのがテレコに覚えるのを防いでいる。
Go の関数とメソッドの書き方の違い
関数とメソッド
関数もメソッドも、引数を与えるとそれに基づいた計算結果を返却する。プログラム内で何度も登場する処理を共通化して再利用可能なものにしている。ただし、メソッドはオブジェクト指向において使われる言葉である。オブジェクト指向は、関連するデータとメソッド(手続き)を束ねたオブジェクトという概念を規定する。オブジェクト指向のメソッドと比較すると、関数というのは何らかのオブジェクトに属しているものではない。
Goの関数とメソッド
Goでは関数とメソッドを両方定義し利用できる。
関数
関数は
func 関数名(引数) 戻り値の型 { 処理 return 戻り値 }
の形で定義し、main
関数の中で
関数名(引数(実際に計算させたい値))
の形で呼び出す。
メソッド
メソッドはオブジェクト指向のものなので、メソッドを使う場合はオブジェクトが必要である。ここでのオブジェクトは構造体(struct
)をもとに定義したレシーバである。
まず構造体を定義する。
type 構造体名 struct{ メンバ }
上の構造体定義をベースとして、以下のようにメソッドを定義する。func
で始まるが、関数と違い、すぐそのあとにはカッコが来る。レシーバはメソッドを呼び出される対象である。カッコ内を見るとわかる通りレシーバはあたかも構造体のように定義されている。処理の中身では処理対象の変数はレシーバもしくのメンバとして参照される(レシーバを構造体としてレシーバ.メンバ
のように扱う)。ここは後程出てくるサンプルを見てもらったほうがイメージがわかりやすい。
func (レシーバ名 定義した構造体名) メソッド名() メソッドの戻り値の型 { 処理 return 戻り値 }
メソッドで実際に計算するときは、main
関数の中で構造体のインスタンスを定義し*1、
構造体インスタンス名 := 構造体名{メンバの具体的な数値}
下記のように計算する。関数をイメージするとカッコ内に数値が入っていないのでどんな値を渡しているかわからないように見えるが、実際にメソッドに渡したい値は構造体を定義したときに決まっているので、それで計算できるわけである。
構造体インスタンス名.メソッド名()
サンプル
2つのint
型の数値を加算するプログラム(func-method.go)を考える。以下の例では関数を使ったパターンとメソッドを使ったパターンの両方が記載されている(結果はどちらも同じ)。ただし、Goでは構造体のメンバにメソッドを定義することができないため、メソッドは構造体とは別に定義する。
myaddfunc
が関数であり、引数に3,4
という数値を与えて結果を計算している。
一方、int
型の構造体mystruct
を定義したのち、X
というレシーバに対し、myaddmethod()
というメソッドを定義している。main
関数の中でX1
という構造体を定義し、構造体のメンバに3
と4
を代入してから、X1.myaddmethod()
という形で実際の処理を行う。
package main import "fmt" // define function func myaddfunc(a, b int) int { return a + b } // define struct and method type mystruct struct{ a, b int } func (X mystruct) myaddmethod() int { return X.a + X.b } // main func main() { // use function fmt.Println(myaddfunc(3, 4)) // use method X1 := mystruct{3, 4} fmt.Println(X1.myaddmethod()) }
計算結果は以下。
$ go run .\func-method.go 7 7
参考にしたもの
わわわIT用語辞典 > 違いの分かるピヨピヨ > 「関数」と「メソッド」の違い
*1:もちろんvarで宣言してから、メンバを別の式で代入してもよい。
TensorFlow
TensorFlowとは
Googleが開発しオープンソースで公開している、機械学習に用いるためのソフトウェアライブラリ。
Big Queryとの連携
Big Queryとの連携も可能らしい。
BigQuery MLでTensorFlowのモデルを呼び出す - Qiita
参考にしたもの
CPU使用率とは
CPU使用率とは
文脈に応じて2つの意味がある。
- コンピュータで実行中のあるプログラムがCPUの処理時間を占有している割合。
- 全プログラムに関するその総和
後者の2. の意味において、使用率が0%なら何も実行されておらず、100%ならCPUが休みなくフル稼働している。
参考にしたもの
AWS上で利用できるRDB
Amazon RDS
Amazonが提供するフルマネージドのRDBMS(Relational Data Base Management System)のサービス。
Amazon Auroraとは
Amazonが提供するMySQL および PostgreSQL と互換性のあるクラウド向けのリレーショナルデータベース。Amazon RDSのデータベースインスタンスタイプ(データベースの種類のようなもの)の一つとして設定できる。
参考にしたもの
「フルマネージド」クラウドサービス~第一回・「フルマネージド(Fully Managed)」とは何か?~ - GiXo Ltd.