日経Linux 2月号を読んだ

概要

日経Linux 2月号(2014) に、カーネルの特集記事があったので買って読んでみた。
今まで知らなかった部分とか、便利そうなことについて、以下に記載する。

メモリ管理

buddy システム, スラブアロケータについて書かれていた。
この本よりもっと詳しく書かれたページを発見したのでコチラを参照。
http://www.coins.tsukuba.ac.jp/~yas/coins/os2-2011/2012-01-17/

systemtap

system tap とは https://access.redhat.com/site/ja/node/289453 にある通り

実行している Linux カーネルで簡易情報を取得できるようにする革新的なツールです。

である。

install 方法(@CentOS)

vagrant で建てた CentOS を使ってやってみる。
Vagrantfile 的に
config.vm.box = “Berkshelf-CentOS-6.3-x86_64-minimal”
この box を使っている人は以下の通りでインストールできると思います。

sudo yum -y install systemtap
cd /tmp
wget http://debuginfo.centos.org/6/x86_64/kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64.rpm
wget http://debuginfo.centos.org/6/x86_64/kernel-debug-debuginfo-2.6.32-279.el6.x86_64.rpm
sudo yum install kernel-debuginfo-common-x86_64-2.6.32-279.el6.x86_64.rpm
sudo yum install kernel-debug-debuginfo-2.6.32-279.el6.x86_64.rpm

# これで stap がつかえる
stap

## 追記
(これだと probe.kernel が使えないっぽい.. 要調査。)

あとは http://sourceware.org/systemtap/examples/
ここから
vm.tracepoints.stp や, sched_switch.stp を落として来て実行できる。

(参考)
http://stts.hatenablog.com/entry/20090614/1244952417

プロセスのメモリ割付について

/proc/[processId]/maps (これをメモリーマップと呼ぶ。)を参照すれば、どのようにメモリが割り付けられているかがわかる。

vi hoge.c
-----
#include <stdio.h>

int main(void) {
  char hoge[4096] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

printf("sleep start\n");
  sleep(500000);
printf("sleep stop\n");
  return 0;
}

ps aux | grep a.out
vagrant  19157  0.0  0.0   3928   408 pts/1    S+   04:41   0:00 ./a.out
vagrant  19164  0.0  0.0 107456   948 pts/0    S+   04:42   0:00 grep a.out


cd /proc/
cat /proc/19157/maps

00400000-00402000 r-xp 00000000 fd:00 3590                               /tmp/a.out
00601000-00602000 rw-p 00001000 fd:00 3590                               /tmp/a.out
7fdf912e5000-7fdf91470000 r-xp 00000000 fd:00 3071                       /lib64/libc-2.12.so
7fdf91470000-7fdf9166f000 ---p 0018b000 fd:00 3071                       /lib64/libc-2.12.so
7fdf9166f000-7fdf91673000 r--p 0018a000 fd:00 3071                       /lib64/libc-2.12.so
7fdf91673000-7fdf91674000 rw-p 0018e000 fd:00 3071                       /lib64/libc-2.12.so
7fdf91674000-7fdf91679000 rw-p 00000000 00:00 0
7fdf91679000-7fdf91699000 r-xp 00000000 fd:00 3437                       /lib64/ld-2.12.so
7fdf9188e000-7fdf91891000 rw-p 00000000 00:00 0
7fdf91896000-7fdf91898000 rw-p 00000000 00:00 0
7fdf91898000-7fdf91899000 r--p 0001f000 fd:00 3437                       /lib64/ld-2.12.so
7fdf91899000-7fdf9189a000 rw-p 00020000 fd:00 3437                       /lib64/ld-2.12.so
7fdf9189a000-7fdf9189b000 rw-p 00000000 00:00 0
7fff2a0dc000-7fff2a0f1000 rw-p 00000000 00:00 0                          [stack]
7fff2a1b4000-7fff2a1b5000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

下から見ると、 systemcall が呼ばれる領域(カーネル仮想空間)があるのと、 stack が積まれる領域があるのと、
shared object がリンクされている領域と、 テキスト(プログラム)が格納されている領域があるのが見て取れる。

左端から、仮想アドレス、アクセス属性、データオフセット、 デバイスのメジャー番号とマイナー番号、 inode, ファイル名とのこと。

カーネル時計

Linux カーネルは 起動時には、PC の内蔵時計を使用するが、それ移行は独自のカーネル時計を使用する。
ミリ秒からナノ秒の処理が必要であるため。

I/Oスケジューラー

入出力するブロックデータを並び替えて入出力を高速化できるもの。

http://city.hokkai.or.jp/~hachikun/IOScheduler.html
http://www.valinux.co.jp/technologylibrary/document/linuxkarnel/cfq0001/

このエントリーをはてなブックマークに追加