Knのアウトプット

Knです。IT系。学んだことをアウトプットします。詳細な記述は世の中いくらでもあるので、自分がそらで説明できるくらい短くまとめて。

sar

sarとは

sar(System Admin Reporter)とはLinux上でのリソース情報を取得するツール(コマンド)で、sysstatパッケージの一部に含まれている。CPU、メモリ、ディスク、ネットワークに関する情報が取得できる。取得対象は実行時のオプションを指定することで変更することができる。本記事ではオプションや、実行時の各データの意味の詳細は割愛する。

使い方

コマンドによる一時的な実行

sar (取得対象を指定するオプション) 情報取得間隔 情報取得回数を実行すればよい。以下は実行例である。取得対象を指定しなかったため、デフォルトのCPUに関する値が取得されている。

# sar 1 5
Linux 3.10.0-1127.el7.x86_64 (localhost.localdomain)    2020年10月02日  _x86_64_        (1 CPU)

07時14分02秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
07時14分03秒     all      0.00      0.00      0.00      0.00      0.00    100.00
07時14分04秒     all      0.00      0.00      0.99      0.00      0.00     99.01
07時14分05秒     all      0.00      0.00      0.99      0.00      0.00     99.01
07時14分06秒     all      0.00      0.00      0.00      0.00      0.00    100.00
07時14分07秒     all      0.00      0.00      0.00      0.00      0.00    100.00
平均値:      all      0.00      0.00      0.40      0.00      0.00     99.60

定期的なシステムの状態の保存

人がコマンドでsarを実行する以外に、sysstatとして定期的にシステム状態を保存する仕組みが用意されている。

sysstatにはsarのほかにsadcコマンドが含まれている。sarはsadcと連動して動作する。sadcはシステム状態をバイナリ形式で収集するコマンドで、sarはsadcが収集したバイナリデータをテキスト形式に変換する。sysstatパッケージにはsa1、sa2*1というスクリプトが用意されている。sa1はsadcコマンドの実行を行うもの、sa2はsarの実行を行うもので、スクリプト内では入出力ファイル等を定義している。sa1はsaXX(XXは日付)というファイルにバイナリデータを出力する。sa2はsaXXをsarXX(XXは日付)というテキストファイルに変換する。sa1とsa2の定期実行はcronに記載されている。デフォルトの実行設定はではsa1は10分ごと、sa2は1日1回である*2

