tanke25616429のアウトプット

IT技術の基本を勉強したことをアウトプットします。Linux、Kubernetes、クラウド中心です。百番煎じくらいだけど誰かの役に立てばそれはそれでうれしい。

vmstat

はじめに

Linuxの性能指標を確認するコマンドのうちvmstatについてまとめる。

vmstatとは

仮想メモリやCPU、ディスクI/Oの統計情報を表示するコマンド。システム*1全体に関する統計情報を表示するため、CPUごとやプロセスごとの情報を取得する場合は別のコマンドを利用する(mpstat -Ptopps 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処理で待ち状態のプロセスの数。

rbを足したものをロードアベレージと呼ぶ。つまり、ロードアベレージは平均での実行待ちプロセスである。

memory

swpd は使用している仮想メモリの量(KB単位)*3

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。

参考にしたもの

techbookfest.org

www.atmarkit.co.jp

g-network.boo.jp

milestone-of-se.nesuke.com

b.l0g.jp

*1:ある物理マシンもしくは仮想マシン、単独のLinux OSが動いている範囲。

*2:多くの場合はこちらが該当すると思われる。

*3:参考文献含め、swpdの定義に「使用しているスワップ領域の量を表す。」という文が追加されているケースが散見する。しかし、仮想メモリスワップのはずなので、「使用しているスワップ領域を表す。」という文章は適切ではないと思う。仮想メモリの実体として、物理メモリが対応しているケースと、スワップ領域(ディスク)が対応しているケースがあるので、ここを正確に言うなら「使用しているスワップ領域と物理メモリの合計を表す」くらいだろうか。

*4:ディスクよりメモリへの読み書きのほうが高速である。

*5:自分は「スワップからイン」「スワップへアウト」と覚えている。どちらも8文字になるというのがテレコに覚えるのを防いでいる。

*6:レジスタの値等をメモリに退避しているため、その時間がかかる。

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という構造体を定義し、構造体のメンバに34を代入してから、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-engineer-info.com

Goの関数とメソッドの違いを解説する | KATUBLO

わわわIT用語辞典 > 違いの分かるピヨピヨ > 「関数」と「メソッド」の違い

【初心者向け!】Javaのメソッド(関数)の使い方

オブジェクト (プログラミング) - Wikipedia

skatsuta.github.io

*1:もちろんvarで宣言してから、メンバを別の式で代入してもよい。

スワップインとスワップアウト

# 動機 スワップインとスワップアウトがどちらがどちらか混乱するのでメモする。

スワップアウトとは

物理メモリが不足した場合に、メモリ上の利用されていないデータを外部ディスクに退避すること。スワップにアウトと覚える。

スワップインとは

外部ディスクに退避していたデータを利用するために物理メモリに書き戻すこと。スワップからインと覚える。

参考にしたもの

e-words.jp

https://wa3.i-3-i.info/word1720.html

CPU使用率とは

CPU使用率とは

文脈に応じて2つの意味がある。

  1. コンピュータで実行中のあるプログラムがCPUの処理時間を占有している割合。
  2. 全プログラムに関するその総和

後者の2. の意味において、使用率が0%なら何も実行されておらず、100%ならCPUが休みなくフル稼働している。

参考にしたもの

e-words.jp

AWS上で利用できるRDB

Amazon RDS

Amazonが提供するフルマネージドのRDBMS(Relational Data Base Management System)のサービス。

Amazon Auroraとは

Amazonが提供するMySQL および PostgreSQL と互換性のあるクラウド向けのリレーショナルデータベース。Amazon RDSのデータベースインスタンスタイプ(データベースの種類のようなもの)の一つとして設定できる。

参考にしたもの

aws.amazon.com

aws.amazon.com

RDSとAuroraを比較してみた|スクショはつらいよ

「フルマネージド」クラウドサービス~第一回・「フルマネージド(Fully Managed)」とは何か?~ - GiXo Ltd.

https://recipe.kc-cloud.jp/archives/7497

Big Query

Big Queryとは

Google が提供するペタバイト規模のデータ ウェアハウスとデータ解析ツール*1Google Cloud Storage等からBig Queryにデータをインポートするだけで分析を始められることがメリット。利用者はSQLさえ使えればよい。

データウェアハウスとは

目的別、時系列等のデータの分析に最適化した形でまとめてデータを蓄積できるデータの置き場。

参考にしたもの

cloud.google.com

www.topgate.co.jp

it-trend.jp

*1:Big Queryの公式ドキュメントでは「Google が提供するペタバイト規模の低料金フルマネージドのアナリティクスデータウェアハウス」と記載されていたが、「低料金」はユーザ目線ではどう思うかは人それぞれだし、「アナリティクスデータウェアハウス」という言葉はわかるようでわからないので、他記事を参照しつつこのような定義にした