スベリミナル効果

技術的なことを書こうと思ってたけど何でも書くことにします


通常用

ふざけ用
何でもコメントください。誤り指摘コメントなどには「コメン(ゴメン)」ト誤ります(1スベリ)
ダジャレ好きの方はこちらにどうぞ(更新してないけど)→スベリブログ2.0

『Linuxのしくみ』を読みました

OSCにて、著者様ご本人から直接売って頂いた『Linuxのしくみ』ですが、読むの遅くてモタモタしてましたが無事読み終わりましたので軽く感想など書かせていただければと思います。遅かったのは花粉症とMHWのせいだ。

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

読んだ人

  • Linux触り出してそろそろ10年目(マジかウソだろおい…)
  • だいぶ前に職場でカーネル2.6解読室とかの輪講とかはやってたけど「お、おう」くらいな理解度だった
  • Kernelのコードまで読んだ経験はあまり無い
  • 難易度の高くないLAMP周りをボチボチ(高負荷になることが無い簡素なUIとか)
  • iptablesとかnetfilter周りをボチボチ
  • OSSVPN繋ぐとかボチボチ

微妙なスペックという自負があります。そんな私にはすごくためになった。試すの大事。

全体的に

前提知識が僅かにあったことはあると思いますが、「分かりやすっ!」というのが全体的な印象でした。前書きにも書かれていたとおり、図表を用いて簡潔に説明してもらえるのが凄く良いです。それこそ昔読んだカーネル解読室とかは、図がソースコードの構造体ベースで書かれてたりしてなかなかピンと来なかった記憶があります(ゴメンナサイ、7年前当時ということもありますが…)。

知らないことを理解するには、まず全体像・概要を掴んでから詳細に進むのが近道だと思うので、そういう意味で「まずはこの本読んでおこうか」と勧められる本ではないでしょうか。と言っても、課題意識が無いと頭に入らないので、Linuxのトラブルに悩まされ始めたあたりでそっと横に置いておき、自発的に読んでもらえると「おお、なるほどおお」ってなるんじゃないかなあと。私もその頃に読みたかったこれ。

また、5章以降はLinuxを長く触っていても「へー」となる内容がサラッと沢山書いてあります(10年やってたら常識やろ、と怒られるかもしれませんが…)。読むだけなら時間はかからないので、サッと読んでみるだけでも損はしない内容です、たぶん。初学者はもちろん、タラタラやってきた中堅にもビシっと響くポイントがあると思います。

以下、ちょろちょろ試してて思った細かい点をいくつか。

4章 プロセススケジューラ

プロット

みんなこういうのどうやってプロットするのかしら。僕はgnuplotくらいしか知らんけど… plotの仕方は目的じゃないから簡単にプロットできる方法があるといいかなあと思いました。取り急ぎクソコード置いときます。

#!/bin/bash

plot1() {
        file=$1; [ ! -e "$file" ] && { echo "file doesn't exist!"; exit -1; }
        gnuplot -e "set ytic 1; plot \"$file\" u 2:1 w p pt 6; pause -1"
}

plot2() {
        file=$1; [ ! -e "$file" ] && { echo "file doesn't exist!"; exit -1; }
        gnuplot -e "plot \"< grep ^0 $file\" u 2:3 w p, \"< grep ^1 $file\" u 2:3 w p, \"< grep ^2 $file\" u 2:3 w p, \"< grep ^3 $file\" u 2:3 w p; pause -1"
}

case "$1" in
        p1|plot1) plot1 $2 ;;
        p2|plot2) plot2 $2 ;;
        *) echo "usage: $0 plot1|plot2 filename"; exit 1;;
esac
$ yum install gnuplot
$ ./myplot.sh p2 1core-2process.txt 

6章 記憶階層

結果が合わない!?

ここまでは概ね同じ結果を得られていましたが、 P.183「ファイル書き込みの実験」であれ?ってなりました。

$ dd if=/dev/zero of=testfile bs=1M count=1K oflag=direct
1024+0 レコード入力
1024+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 2.21413 秒、 485 MB/秒
$ dd if=/dev/zero of=testfile bs=1M count=1K 
1024+0 レコード入力
1024+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 1.20976 秒、 888 MB/秒

おや、directの有無で本に書かれているほどの差(8倍界王拳)が出ないなあと。sarを見てみると...

$ sar -B 1
   :
011539秒  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
011540秒      0.00      0.00     32.67      0.00   1225.74      0.00      0.00      0.00      0.00
011541秒      0.00      0.00     27.00      0.00   1243.00      0.00      0.00      0.00      0.00
011542秒      0.00      0.00     25.00      0.00  22725.00      0.00      0.00      0.00      0.00
★ oflag=directあり実行時 1GBがすぐにページアウト
011543秒      0.00  58373.00    540.00      0.00   2711.00      0.00      0.00      0.00      0.00
011544秒      0.00 323584.00     18.00      0.00   1349.00      0.00      0.00      0.00      0.00
011545秒      0.00 580608.00     28.00      0.00    936.00      0.00      0.00      0.00      0.00
011546秒      0.00  85164.36   1950.50      0.00   3528.71      0.00      0.00      0.00      0.00
011547秒      0.00      0.00     17.82      0.00   1337.62      0.00      0.00      0.00      0.00
011548秒      0.00      0.00     17.82      0.00    890.10      0.00      0.00      0.00      0.00
   :