f:id:tanke25616429:20201002064843p:plain
sar/sadcの関係(https://www.atmarkit.co.jp/ait/articles/0303/15/news004_2.htmlより引用)

sadf

sarによって作られたテキストデータをCSVXML等のフォーマットに整形するsadfというツールもある。システムのログ情報を機械可読性の高い形式にすることがsadfの1つの目的である。

参考にしたもの

wing-degital.hatenablog.com

linux.die.net

障害の兆候を見逃さないためのサーバ監視 (2/3):Linux管理者への道(7) - @IT

sar で収集したリソース使用情報が sadf コマンドで TSV として出力できる - 映画は中劇

linux.die.net

qiita.com

*1:sa1は/usr/lib/sa/sa1もしくは/usr/lib64/sa/sa1に配置されている。sa2も/usr/lib/sa/sa2や/usr/lib64/sa/sa2に配置。

*2:データの出力(sadc)は頻繁に行い、データの変換(sar)は1日1回まとめて、ということだろう。

udev

udevとは

udevとは、Linuxカーネル用のデバイス管理ツールのこと。

udev

udevはデバイスファイルを動的に管理するための仕組みで、ハードウェアがシステムに接続された際に対応するデバイスファイルを作成する役割を持つ。udevdというデーモンプログラムとして動作している。なお、ハードウェアの検出はudevの役割ではなくカーネルが行っており、udevdはカーネルからその情報を受け取り、機能する。

参考にしたもの

https://ja.m.wikipedia.org/wiki/Udev

いますぐ実践! Linuxシステム管理

ストレージ

ストレージとは

データを蓄積する入れ物のこと。具体的には文脈に応じて取る意味が異なる。IT*1の文脈に限っても以下の使い方がある。

  • コンピュータ内の記憶装置(HDDやSDD等の補助記憶装置や、USBメモリ等の外部記憶装置)
  • ストレージサーバのこと

ITシステムにはストレージは不可欠な存在であり、必ずストレージ機能を提供しているものがどこかにある。個々のシステムで「ストレージ」と言う言葉が何を指しているのかは利用している機器、ソフトウェア、アーキテクチャなどにより多岐にわたる*2

ストレージサーバについて

ストレージサーバは、サーバの一種でストレージを機能として提供することを目的としている*3。ストレージを制御するソフトウェアがストレージサーバには搭載されている。

ストレージサーバもハードウェアと一体化しているものが多いが、ソフトウェアとして提供されており汎用のサーバ機器上にストレージソフトウェアをインストールして利用するものもある*4

参考にしたもの

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典>ストレージ

ストレージOSって何?初心者のための基礎講座 | ストレージチャンネル

*1:本ブログの主旨からして当たり前だが。

*2:LinuxサーバにNFSをインストールしてデータ置き場にしているパターンや、VMwareのESXiサーバにvSANをインストールして仮想ストレージを形成するパターン、物理的なストレージをネットワーク経由で接続しているパターン等。人と会話するときはどういう意味で「ストレージ」と言っているかを確認しながら進めるのがよい。

*3:実は、この記述の裏付けとなる記事はなかったので、筆者の独自定義である。

*4:CiscoやJuniper等のハードウェア一体のネットワーク機器と、ネットワークにおけるNFVの関係と似ている。

記憶領域ごとのレイテンシの目安

背景

以前の記事(コンピュータにおける記憶領域 - Knのアウトプット)で、コンピュータでの各記憶領域の入出力の速さを比較した。実際のスケール感をイメージしておくためメモする。

レイテンシのスケール感比較

レイテンシの目安を示したサイトがあったので(計算機の代表的なレイテンシとスケール感Latency Numbers Every Programmer Should Know)、それを参考にまとめる*1。両サイトで数値にずれがある場合*2、両サイトの最大値と最小値を採用しその間に収まるものとする。カッコ内の何倍、というのはかなり端折った値にしている(規模をつかむのが重要なため)。

  • CPUサイクル(基準):0.3ns*3
  • キャッシュ:1ns~10数ns(基準の3倍~5倍程度、数クロック程度)*4
  • メモリ:100ns~120ns(基準の30倍~40倍、キャッシュアクセスの10~100倍)
  • SSD:16μs~150μs(基準の5×104倍~5×105倍、メモリアクセスの100倍~1000倍)
  • HDD:1ms~10ms(基準の3×106~3×107倍、SSDの100倍~1000倍)

いろいろなケースをすごく乱暴に省略すると、CPUサイクルは1ns未満、キャッシュはその数倍、メモリはその100倍、SSDはその100倍、HDDはその100倍、というのが覚えやすい。

その他興味深い数値

Latency Numbers Every Programmer Should Know によると同一データのラウンドトリップタイムは500μs程度。

一方、第2回 ネットワーク遅延と高速化:教科書には載っていない ネットワークエンジニアの実践技術|gihyo.jp … 技術評論社によれば、東京~大阪でのネットワーク遅延が20ms程度が目安なので、当たり前だが同一マシン内のデータアクセスや同一データセンタ内のデータアクセスに比べれば低速である。ping値の測定方法と速度目安 どれくらいの速度ならOK? | フレッツ光ナビによると、オンラインゲームをするケースでは20msは超高速ではないが高速といった体感で、50msを超えると人間に遅延が体感されるらしい。

参考にしたもの

計算機の代表的なレイテンシとスケール感 - ゆううきメモ

Numbers Every Programmer Should Know By Year

NetApp HCI -番外編- NetApp HCIの圧倒的ストレージパフォーマンスっ!!|技術ブログ|C&S ENGINEER VOICE

www.idcf.jp

e-words.jp

ping値の測定方法と速度目安 どれくらいの速度ならOK? | フレッツ光ナビ

第2回 ネットワーク遅延と高速化:教科書には載っていない ネットワークエンジニアの実践技術|gihyo.jp … 技術評論社

*1:IOPSやスループットの指標は本記事の対象外とする

*2:おそらく、実験条件の違いや、ハードウェアそのもの速度の進歩があるため、計測した時期によって違う。

*3:クロック周波数がだいたいGHz(=109 Hz)オーダーなのでクロック周期はその逆数で10-9でnsオーダーになる。

*4:当然L1<L2<L3だが、いずれにしてもこの範囲に収まる。

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で宣言してから、メンバを別の式で代入してもよい。

TensorFlow

TensorFlowとは

Googleが開発しオープンソースで公開している、機械学習に用いるためのソフトウェアライブラリ。

Big Queryとの連携

Big Queryとの連携も可能らしい。

BigQuery MLでTensorFlowのモデルを呼び出す - Qiita

参考にしたもの

TensorFlow - Wikipedia