OSCにて、著者様ご本人から直接売って頂いた『Linuxのしくみ』ですが、読むの遅くてモタモタしてましたが無事読み終わりましたので軽く感想など書かせていただければと思います。遅かったのは花粉症とMHWのせいだ。
[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識
- 作者: 武内覚
- 出版社/メーカー: 技術評論社
- 発売日: 2018/02/23
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
読んだ人
- Linux触り出してそろそろ10年目(マジかウソだろおい…)
- だいぶ前に職場でカーネル2.6解読室とかの輪講とかはやってたけど「お、おう」くらいな理解度だった
- Kernelのコードまで読んだ経験はあまり無い
- 難易度の高くないLAMP周りをボチボチ(高負荷になることが無い簡素なUIとか)
- iptablesとかnetfilter周りをボチボチ
- OSSでVPN繋ぐとかボチボチ
微妙なスペックという自負があります。そんな私にはすごくためになった。試すの大事。
全体的に
前提知識が僅かにあったことはあると思いますが、「分かりやすっ!」というのが全体的な印象でした。前書きにも書かれていたとおり、図表を用いて簡潔に説明してもらえるのが凄く良いです。それこそ昔読んだカーネル解読室とかは、図がソースコードの構造体ベースで書かれてたりしてなかなかピンと来なかった記憶があります(ゴメンナサイ、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 : 01時15分39秒 pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff 01時15分40秒 0.00 0.00 32.67 0.00 1225.74 0.00 0.00 0.00 0.00 01時15分41秒 0.00 0.00 27.00 0.00 1243.00 0.00 0.00 0.00 0.00 01時15分42秒 0.00 0.00 25.00 0.00 22725.00 0.00 0.00 0.00 0.00 ★ oflag=directあり実行時 1GBがすぐにページアウト 01時15分43秒 0.00 58373.00 540.00 0.00 2711.00 0.00 0.00 0.00 0.00 01時15分44秒 0.00 323584.00 18.00 0.00 1349.00 0.00 0.00 0.00 0.00 01時15分45秒 0.00 580608.00 28.00 0.00 936.00 0.00 0.00 0.00 0.00 01時15分46秒 0.00 85164.36 1950.50 0.00 3528.71 0.00 0.00 0.00 0.00 01時15分47秒 0.00 0.00 17.82 0.00 1337.62 0.00 0.00 0.00 0.00 01時15分48秒 0.00 0.00 17.82 0.00 890.10 0.00 0.00 0.00 0.00 : 01時15分51秒 0.00 0.00 18.00 0.00 900.00 0.00 0.00 0.00 0.00 01時15分52秒 0.00 0.00 16.82 0.00 1261.68 0.00 0.00 0.00 0.00 ★ oflag=direct なし実行時 部分的にすぐページアウト、その後じわりとページアウト 01時15分53秒 0.00 106512.00 541.00 0.00 2237.00 0.00 0.00 0.00 0.00 01時15分54秒 0.00 256000.00 18.00 0.00 2021.00 0.00 0.00 0.00 0.00 01時15分55秒 0.00 299168.63 27.45 0.00 1317.65 0.00 0.00 0.00 0.00 01時15分56秒 0.00 131072.00 1998.00 0.00 3093.00 0.00 0.00 0.00 0.00 01時15分57秒 0.00 0.00 18.00 0.00 2309.00 0.00 0.00 0.00 0.00 01時15分58秒 0.00 73.53 17.65 0.00 882.35 0.00 0.00 0.00 0.00 01時15分59秒 0.00 0.00 18.63 0.00 2331.37 0.00 0.00 0.00 0.00 01時16分00秒 0.00 0.00 17.65 0.00 1540.20 0.00 0.00 0.00 0.00 01時16分01秒 0.00 86016.00 26.00 0.00 2037.00 0.00 0.00 0.00 0.00 01時16分02秒 0.00 163840.00 18.00 0.00 2402.00 0.00 0.00 0.00 0.00 01時16分03秒 0.00 0.00 18.00 0.00 1569.00 0.00 0.00 0.00 0.00 01時16分04秒 0.00 0.00 18.00 0.00 2075.00 0.00 0.00 0.00 0.00 01時16分05秒 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/秒
まあまあ近くなりました。やっぱ人権のある環境は実験結果も違うんだなー・・・
とまあ、それはただの妬みとして、こんな感じでちょっと違う結果が出て、なんでだろ~ってなることがやっぱ重要だなあと(往々にしてそのままになりがちだけど…)。こういう罠(今日日の4GBは罠じゃないだろ)的な演習がちょいちょい仕込まれてるのもいいかもしれないですね。輪講とかやるなら特に。
7章 ファイルシステム
ファイルシステムは自分が関わらない所で決まってたのであまり調べたことが無く、知らないことがたくさんあって勉強になりました。Brtfs推し感が強いです(笑
P.215 まずは適当なパーティションを用意しましょう
8章でも流れでしれっと出てきますが、mkfsできる適当なパーティションって皆さん常備されてるもの?MOCO`S キッチンでサラッと出てくる、聞いたこと無い野菜やオイルのような印象を受ける人もいるかもと感じましたが・・・私だけ・・・?素人すぎ?
そんなわけで、8章とかはとりあえずVMの仮想デバイスで軽く試してみました。概ね傾向は同じだったけど、たまに うちゅうの ほうそくが みだれる 感じになった。けど・・・深掘りしてません・・・
誤記的なこと
- P.230 欄外「あるいは4096キロバイトです」
HDDセクタ4096KBは・・・すごく・・・大きいです・・・
- P.235 4行目 「使ってください。。」
"。"が一個余分。こまけー。
他見つけたのは正誤表に載っていました。
linuxのしくみのご意見集 - Google スプレッドシート
終わりに
大抵積読になりがちな私ですが、なんだかんだ大体試してしまいました。意外と副次的に学びがあったのは sar の使い方とかだったりします。何だかんだあんまり使ってなかったり、決まったオプションしか覚えてないとかだったので…(アカン)
後輩から聞かれても「さあ…」って感じでしたし。(これが言いたかっただけ1スベリ)
これでいざ必要なときに sar が使えなくて顔がサーッと青くなることも無くなりますね!(笑いの統計情報が0に張り付く2スベリ)
ついダジャレ言うの忘れちゃうから最後に言っておいた。どうもスイマセンでした。
参考リンクなど
ページキャッシュ周りでお世話になりました
Linuxにおけるメモリ管理 - MogLog
Linuxページキャッシュの設定を変更してWrite I/Oをチューニングしたメモ - YOMON8.NET
いまさら聞けないLinuxとメモリの基礎&vmstatの詳しい使い方 - Qiita