FreeBSD のスワップの実装が大きく変わっている2017年10月01日 12時44分21秒

FreeBSD のスワップの実装に大きな変更が加えられている。12-CURRENT は既に変更済みで、11-STABLE にも一ヵ月ぐらい前に変更が降りてきていた。11.2-RELEASE と共に出ることになる。

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秒

C99 から bool 型が導入され、true と false がその値になっている。
#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秒

スワップの実装に大きな変更があったのと、元からの興味により sys/vm/swappager.c を覗いている。

swp_pager_meta_build がいつ呼ばれるか興味があったので、久しぶりに dtrace を使ってみることにした。stack と言う関数がある。

# 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

カーネル内では関数ポインタを設定して、あちこちに飛ぶことも多いので一部のコールスタックは、見た目程明らかではない。この出力は、11-STABLE で、11.1-RELEASE とは既にかなり異なっている。

しかし、若干これらの関数を覗いてみたところ、一部が抜けているように見える。これから、動作を探りながら dtrace の実験もしてみたい。

FreeBSD 11-stable で i386 のカーネルがコンパイルできない2017年10月07日 20時06分36秒

久しぶりに、FreeBSD の 11-STABLE を svn up したところ、コンパイルエラーが出てつまずいている。
/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秒

11.1-RELEASE 後の 11-stable のコード。
$ 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秒

FreeBSD のハンドブックに Configuring Remote Logging がある。例えば、ファイアーウォール等の細かい設定や注意点はそちらを参照の事。

syslog を受けたい側のサーバ側を 192.168.0.1 とする。そして、今回の syslog を送るクライアント側を 192.168.0.3 としよう。

ハンドブックの記述には、サーバの 192.168.0.1 側の /etc/syslog.conf に

+192.168.0.3
*.*     /var/log/192.168.0.3.log
に書くと記述されている。しかし、/etc/syslog.conf を見ると、/etc/syslog.d に入っているファイルも読み込むようだ。そこで、
$ 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 に

syslogd_enable="YES"
syslogd_flags="-a 192.168.0.3"
を記述。-v -v でログのレベルをあげることも出来る。

今度は 192.168.0.3 のクライアント側の設定。192.168.0.3 の /etc/rc.conf に

syslogd_enable="YES"
syslogd_flags="-s"
と書き、syslogd を起動するが、192.168.0.3 サーバでは syslogd のパケットを受け取らないように記述する。

paging in/out と swaping in/out の大まかな違い2017年10月14日 14時06分45秒

swap out はプロセスを主メモリから、二次メモリに書き出す事。page out はプロセスのメモリの一部を二次メモリに書き出す事。

そのため、swap out されたプロセスの実行は不可能になる。page out されただけなら、主メモリに残っている部分で、プロセスを実行することが出来る。paging は、プロセスのアドレス空間を細かく区切って管理すること。

システムでは、top などで swap と表示したり、スワップデバイス、スワップファイル等と呼んだりするので、page-out と混同しやすい。