011551秒      0.00      0.00     18.00      0.00    900.00      0.00      0.00      0.00      0.00
011552秒      0.00      0.00     16.82      0.00   1261.68      0.00      0.00      0.00      0.00
★ oflag=direct なし実行時 部分的にすぐページアウト、その後じわりとページアウト
011553秒      0.00 106512.00    541.00      0.00   2237.00      0.00      0.00      0.00      0.00
011554秒      0.00 256000.00     18.00      0.00   2021.00      0.00      0.00      0.00      0.00
011555秒      0.00 299168.63     27.45      0.00   1317.65      0.00      0.00      0.00      0.00
011556秒      0.00 131072.00   1998.00      0.00   3093.00      0.00      0.00      0.00      0.00
011557秒      0.00      0.00     18.00      0.00   2309.00      0.00      0.00      0.00      0.00
011558秒      0.00     73.53     17.65      0.00    882.35      0.00      0.00      0.00      0.00
011559秒      0.00      0.00     18.63      0.00   2331.37      0.00      0.00      0.00      0.00
011600秒      0.00      0.00     17.65      0.00   1540.20      0.00      0.00      0.00      0.00
011601秒      0.00  86016.00     26.00      0.00   2037.00      0.00      0.00      0.00      0.00
011602秒      0.00 163840.00     18.00      0.00   2402.00      0.00      0.00      0.00      0.00
011603秒      0.00      0.00     18.00      0.00   1569.00      0.00      0.00      0.00      0.00
011604秒      0.00      0.00     18.00      0.00   2075.00      0.00      0.00      0.00      0.00
011605秒      0.00      0.00     26.67      0.00   1099.05      0.00      0.00      0.00      0.00

ページキャッシュすぐ吐き出されてるなあ…なんでや… と、わりと悩んでしまいました… うん、メモリ4GBしか無かってん。非推奨と言われつつ仮想マシンの4GBメモリ割り当てLinuxでやってたので…

$ free -m
              total        used        free      shared  buff/cache   available
Mem:           3790         750        1392           1        1647        2763
Swap:          3275           0        3275

ちょっと追加で調べると、Linuxは空きメモリ全部をページキャッシュ候補とすると。その前提で、本に載ってるパラメータ vm.dirty_xxx を考えなきゃアカンと。 /proc/vmstat を見ると現状の具体的なしきい値が分かります。

$ sysctl -a |grep vm.dirty
 :
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 30 ★私の環境では30でした
vm.dirty_writeback_centisecs = 500
$ cat /proc/vmstat  |grep nr_dirt
nr_dirty 3
nr_dirtied 266252
nr_dirty_threshold 210895 ★この値はページ数なので、この値×4KBを超えると吐き出すわけですね
nr_dirty_background_threshold 70298

要は、私の環境では、ページキャッシュが800MBを超えてくるとすぐにページアウトするため、そのIO時間がかかってしまうわけですね。じゃあratio上げて1GBが収まればいいわけだと。

$ sudo sysctl -w vm.dirty_ratio=90
vm.dirty_ratio = 90
$ dd if=/dev/zero of=testfile bs=1M count=1K 
1024+0 レコード入力
1024+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 0.3842 秒、 2.8 GB/秒

まあまあ近くなりました。やっぱ人権のある環境は実験結果も違うんだなー・・・

cybozushiki.cybozu.co.jp



とまあ、それはただの妬みとして、こんな感じでちょっと違う結果が出て、なんでだろ~ってなることがやっぱ重要だなあと(往々にしてそのままになりがちだけど…)。こういう罠(今日日の4GBは罠じゃないだろ)的な演習がちょいちょい仕込まれてるのもいいかもしれないですね。輪講とかやるなら特に。

7章 ファイルシステム

ファイルシステムは自分が関わらない所で決まってたのであまり調べたことが無く、知らないことがたくさんあって勉強になりました。Brtfs推し感が強いです(笑

P.215 まずは適当なパーティションを用意しましょう

8章でも流れでしれっと出てきますが、mkfsできる適当なパーティションって皆さん常備されてるもの?MOCO`S キッチンでサラッと出てくる、聞いたこと無い野菜やオイルのような印象を受ける人もいるかもと感じましたが・・・私だけ・・・?素人すぎ?

そんなわけで、8章とかはとりあえずVMの仮想デバイスで軽く試してみました。概ね傾向は同じだったけど、たまに うちゅうの ほうそくが みだれる 感じになった。けど・・・深掘りしてません・・・

誤記的なこと

HDDセクタ4096KBは・・・すごく・・・大きいです・・・

  • P.235 4行目 「使ってください。。」

"。"が一個余分。こまけー。

他見つけたのは正誤表に載っていました。

linuxのしくみのご意見集 - Google スプレッドシート

終わりに

大抵積読になりがちな私ですが、なんだかんだ大体試してしまいました。意外と副次的に学びがあったのは sar の使い方とかだったりします。何だかんだあんまり使ってなかったり、決まったオプションしか覚えてないとかだったので…(アカン)

後輩から聞かれても「さあ…」って感じでしたし。(これが言いたかっただけ1スベリ)

これでいざ必要なときに sar が使えなくて顔がサーッと青くなることも無くなりますね!(笑いの統計情報が0に張り付く2スベリ)


ついダジャレ言うの忘れちゃうから最後に言っておいた。どうもスイマセンでした。

参考リンクなど

ページキャッシュ周りでお世話になりました

Linuxにおけるメモリ管理 - MogLog
Linuxページキャッシュの設定を変更してWrite I/Oをチューニングしたメモ - YOMON8.NET
いまさら聞けないLinuxとメモリの基礎&vmstatの詳しい使い方 - Qiita