vm.swap_fragmentation sysctl が追加された2017年10月30日 12時55分41秒

11-STABLE に sysctl vm.swap_fragmentationが追加された。現在は、11.1-RELEASE が夏の終りに出されたばかり。次のリリースは 11.2-RELEASE なので、最初に使えるのはそこからになるだろう。

現在、二つのデバイスが割り当てられていて、利用量はゼロ。

% % sysctl vm.swap_fragmentation
vm.swap_fragmentation: 
Free space on device ada0s2b:
number of maximal free ranges: 1
largest free range: 262142
average maximal free range size: 262142
number of maximal free ranges of different sizes:
               count  |  size range
               -----  |  ----------
                   1  |  262142

Free space on device da0s2b:
number of maximal free ranges: 1
largest free range: 522610
average maximal free range size: 522610
number of maximal free ranges of different sizes:
               count  |  size range
               -----  |  ----------
                   1  |  522610
わざとスワップを使ってからの表示。
% sysctl vm.swap_fragmentation
vm.swap_fragmentation: 
Free space on device ada0s2b:
number of maximal free ranges: 11
largest free range: 232508
average maximal free range size: 22607
number of maximal free ranges of different sizes:
               count  |  size range
               -----  |  ----------
                   2  |  1
                   1  |  3 to 4
                   4  |  5 to 7
                   1  |  13 to 20
                   1  |  34 to 54
                   1  |  10946 to 17710
                   1  |  232508

Free space on device da0s2b:
number of maximal free ranges: 14
largest free range: 492884
averge maximal free range size: 36367
anumber of maximal free ranges of different sizes:
               count  |  size range
               -----  |  ----------
                   3  |  1
                   3  |  3 to 4
                   1  |  5 to 7
                   1  |  13 to 20
                   3  |  21 to 33
                   1  |  55 to 88
                   1  |  10946 to 17710
                   1  |  492884

FreeBSD のスワップ枯渇時の kill シグナルの伝達が遅い2017年10月19日 14時04分29秒

FreeBSD に業と過負荷をかけて遊んでいる。make buildworld -j 100 等とすると、clang のコンパイル時にあっと言う間に大量のメモリが持っていかれる。

まだ、確証は無いのだが、スワップ領域が埋め尽くされた後の kill がやけに遅い。まず、シグナルがプロセスに届くのにやけに時間がかかる。また、実メモリはすぐに解放されるようだが、スワップ領域の解放に時間がかかりすぎている様に見える。

top で観察していると、pagedaemon は動いているが、スワップの利用領域はなかなか下がらない。pagedaemon が何とか未解放のスワップを処理できれば、随分と効率が上がりそうに見えるが…

実験しているのは 11-STABLE で、現在は 11.2-RELEASE が出された後。

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 と混同しやすい。

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 のパケットを受け取らないように記述する。

FreeBSD の一時スワップデバイスは tmpfs を nfs で export して swapon2017年09月25日 12時52分37秒

mdconfig の swapon はかなりオーバヘッドが多い。と言うか、ほとんどがオーバヘッドだ。

それに引き換え、あまり推奨されていない筈のNFS ファイルの swapon は、swap pager と NFS、そしてディスクの IO の値が一致する。ネットワークの帯域に多少は心配があっての、ファイルやデバイスへのアクセスは優秀で、ほぼ 100% の様だ。

これらを総合すると、swap 領域の圧迫の一時的な対処法は、別機からのサポートのようだ。メモリに余裕のあるシステムから、tmpfs を nfs エクスポートし、そこのファイルを直接 swapon をする。

また、大量のページングが発生している状況だと、スワップ領域も細切れになり、また、仮装メモリと実メモリのマッピングも随分と断片化する。ディスクが主体のスワップよりも、ネットワークと tmpfs のメモリアクセスの方が数倍も早くなる場合が多い。

NFS の export の部分を若干省略するが、大体の作業。

