Closed hayashi-ay closed 1 year ago
strace
コマンドでプロセスが発行したシステムコール一覧を見ることができる。sar
コマンドでCPUの使用率が見れる。-P
オプションをつけることで指定した論理CPUの統計情報が見れる。taskset
コマンドでどのCPUでプログラムを実行するかを指定できる。ldd
コマンドでプログラムに紐付けられている共有ライブラリを表示できる。ld-linux-x86-64.so.2
共有ライブラリをロードするための特別なライブラリ。C, Go, pythonでそれぞれ"hello world\n"
という文字列を出力するプログラムを実行してシステムコールの発行数を調べたところ、31, 183, 724だった。
Cのプログラムについて-static
オプションを付けて静的リンクしたとこと12まで減った。動的リンクだとロードしてくるのにシステムコールの発行がされている。
readelf
コマンドによって得られる。gcc
はデフォルトではすべてのプログラムをPIEとしてビルドするが-no-pie
オプションをつけることで無効化できる。pstree
コマンドはプロセスの親子関係を木構造で表示してくれる。ps aux | less
のようにbashでパイプを使ってプロセスを生成したプロセスは同じプロセスグループに属する。図02-08 が分かりやすい。kernel.ched_latency_ns
パラメータで設定されている。
1つの論理CPU上で同時に動かすプロセス数を1, 2, 3と増やしていき、それぞれの場合についてタスクの進捗率と経過時間の2軸のグラフを作成した。 1つの論理CPU上で同時に動かけるプロセスは1つだけということが視覚的にも分かる。tasksetで論理CPU0を使うように指定している。 並列度が2のときと比べて3のときの方が各プロセスのタイムスライスは短くなる。タスクの実行順序が入れ替わったり、緑->黄->緑->青みたいになっているところがある。
kernel.ched_latency_ns
パラメータについて手元で試したら設定されていなかった。
$ sysctl kernel.sched_latency_ns
sysctl: cannot stat /proc/sys/kernel/sched_latency_ns: No such file or directory
解釈がよく分からない。Gitpod上で検証していて他のプロセスも動いているため、雑音が多いのかもしれない。タスク的にはメモリアクセスは行わない、整数演算ユニットのみを使うのでSMTの効果はなくむしろ逆効果のはず。
論理CPU数は16でSMT(Simultaneous Multi Threading)が有効になっている。 Gitpod上だと当該ファイルがreadonly file systemにmountされていてSMTをoffにできなかった。
$ grep -c processor /proc/cpuinfo
16
$ cat /sys/devices/system/cpu/smt/control
on
Ubuntuのデフォルトではトランスペアレントヒュージページの設定はmadviseになっている。
$ cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never
$ mount
...
sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)
...
proc on /proc/sys type proc (ro,relatime)
ページフォールトのうち、ページインによってストレージデバイスへのアクセスが発生したものをメジャーフォールト、それ以外をマイナーフォールトと呼ぶ。
L1キャッシュ32(2^5)K, L2キャッシュ512(2^9)K, L3キャッシュ32768(2^15)K。
各キャッシュの上限を境界として階段状に変化することを期待したがいまいち期待通りにならなかった。特にL1キャッシュの境界についてアクセス速度が下がらなかった。バッファサイズが小さい際にはメモリへのアクセスに対して変数のインクリメントなどの命令のコストが無視できなく、バッファサイズが増えることによりそれらが相対的に小さくなりアクセス速度が向上する効果とL2キャッシュに切り替わることによるアクセス速度の低下が打ち消し合って境界ではっきりと階段上にならなかったのではと推測。
$ cat /sys/devices/system/cpu/cpu0/cache/index1/size # L1キャッシュ
32K
$ cat /sys/devices/system/cpu/cpu0/cache/index2/size #L2キャッシュ
512K
$ cat /sys/devices/system/cpu/cpu0/cache/index3/size #L3キャッシュ
32768K
dd if=/dev/zero of=testfile oflag=sync bs=1G count=1
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 4.89322 s, 219 MB/s
$ dd if=/dev/zero of=testfile bs=1G count=1
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.02759 s, 1.0 GB/s
準仮想化、仮想マシンによってハードウェアを完全にエミュレートするのではなく、ハイパーバイザとゲストOSの連携で性能改善を図るタイプの仮想化技術。疑似仮想化とも呼ばれる。
物理マシンに直接Ubuntuをインストールしないと検証できなさそうで断念。
面白かったです。システムコールを呼んだ後のことはあまり分かっていなかったのですが図も豊富にあり理解が深まりました。
https://www.amazon.co.jp/dp/429713148X