FreeBSD のスワップの実装が大きく変わっている ― 2017年10月01日 12時44分21秒
Replace global swhash in swap pager with per-object trie to track swap blocks assigned to the object pages. がその変更点で、blist にて管理していた各ブロック情報を、pctrie を用いての管理に書き換えられている。
良くは把握していないのだが、pctrie にはまだあれこれ関数が追加されているのを見ると、比較的新しい様だ。
昔の実装には struct swblock が使われていて、大きさは 276 だった。新しい実装で使われる構造体は二つになり、struct swblk で大きさは 72 で、swpctrie の大きさは 44。
C99 の bool 真偽型 ― 2017年10月02日 12時24分21秒
#include
bool val1 = false;
bool val2 = true;
BOOL、boolean、boolean_t 等と良く使われて、似て否なる物も多いので、どれがシステム規定のだかこんがらがりやすい。
ここ一ヵ月程 qq.com から来る迷惑メールが醜い ― 2017年10月03日 16時13分59秒
メールは、数字@qq.com から来ていて、中国語の様だ。UTF-8 で HTML メールの様。
十年以上前に設定した bogofilter のおかげで、全てが自動的にスパム判定されていて、目に直接降れることは無いが、受信とサーバからの削除に時間が掛かるようになった。
dtrace で特定の関数が呼ばれた時のコールスタックを取得 ― 2017年10月04日 21時04分47秒
swp_pager_meta_build がいつ呼ばれるか興味があったので、久しぶりに dtrace を使ってみることにした。stack と言う関数がある。
カーネル内では関数ポインタを設定して、あちこちに飛ぶことも多いので一部のコールスタックは、見た目程明らかではない。この出力は、11-STABLE で、11.1-RELEASE とは既にかなり異なっている。
# dtrace -n 'fbt::swp_pager_meta_build:entry{ stack() }'
dtrace: description 'fbt::swp_pager_meta_build:entry' matched 1 probe
dtrace: buffer size lowered to 6m
0 20744 swp_pager_meta_build:entry
kernel`swap_pager_putpages+0x266
kernel`vm_pageout_cluster+0x4e4
kernel`vm_pageout_laundry_worker+0x9c0
kernel`fork_exit+0x6a
kernel`0xc10a1b20
しかし、若干これらの関数を覗いてみたところ、一部が抜けているように見える。これから、動作を探りながら dtrace の実験もしてみたい。
FreeBSD 11-stable で i386 のカーネルがコンパイルできない ― 2017年10月07日 20時06分36秒
/usr/src/sys/i386/i386/mpboot.s:128:2: error: symbol 'KERNBASE' can not be undef
ined in a subtraction expression
movl ((IdlePTD)-KERNBASE), %eax
^
*** [mpboot.o] Error code 1
dtrace で vm_thread_new の呼ばれる場所を探る ― 2017年10月08日 11時02分38秒
$ dtrace -n 'fbt::vm_thread_new:entry{stack()}'
0 55259 vm_thread_new:entry
kernel`thread_alloc+0x28
kernel`sys_thr_new+0x67
kernel`syscall+0xa4b
kernel`0xc10a18fe
thread_alloc を見ると、thread_zone からメモリを割り当てているようだ。
struct thread*
thread_alloc(int pages)
{
...
td = (struct thread *)uma_zalloc(thread_zone, M_WAITOK);
FreeBSD 11-STABLE symbol の 'KERNBASE' can not be undef の件 ― 2017年10月11日 12時30分08秒
前回のカーネルバージョンは 324186。 324421 は既に駄目。 324300 も駄目。 324299 は大丈夫。
コンパイルエラーを手っ取り早く見付ける為なので、モジュールは全て無効にする。
もしかしたら、一ファイルだけをコンパイルする方法もあるのかも知れないが、これで十分。
% cd /usr/src
% make buildkernel -j 3 MODULES_OVERRIDE=''
問題を見付けたかと思ったら、rm /usr/obj/usr/src/sys/GENERIC/mpboot.o
の後に、324300 を試したら大丈夫。324385 は大丈夫。324400 は大丈夫。324472 も大丈夫。結局 HEAD に戻しても大丈夫。ファイルを消したら何が変わったのだろうか…
ジョージワシントン橋の南側の通路は柵を設置中 ― 2017年10月12日 13時53分45秒
作業の進みか方と内容からすると、二、三ヵ月ぐらいは余裕でかかりそうな感じ。
FreeBSD の syslog の出力を他のサーバに送る ― 2017年10月13日 12時50分24秒
syslog を受けたい側のサーバ側を 192.168.0.1 とする。そして、今回の syslog を送るクライアント側を 192.168.0.3 としよう。
ハンドブックの記述には、サーバの 192.168.0.1 側の /etc/syslog.conf に
に書くと記述されている。しかし、/etc/syslog.conf を見ると、/etc/syslog.d に入っているファイルも読み込むようだ。そこで、
+192.168.0.3
*.* /var/log/192.168.0.3.log
として、設定ファイルを作成し、ログファイルも作成する。
$ cat > /etc/syslog.d/192.168.0.3.conf
+192.168.0.3
*.* /var/log/192.168.0.3.log
^D
$ touch /var/log/192.168.0.3.log
その後、192.168.0.1 の /etc/rc.conf に
を記述。-v -v でログのレベルをあげることも出来る。
syslogd_enable="YES"
syslogd_flags="-a 192.168.0.3"
今度は 192.168.0.3 のクライアント側の設定。192.168.0.3 の /etc/rc.conf に
と書き、syslogd を起動するが、192.168.0.3 サーバでは syslogd のパケットを受け取らないように記述する。
syslogd_enable="YES"
syslogd_flags="-s"
paging in/out と swaping in/out の大まかな違い ― 2017年10月14日 14時06分45秒
そのため、swap out されたプロセスの実行は不可能になる。page out されただけなら、主メモリに残っている部分で、プロセスを実行することが出来る。paging は、プロセスのアドレス空間を細かく区切って管理すること。
システムでは、top などで swap と表示したり、スワップデバイス、スワップファイル等と呼んだりするので、page-out と混同しやすい。
最近のコメント