nfs-server $ mount -t swap dummy /mnt/tmp
nfs-server $ dd if=/dev/zero of=/mnt/tmp/swap bs=1M count=1 seek=9999
nfs-server $ vi /etc/export
nfs-server $ sh /etc/rc.d/nfsd onestart
swapping-machine $ mount -t nfs nfs-server:/mnt/tmp /mnt/swap
swapping-machine $ swapon /mnt/swap/swap

FreeBSD の mdconfig のでスワップファイルは非効率2017年09月20日 06時15分21秒

スワップ領域にするのに一番適しているのは、デバイス。一時的な利用などにより、物理メモリが足りなくて、さらにスワップデバイスも容量が逼迫してしまうときもある。そのような時には、ファイルを通してスワップをすることも可能だ。
$ dd if=/dev/zero of=/mnt/scratch/swap bs=1M count=1 seek=10000
$ mdconfig -a -t vnode -f /mnt/scratch/swap
md1
$ swapon /dev/md1

ただ、これは本当に一時凌ぎの様だ。まずは、root に成れなくてはならない。そして、読み書きの様子を観察をしていると、ファイルへのアクセスは多いのだが、swapin や swapon は大して多くならない。mdconfig を通して、ファイルとしてアクセスするオーバーヘッドがかなり大きい様だ。10 MB/s のディスクアクセスでも、実際のページングになるのは 1 MB/s あたり。ディスクのアクセス効率は、十から二十パーセントからぐらいのようだ。

FreeBSD で NFS ファイルにスワップする2017年09月15日 11時56分57秒

FreeBSD では長らくの間、NFS ファイルをスワップに指定できるようになっている。FreeBSD の古いドキュメントを見付けると、4.x 以前はとても遅かったといった記述や、NFS はネットワークに左右されるので、勧められないとの記述もあることはある。

取り敢えず実例。NFS の export と mount の位置はあまり関係なく、個々の設定による。

$ mount -t nfs x.x.x.x:/swap /mnt/swap
$ dd if=/dev/zero of=/mnt/swap/swap1 count=1 seek=1200
$ swapon /mnt/swap/swap1
swapon にそのままファイルのパスを指定すれば良い。dd にて空のファイルを先に作った。
$ swapctl -l
$ systat -swap
Device:       1024-blocks     Used:
/dev/#NODEV     1229824    109580
Disk      1K-blocks   Used /0%  /10  /20  /30  /40  /50  /60  /70  /80  /90  /10
[NFS swap]  1229696 109580 XXXXX

sswapctl や systat などで、スワップの割り当てや利用量をみられる。しかし、残念ながらファイル名は表示されないので、覚えておかなければいけない。
$ swapoff /mnt/swap/swap1
スワップ領域を外す場合は、ファイル名で指定する。複数の NFS ファイルで複数の領域を割り当てる事は出来るが、swapoff はファイル名で指定なので、忘れたら swapoff 出来なくなる。

shutdown 時には、nfs の umount や swapoff -a のタイミングが結構微妙な様なので、出来るならば shutdown 前に swapoff をしておいた方が良さそうだ。

cd: ..: Permission denied by newvers.sh2017年09月13日 11時10分32秒

FreeBSD で一般ユーザで buildkernel をするとエラーが出るようになった。11.1-RELEASE を作ったときは、自分のアカウントで出来たから、current と 11-STABLE が影響の対象だと思う。uyota で buildkernel をすると、無限ループに陥る。root で buildkernel をすると問題はない。

少し実験をする。make buildkernel から問題のあるコマンドだけを抜き取っった。newvers.sh が原因のようだ。

% MAKE=/usr/obj/usr/src/make.i386/bmake sh /usr/src/sys/conf/newvers.sh  GENERIC
cd: ..: Permission denied
cd: ..: Permission denied
sh に -x を渡して、実行されているコマンドを見る。
env MAKE=/usr/obj/usr/src/make.i386/bmake sh -x /usr/src/sys/conf/newvers.sh  GENERIC

+ [ -z '' ]
+ dirname /usr/src/sys/conf/newvers.sh
+ SYSDIR=/usr/src/sys/conf/..
...
+ findvcs .git
+ local savedir
+ pwd
+ savedir=/usr/src
+ cd /usr/src/sys/conf/../..
+ pwd
+ [ /usr/src '!=' / ]
+ [ -e ./.git ]
+ cd ..
+ pwd
+ [ /usr '!=' / ]
+ [ -e ./.git ]
+ cd ..
cd: ..: Permission denied
findvcs で無限ループに陥っているようだ。どうも /usr からは / へ .. で移動できていない様だ。取り合えず、該当する部分を見てみる。
findvcs()
{
        local savedir

        savedir=$(pwd)
        cd ${SYSDIR}/..
        while [ $(pwd) != "/" ]; do
                if [ -e "./$1" ]; then
while ループの pwd が成功しないため、while ループが無限ループに陥っている。

今まで目撃したことの無かった現象なので、気になったのでテスト。

% cd /usr/src
% df .
Filesystem  1K-blocks    Used   Avail Capacity  Mounted on
/dev/da2s2f   5061628 2584592 2072108    56%    /usr/src
% cd ..
% cd ..
..: Permission denied.
% df -k .
Filesystem   1024-blocks    Used   Avail Capacity  Mounted on
/dev/ada0s3d     7103150 1625446 4909452    25%    /usr
% pwd -P
/usr
% pwd
/usr
% cd ..
..: Permission denied.
% ls -ld /usr
drwxr-xr-x  19 root  wheel  512 Jun 18 13:42 /usr
% ls -ld /
drwxr-xr-x  23 root  wheel  1024 Sep 26 21:39 /
/usr/src から、/usr へは問題なく cd .. が出来ているが、/usr から / へは出来ていないようだ。ディレクトリへのアクセス権限も問題ない。

原因は分からないが、該当箇所を /usr と比較することで、一時的な回避は出来る。buildkernel は /usr/src から行うので、/usr までみれば十分だ。

        while [ $(pwd) != "/usr" ]; do

FreeBSD の /usr/bin/ld: cannot find -lgcc_s の修正の仕方2017年07月11日 13時21分27秒

FreeBSD で /usr/bin/ld: cannot find -lgcc_s がでて困っていた時のまとめ。

/usr/lib 以下のシンボリックリンクの貼り方が変わったのが原因のようだ。そこで、修正するには以前の様なシンボリックリンクに変えれば良い。

$ cd /usr/lib
$ ls -l *.so | nawk '$NF ~ /..\/..\/lib/{cmd="ln -sf " substr($NF, 6) " " $(NF-2);system(cmd)}'
なお、このコマンドは、root で作業。

前回

FreeBSD の libgcc_s シンボリックリンクを作り直す2017年07月09日 13時30分59秒

/usr/lib からのシンボリックリンクが変わった為に、一般ユーザからファイルが読めなくなっている。そこで、リンクを針直してみた。

ここは root で作業。 まずは、print で実行コマンドの点検。

$ cd /usr/lib
$ ls -l *.so | nawk '$NF ~ /..\/..\/lib/{cmd="ln -sf " substr($NF, 6) " " $(NF-2);print cmd}
ln -sf /lib/lib80211.so.1 lib80211.so
ln -sf /lib/libalias.so.7 libalias.so
ln -sf /lib/libavl.so.2 libavl.so
ln -sf /lib/libbegemot.so.4 libbegemot.so
ln -sf /lib/libbsdxml.so.4 libbsdxml.so
ln -sf /lib/libcam.so.7 libcam.so
print を system コマンドに変えて、再度実行。
$ ls -l *.so | nawk '$NF ~ /..\/..\/lib/{cmd="ln -sf " substr($NF, 6) " " $(NF-2);system(cmd)}'
$
この後、/usr/bin/ld: cannot find -gcc_s のエラーは出なくなった。

前回次回