ZFS

zfs compresssion

昔にzfsの圧縮を試したときはcompresssion=gzip-9ってやったらOSごとハングしたので、それ以来offで運用している。

# zfs create tank/zero
# zfs set compression=on tank/zero
# time dd if=/dev/zero of=/tank/zero/junk bs=32k count=1024
1024+0 records in
1024+0 records out
33554432 bytes transferred in 0.108182 secs (310165947 bytes/sec)
0.000u 0.079s 0:00.12 58.3%     40+4320k 0+0io 0pf+0w
# ls -lh /tank/zero/junk
-rw-r--r--  1 root  wheel    32M  6月  6 18:07 /tank/zero/junk
# du -h /tank/zero/junk
512B    /tank/zero/junk
# 

ごくあたりまえな結果だがゼロで埋まっているファイルは1ブロックしか消費していない。

zfsスナップショットのそうじ

ホームディレクトのスナップショットをとりつづけているので、たまには掃除してあげよう。

% zpool list
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
tank  1.94T  1.15T   804G    59%  1.00x  ONLINE  -

% zfs list -r -t snapshot tank/home/koie | grep '@2011' | grep -v '@201105' | awk '{print $1}' | sudo xargs -n1 zfs destroy

koie@guriandgura% zpool list
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
tank  1.94T   923G  1.04T    46%  1.00x  ONLINE  -

zfs set sync= standard | always | disabled

zfs set sync=xxx tank/xxx でファイルシステムごとにsyncのポリシーを変更できるようになったのでどういう仕様なのかソースコードをながめてみた。

基本的にalwaysを指定すると何かするたびにzil_commit()が走る。readでもcommitしているのは先行するwriteをちゃんと書き込んでからという意図があるっぽい。fsyncはdisable指定するとfsyncの効き目がなくなる。NFSとかでcommitを無視したいときに使うのかな。

operation disable standard always
read - - commit
write - - commit
mkdirとか - - commit
fsync - commit commit
zvol関係 - - commit

zvolはioctlでwrite cacheをoffにするとzvol_write()でzil_commit()しなくなるようだ。

ZFS dedupは効果があるか?

zdb -S でわかるらしいのでやってみた。


% zpool status -v
  pool: tank
 state: ONLINE
status: The pool is formatted using an older on-disk format.  The pool can
        still be used, but some features are unavailable.
action: Upgrade the pool using 'zpool upgrade'.  Once this is done, the
        pool will no longer be accessible on older software versions.
 scan: scrub repaired 0 in 6h35m with 0 errors on Thu May  5 10:04:39 2011
config:

        NAME         STATE     READ WRITE CKSUM
        tank         ONLINE       0     0     0
          raidz1-0   ONLINE       0     0     0
            ada1s2   ONLINE       0     0     0
            ada2s2   ONLINE       0     0     0
            ada3s2   ONLINE       0     0     0
        logs
          label/zil  ONLINE       0     0     0

errors: No known data errors
% zpool iostat
               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
tank        1.06T   898G     15     24   120K   299K
% zpool iostat -v
                capacity     operations    bandwidth
pool         alloc   free   read  write   read  write
-----------  -----  -----  -----  -----  -----  -----
tank         1.06T   898G     15     24   120K   299K
  raidz1     1.06T   898G     15     24   120K   251K
    ada1s2       -      -      4     11   163K   127K
    ada2s2       -      -      4     11   161K   127K
    ada3s2       -      -      4     11   161K   127K
  label/zil   204K  1.95G      0      0     14  48.5K
-----------  -----  -----  -----  -----  -----  -----

% zdb -S tank
Simulated DDT histogram:

bucket              allocated                       referenced
______   ______________________________   ______________________________
refcnt   blocks   LSIZE   PSIZE   DSIZE   blocks   LSIZE   PSIZE   DSIZE
------   ------   -----   -----   -----   ------   -----   -----   -----
     1     336K   9.61G   9.61G   9.67G     336K   9.61G   9.61G   9.67G
     2    6.02K    215M    215M    216M    12.7K    442M    442M    444M
     4      592   9.52M   9.52M   9.64M    2.78K   43.3M   43.3M   43.9M
     8      223   1.77M   1.77M   1.83M    2.13K   18.2M   18.2M   18.7M
    16       19     39K     39K   42.6K      408    854K    854K    931K
    32        7     35K     35K   36.6K      315   1.96M   1.96M   2.03M
    64        5    130K    130K    131K      503   14.9M   14.9M   15.0M
   128        1     512     512     682      178     89K     89K    119K
   256        3   1.50K   1.50K   2.00K    1.17K    598K    598K    797K
   512        3   1.50K   1.50K   2.00K    2.16K   1.08M   1.08M   1.44M
    1K        1     512     512     682    1.20K    612K    612K    816K
 Total     343K   9.83G   9.83G   9.89G     359K   10.1G   10.1G   10.2G

dedup = 1.03, compress = 1.00, copies = 1.01, dedup * compress / copies = 1.02

%

表の意味はよくわからんが、最後の1行だけみると全く効果なしのようだ。

FreeBSD勉強会 第6回 Jailにしなきゃ危ないよ 〜JAIL環境の構築と運用〜 にいってきた

46156331.jpg

  • http://gihyo.jp/event/01/freebsd/2011/0113
  • 発表: 河部展さん
  • 場所: 株式会社Speee セミナールーム
  • 日時: 2011-01-13 20:00〜22:40
  • 募集が直前だったのにもかかわらず17人ほどが参加。
  • ustream配信は機器故障のため行なわれずビデオ録画のみ。後日アップロードされるとのこと。
  • 当日の資料も多少手直ししたものが公開されるとのこと。

はじめに

  • あっという間に今回の話がきまった。迂闊なことをいうと発表者にされちゃうよ!
  • JAILの利用はホスティングやセキュリティ確保のために利用されることがおおい。
  • またクラックされた..
    • WordPressがやられた..
    • Apacheの実行権限が盗られた。
    • rm をしかけられたためコンテンツが全滅。
    • ckrootkitで調べたところシロだったが何をされたかわからない。
    • これはまずい! → JAILで分離しよう!
  • 意外とJAILについてちゃんと書かれている記事がない。たいていはちょっと使ってみたところで話が終わっている。

JAILとは

  • 仮想化ではないのでパフォーマンスはいいけど、OSがFreeBSDに限定されるので利用者を増やすことにはつながらない。
  • ふつうにJAILをつくるとuid/gidがホストとかぶる。/etc/pw.confでminuid,maxuid,mingid,maxgidを設定することで変えることは可能。
  • 用語: ホスト環境、JAIL環境。
  • JAILでできないこと
    • ipv6 ((いまはできるっぽい))
    • icmp (raw socketがひらけない)
    • bcast (netmask 255.255.255.255に設定するため)
    • loopback ((いまのはjailのアドレスに読みかえてくれるっぽい?))
    • NFS (デーモンを起動するときにjailアドレスを指定できないので)
    • SYSV IPC
    • mount/umount (ezjailからはzfsを操作できるらしい)

JAIL環境の構築

  • ハンドブックにしたがってJAILをつくるには((http://www.freebsd.org/doc/handbook/jails-build.html)):
  • make installworld DESTDIR=... でインスールされて
  • make distribution DESTDIR=... で/etcの下が調整される。installworldではまだからっぽの状態。
  • この段階でduでみる200MBくらい消費している。これを多いとみるか少ないとみるか...
  • devfsもmountしないとps(1)がうごかない。kvmをつかうので。

JAIL環境の複製

  • /usr/objをとっておく。必要なだけmake installworld+distributionする。
  • cpする。ハードリンクが展開されてしまう問題がある。
    • やってみると /rescue の下が膨れ上がった。205MBだったのだ834MBに。
  • tarする。chflagsがおちる問題がある。

JAIL環境の設定

  • /etc/passwdにはいらないアカウントがあるので削る。
  • /etc/pw.confをつくっておくとuid/gidの範囲を指定できる。
    • adduser/rmuserはpwコマンドをつかったスクリプト。
    • ただし、一部のportsでは決め打ちでuid/gidを指定するものがあるので、そういうのには無力。
  • /etc/wall_cmos_clock、/etc/localtimeも設定する。

JAILあれこれ

  • JAILにアドレスをつけなくてもよくなっているが、つけないとどうなる? どいういう利用法があるのか?
    • [goto] IPv4,IPv6スタックを完全分離する過程でJAILにアドレスをつけなくてもよくなった。それだけっぽい。
  • jlsは動いているJAILしか見えない。設定だけして動かしていないものは出てこない。
    • ezjail-admin listではみえるよ!
  • ホスト環境からcpするとオペミスする原因 (パスを間違えてホスト環境を上書きする可能性)
    • ネットワークを介してやるとか
    • プロンプトをかえておくとか
  • ネットワーク・デーモンはホスト環境・JAIL環境共にbind(2)で明示的にアドレスを制限しないとポートがぶつかってしまう。
  • /etc/rc.d/jail start hogehoge でJAIL hogehogeだけを起動できる。
  • /etc/rc.d/jail start hogehoge したあとに jail -l -u root hogehoge /bin/shするとおなじ環境がもういっこできてしまう?
    • JAILホスト名とJAILアドレスは同じだがJAILIDが違うものが複数できるということ。
  • JAILホスト名はFQDNの方がいい。文句をいうデーモンがある。
  • sh /etc/shutdownだと/bin/shがのこる。
    • jkillとか。
    • pkill -j JDIとか。
    • killall -j JIDとかもよい。ただ/var/run/jail_HOST_JIDがのこるけど。

「梅」

  • handbookどおり
  • namedを動かしたいだけで200MBも使うのはムダ。

「竹」

  • du | xdu でみると /usr/libとか/usr/shareとかが大きい。
  • /usr/includeはいらないだろうし。
  • jail-remove.txtというのがある。消してもよいファイルの一覧。
    • でも6.x-RELEASEでメンテがおわっている。
    • つかいかた: cat jail-remove.txt | xargs rm -rf
    • ホスト環境ではやらないように!
    • 消せファイルは chflags noschg FILENAME でフラグをおとしてからrm。
  • /sbin にあるのハード制御系のコマンドもいらない。
  • geom/ifocnfig/zfsなどもいらない。
  • /usr/libdataはいらない
  • *_p.aはプロファイル用なのでこれもいらない。
  • *.aもいらない。
  • そもそもgccとかいらない。
  • lddで使われているライブラリをさがす。消しすぎてしまったらもどす。の繰り返し。
  • 実はifconfigは必要だったり。
  • これはとっても時間がかかる作業。
    • ディスクは251円/GB。
    • 近所のマクドナルドは800円/h。
    • ということは1GBを削るのは20分くらいの労働時間に相当する...
  • 結局33MBくらいまで減らせた!
  • くわしいことはここで: http://hk-tech.homeip.net/pcserver/jail.html

JAILでアプリケーション管理

  • 必要なのをpackageにしてftpでインストールするのが簡単。
  • portsで入れるなんてありえないよねー ((すみません、うちんところでは個々のJAILでmake+make installしてます))

運用・作業を省力化してくれるコマンド

ezjailかqjailがおすすめ。

  • ezjail
    • 設定は/usr/local/etc/ezjail.confに書く。
    • JAILにつけるアドレスは/etc/rc.confに書く必要がある。ezjailの外でしなければいけない唯一の設定。
    • ${ezjail_jaildir}/flavours/ezjail.flavour
      • ここにスクリプトを書いておくとcreateのときに実行してくれる。
      • zshをinstallするのにつかっている。
  • qjail
    • いちばんあたらしいやつ。まだportsにはいってない
    • "q"はquick。
    • なんかよくわからんが、第4世代らしい。
    • 100のオーダーのJAILを扱うのを想定している。
    • zone(グループみたいなの)があり、zone単位で起動する機能がある。
    • qjail create -D 10 -I JAILNAME JAILIP を実行すると、いきなり10個できる。
      • ホスト名は JAILNAME-1 〜 JAILNAME-10 という風に振られる。
      • アドレスも JAILIP+1 〜 JAILIP+10 という風に。

[goto]ベースシステムにもそのうち何かしら入るとのこと。ezjailを元にしてqjailのように沢山のJAILを管理する機能がついたものになるそう。

そのほか 質疑応答 雑談 など

  • jail -m でJAIL環境に接続できる。((jexecとおなじ?))
  • JAILは仮想化とはちがって、JAILから外を見えないようにしているだけ。
  • まだマージされてないが VPS (Virtual Private System) というもの開発されている
    • solaris containerみたいなもの。zfsもあるし、open solarisの人たちをFreeBSDにひっぱりこめないか?
  • CentOSをJAILで動かすのはむつかしくない。linux emulatorが実際の差を吸収している。
    • unameを実行するとちゃんとcentosという。CentOSのunameコマンドを実行しているだけ。
    • もともとはXENよりもお手軽にたくさんの環境をつくりたかったという動機らしい。
  • リソース配分機能というのがあったらしいがマージされなかったそうな。
  • PC-BSD由来のPBIは便利。portsをベースにしてインストールの仕方を工夫しているらしい。/optの下にインストールされる。そもそも/usr/localの下にインストールするのは *BSD では少数派。Linuxみたいに/usrにぶちこむのは論外。
  • /etc/rc.dの下のスクリプトは手で起動しない。環境変数がブート時とは違ってしまうため。service(8)をつかおう。
  • nullfsはマウント先(covered)のファイルシステムを隠す。足し算するのはunionfs。unionfsは安定しているはずだが、VFSの仕様に敏感なのでおかしくなるかも。

DVD-RAMでZFSを

ふとDVD-RAMにZFSをつくってみようという気になったのでやってみた。(OSはFreeBSD 9.0-CURRENT)
freebsd# zpool create dvdram /dev/acd0
freebsd# zpool list
NAME     SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
dvdram  4.25G   206K  4.25G     0%  ONLINE  -
....
freebsd# df /dvdram
Filesystem 1K-blocks Used   Avail Capacity  Mounted on
dvdram       4386684   56 4386628     0%    /dvdram
freebsd# zfs create dvdram/tmp
freebsd# df | grep /dvdram
dvdram                     4386604        60   4386544     0%    /dvdram
dvdram/tmp                 4386600        56   4386544     0%    /dvdram/tmp
freebsd# zfs list -r dvdram
NAME         USED  AVAIL  REFER  MOUNTPOINT
dvdram       272K  4.18G    60K  /dvdram
dvdram/tmp    56K  4.18G    56K  /dvdram/tmp
あっさりできた。

メタデータは標準で3重化されているがデータは冗長性がないので2重化しておこう。

freebsd# zfs set copies=2 dvdram

さて書き込み性能はどんなものか?

freebsd# time dd if=/dev/urandom of=/dev/null bs=1m count=100
100+0 records in
100+0 records out
104857600 bytes transferred in 2.119697 secs (49468206 bytes/sec)
0.000u 2.044s 0:02.12 96.2%     26+4151k 0+0io 0pf+0w
freebsd# time dd if=/dev/urandom of=/dvdram/tmp/random.out bs=1m count=100
100+0 records in
100+0 records out
104857600 bytes transferred in 97.429001 secs (1076246 bytes/sec)
0.000u 2.185s 1:37.43 2.2%      33+5331k 0+0io 0pf+0w
/dev/null送りにしたケースがオーバヘッド/dev/urandomのオーバーヘッドなので それを差し引きすると 1.049 MiB/s (1.10MB/s) 。メディアは三菱化学の5xで、 ドライブは PIONEER DVD-RW DVR-112 (1.21)。 ddが終わったあともドライブのアクセスランプは点滅していた。遅延書き込みだろう。

さて、メディアを抜いてみようか..

freebsd# cdcontrol eject
freebsd# zpool status dvdram
  pool: dvdram
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        dvdram      ONLINE       0     0     0
          acd0      ONLINE       0     0     0

errors: No known data errors
あっさり成功してしまった。 ロックされて失敗するのを期待してたんだが...

じゃあexportしないといけないよねってことで

freebsd# zpool export dvdram
^T

load: 0.67  cmd: zpool 42164 [tx->tx_sync_done_cv)] 30.07r 0.00u 0.02s 0% 2176k
^C
ささってしまった。

コンソールメッセージにはこんなのが出てた。

Nov 22 16:24:48 freebsd root: ZFS: zpool I/O failure, zpool=dvdram error=6
Nov 22 16:24:48 freebsd root: ZFS: zpool I/O failure, zpool=dvdram error=28
Nov 22 16:24:48 freebsd last message repeated 2 times
Nov 22 16:24:48 freebsd root: ZFS: vdev I/O failure, zpool=dvdram path= offset= size= error=

別のターミナルを開いてstatusコマンドをたたいてみると

koie@freebsd% zpool iostat -v
                capacity     operations    bandwidth
pool          used  avail   read  write   read  write
-----------  -----  -----  -----  -----  -----  -----
dvdram        201M  4.05G      0      3    340   324K
  acd0        201M  4.05G      0      3    340   324K
-----------  -----  -----  -----  -----  -----  -----
tank          787G  1.17T     10     10  67.7K   295K
  raidz1      787G  1.17T     10      9  67.7K   157K
    ad6s2        -      -      3      5  95.7K  78.9K
    ad8s2        -      -      3      5  96.0K  78.9K
    ad10s2       -      -      3      5  95.9K  78.9K
  label/zil    20K  1.95G      0      1      1   138K
-----------  -----  -----  -----  -----  -----  -----

koie@freebsd% zpool status dvdram
  pool: dvdram
 state: ONLINE
status: One or more devices are faulted in response to IO failures.
action: Make sure the affected devices are connected, then run 'zpool clear'.
   see: http://www.sun.com/msg/ZFS-8000-HC
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        dvdram      ONLINE       0     4     0
          acd0      ONLINE       0     6     0

errors: 4 data errors, use '-v' for a list
koie@freebsd%
本来ならばこのURLを参照するとサクっと詳細な情報がえられるはずなのだが、SunがORACLEに買収されてしまった影響でORACLEのログインページにとばされてしまってみられない。 もし作業現場でORACLEのアカウントをもってなかったらかなりイラっとくるはずだな、これは。

zpool clearするといいらしい。zpool clear dvdramしたらzpool exportコマンドももど ってきた。

freebsd# zpool status dvdram
cannot open 'dvdram': no such pool

ちゃんとexportされてる。もういちどDVD-RAMを取り出して入れ直してから再マウントに 挑戦。

freebsd# cdcontrol eject
freebsd# zpool import dvdram
freebsd# zpool list
NAME     SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
dvdram  4.25G   201M  4.05G     4%  ONLINE  -
tank    1.94T   787G  1.17T    39%  ONLINE  -
freebsd# zpool status dvdram
  pool: dvdram
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Mon Nov 22 16:34:47 2010
config:

        NAME        STATE     READ WRITE CKSUM
        dvdram      ONLINE       0     0     0
          acd0      ONLINE       0     0     0  28K resilvered

errors: No known data errors
freebsd#
無事できました、パチパチ。

あとおもしろいことといえば、 ディスクの記録面をみると二本の太い筋がみえて、データが二重化されているのがよくわかる。 こういうところは光デバイスのいいところ。

そういえばzfs set atime=off dvdramするのをわすれてた。100MBくらいのデジカメ画像をコピーしてから zfs set atime=off dvdramしたんだが、なかなか終わらない。なにしてるんだろう...

ZFSスナップショットをざっくり消す

こんなスクリプトをつくって(とりあえず名前はexecsとした)
#!/bin/sh

PROG="$0"
MODE="EXEC"
MARK="%%"
BACKGOUND=NO

while [ $# -gt 0 ]; do
    case "$1" in
    -n) MODE=DRYRUN
        ;;
    -m) shift
        MARK="$1"
        ;;
    -b) MODE=BACKGROUND
        ;;
    -*)
        echo "$PROG: invalid argument: $1"
        exit 1
        ;;
    *) break ;;
    esac
    shift
done

if [ $# -eq 0 ]; then
    echo "$PROG: no command specified."
    exit 1
fi
TEMPLATE="$*"

while read ARG; do
    CMD=$(echo "$TEMPLATE" | sed "s|$MARK|$ARG|g")
    case $MODE in
    DRYRUN)
        echo "$CMD"
        ;;
    EXEC)
        echo "+ $CMD"
        $CMD
        ;;
    BACKGROUND)
        echo "+ $CMD &"
        $CMD &
        ;;
    *)
        echo "$PROG: INTERNAL ERROR"
        exit 1
        ;;
    esac
done

case $MODE in
BACKGROUND)
    wait
    ;;
esac

exit 0
こんなふうにするとよい。
zfs list -t snapshot -r -H -o name tank/foo/bar | \
   execs -b zfs destroy %%
複数を同時実行した方が(たぶんuberblockの書き込み回数が減るから?)かなり速くなるので execs -bオプションは必須。ちなみにzfs destroyは1引数しか取れないので、xargsをつかうときには以下のように-n1オプションを付ける必要がある。
zfs list ... | xargs -n1 zfs destroy
zfs listとexecsのあいだにgrepでフィルタすることもできる。たとえばスナップショット名が "dailyなんとか" のものだけを消したい場合には
zfs list -t snapshot -r -H -o name tank | \
  grep "@daily" | execs -b zfs destroy %%
tank/fooの下は消したいけどtank/foo/barは残したいなら
zfs list -t snapshot -r -H -o name tank/foo | \
  grep -v ^tank/foo/bar | execs -b zfs destroy %%
ちなみに、tank/foo直下のスナップショットだけリストするには
zfs list -t snapshot -r -d 1 tank/foo

umount_zfs_snapshot

いまはZFS snapshotのファイルシステムは見えないように隠されているが(以前はまるみえで目障りだった。df -aで見える。)、定期的にumountするように仕掛けている。
#!/bin/sh
/sbin/mount -p | /usr/bin/awk '$2~/\.zfs\/snapshot/ && $3=="zfs" {print $1}' | xargs -n 1 umount 2>&1 | \
sed '/: Device busy$/d;'
こんなスクリプトを /usr/local/etc/umount_zfs_snapshot において cronで1時間おきに起動している。 /etc/crontab:
0 * * * * root  /usr/local/etc/umount_zfs_snapshot

FreeBSDではbufszがstat::st_blksizeになる

FreeBSD勉強会で「ZFSのスループットはIOサイズが128KB〜256KBあたりで最適になる」という話があったので、
じゃあFSごとにBUFSZを変えられるよういしたらおもしろいかもと
/usr/src/lib/libc/stdio/makebuf.cをみるとst_blksizeがBUFSZになるようなので
カーネコードをみるとちょっまえに入った修正でこんなのがあった。

------------------------------------------------------------------------
r206129 | avg | 2010-04-03 17:39:00 +0900 (Sat, 03 Apr 2010) | 19 lines

vn_stat: take into account va_blocksize when setting st_blksize

As currently st_blksize is always PAGE_SIZE, it is playing safe to not
use any smaller value. For some cases this might not be optimal, but
at least nothing should get broken.

Generally I don't expect this commit to change much for the following
reasons (in case of VREG, VDIR):
- application I/O and physical I/O are sufficiently decoupled by
filesystem code, buffer cache code, cluster and read-ahead logic
- not all applications use st_blksize as a hint, some use f_iosize, some
use fixed block sizes

I expect writes to the middle of files on ZFS to benefit the most from
this change.

Silence from: fs@
MFC after: 2 weeks

------------------------------------------------------------------------

ということで、いまどきのFreeBDS CURRENTだとstat(2)経由でFSの最適IOサイズがわかって全自動でBUFSZが設定される。

ちょっとためしてみた。プログラムはこんなCの初歩:
#include <stdio.h>
int
main()
{
int ch;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}

koie% cc -static copy.c -o copy
#dynlinkだとtrussで余計なものがみえてしまうので.
続きを読む

gihyo.jp FreeBSD勉強会: FreeBSDにおけるZFSのあれこれ─FFS/ZFSのベンチマーク

cbc1dbac.jpg

  • 河部展さん
    • アベさんに反応する
  • TCP/IP Illustrated Vol2が新人教育に最適!
    • ip_input.c/ip_output.cをよむといい。
      • pointer/cast/struct
      • functionの配列
      • goto
    • これがFreeBSDを使うようになったきっかけ。
  • 次世代ファイルシステムZFSへのお誘い
    • 2007-9-26 jus勉強会 重村
    • これがまとまっていていい資料
  • サブタイトルはZFSはやっぱり遅いのか!
  • キャパシティ プランニング
    • KKD法
      • 勘 経験 度胸
      • 見積でもつかうよ!
    • ZFSをつかえばこんなことをしなくてすむ。
  • データ保全のためのミラーリングのためにつかいはじめた
    • 後藤さん(日本のスポークスマン!)がプロダクションレベルになったとの発言で。
  • クラックされたことがある *2
    • 1:ブラジルあてにメールを送るbotにされてしまった。内容は出会い系だったらしい。
    • 2:自分のアカウントをとられたが被害なし。
  • SATAを活線挿抜してもpanicしない
    • shellのworking dirをおいておいて抜いてみた。
    • C-cは効かず。
    • 再接続してどうなるかは試してない (後悔)。
  • あらかじめマウントポイントがあると zfs cretae -o mount=/home tank/home が失敗する
  • ベンチマーク
    • ベンチマーク: 結果はどうにでもなる。願望のバイアスがかかっている。
    • 平均値をとって結果を比較するのはヤメれ。
    • 統計処理をしてからモノを言え。
      • ministat(1)をつかうと t検定をしてくれる
  • つかったtools
    • iozone
      • 1つのファイル。
      • おおまかな性能しかわからない。
      • 車でいえば最高燃費みたいなもの。
      • ポテンシャルがわかる程度。
    • postmark
      • ファイルサーバに特化している
    • filebench
      • まだportsにない
      • www server, mai server, file server, proxy
    • bonnie
      • iozoneとにている
  • iozone
    • 1ファイルなので最外周部分をつかってくれると仮定した。
    • cpu cacheとかdisk cacheも含んだ結果になる。
      • ストレージの性能よりも、ファイルシステムの性能を測るなら逆に好都合。
    • OSS推進フォーラムでもdtraceみたいなのをつかって細かく測っていた。どこでどれだけ時間をくっているとか。
    • -az -Rオプションで excelフレンドリーなCSVレポートが作成される。
  • postmark
    • netapp製
    • 大量のファイルの作成/追記/削除
    • { {read or append} + {delete or create} } * Ntransaction
    • iozoneとくらべてレポートがそっけない。
  • マウントポイントはルートにつくらないと、ほかのファイルシステムに対するlookupで余計な誤差がでるかもしれない。
  • iozone -azR -g 3G -f var/tmp/ffs_perf/target -i 0 -i 1 -i 2
    • 3Gと指定すると2GBまでのファイルをつくってくれる。
  • 各試行ごとに mount/unmount, destroy/create
  • postmarkはパラメータを決めるのはユーザで、どう決めるのかがむつかしい。
    • 自分のところでls -lRでファイル数とサイズ分布を調べてみた。
      • size 1K-8MB
      • number 15000
      • transacation 60000
      • subdir 2500
      • read block 64kB
      • write block 64kB
      • word/excel/powerpoint/pdfはサイズいろいろ
      • jpeg 35K-3MB
      • itunes 4MB前後 4000曲くらい
      • 分布が極端なので標準偏差が100を越えた?
      • set bias read 5 (read:append = 5:5)
      • set bias create 10 (create only)
  • とにかく時間がかかる。1日2回しかできない。
  • iozoneでffsとzfsを比べるとzfsはrealが大きいがuser,sysは同じくらい。
  • zfsはread/writeサイズが小さいときの立ち上がりがゆるい
    • ffsは小さくても性能がでる。
    • writeはあるところでドスンとおちる
    • ffsは小さいIO単位でも性能がでる
  • iozoneはzfsに好都合かも
  • ZFSにとってIOサイズが128KB-256KBのとろがおいしいところ
  • postmarkだとzfsのほうがいい?
  • zfsは128KBからか?
  • ZFSのレイヤ構造はおおざっぱにこんなかんじ
    • process-ZPL(トランザクション化)-DMU(CoW)-ARC(キャッシュ)-ZIO(チェックサム)-VDEV(raidとか)
  • USBメモリをL2ARCにしたら、超高速化された?!
    • もういっかい追試したら、超遅くなった。
    • USBメモリの耐用アクセス数が少ないので、それにひっかかったか? ちょこっと画像をwriteしてみたけどだいじょうぶだったが。
  • チェックサム無効化
    • mirrorとかraidじゃなかったらアリかも。
    • multicoreなら有効にしとけ。
    • 無効にしてみたら、なぜかftruncateでおちた。
    • 非力な環境はなメリットはありそうだが、そんなに速くはならなかった。
  • prefetch
    • i386ではdefault offだがonにしたら17%高速化した。
  • 佐藤先生のおはなし
    • raidtestというツールがある
      • デバイスのテスト
      • 最初にパラメータをあたえるとアクセスパターンを生成する。
      • これをあたえることで毎回同じオペレーションでテストができる。
    • プロセス数とかスレッド数とかが少ないとidleがおおくなってしまうかもしれない。
    • zmemcheck.sh
    • freebsdの実装ではbuffer cacheをつかわない。ffsとのちがうところ。
    • vm.kvm_sizeが窓のサイズ
    • vm.kvm_freeが窓の残り
    • amd64なら窓をつかわないのでこれらの制限がなくなる
    • ad0s1はokでad0s1aはダメというふうにつくってある。同期の問題でできないようにしてある。geomのレベルで。
    • checksum threadがあるわけではない。あったとするとデータをすべてそのスレッドにわたさないといけない。
    • checksum前提でコードができているので不整合があったときにどうなるかわからない。FFSのようにsanity checkはないので。
    • チェックサムはそのうちmd5かsha1になる。もともとdedupが目的だったため、いまの計算式だと衝突がおこり不都合がある。plan9ではもともとやってた。
    • zfsで1ファイルだけのスナップショットをとるとかはむつかしそう。
    • メモリがひっぱくしてくると各カーネル?スレッド?にシグナルがとんでくるが、zfsはなかなかすててくれない。パラメータで調節はできる。
  • 次回勉強会: 8/27
    • FreeBSDの少子高齢化問題
    • 国内コミュニティは縮小傾向
    • ビジネスでつかう人がいた。donationをしたい人もいた。だが受け皿がなかった。→ 友の会ができた。
    • jp.freebsd.orgは現状維持。これをなんとかしたい。そのときには人は総入れ替えする。
    • freebsdは、GPL freeで数すくないPOSIX-complient OS。
    • 寄付: FSF1億円,FreeBSD fundation 2500万円
      • FSFは寄付をつかいきっている。
      • FreeBSD fundも寄付をつかいきりたい。人とかマシンとか。
    • 某液晶テレビをつくっているところがFreeBSDがはいっている。
    • FreeBSDサポートしてくれる会社があるとよいか。(red hatみたいなの)
    • jp.FreeBSD.orgでの情報提供を強化したい。
      • いまは企業からの情報は出さないでいる。
      • ボランティアベースだったので見てくれるとわかってないとつづかない。
    • 要フィードバック!
    • FreeBSDをつかっているだけの人→ぜひ推薦文を書いてほしい。こんな理由でつかっているとか。
    • appleはコードを持っていったきり返ってこない。
      • コアテクノロジに抵触しなければ出してくれるとおもう。
      • 目的が合えば金はだしてくれる。
  • インストーラがつかいにくいよね!話
    • pxe bootにしてリモートからftpでbaseをとってきてmake installすることがおおい。
    • sysintall install.cfgをつかうと自動インストールができるので需要がある。新しいインストーラはこの機能コンパチで作る必要がある。
    • もうフロッピーを知らない学生がいる...
  • 悪魔本をもってたら50だいのひとにしんきくさいといわれた...
  • ネットワークまわりくらいしかBSDらしいところはないかも。(linuxと比較して)
  • ipv6について
    • kameはプロジェクトが解散してからの新しい仕様に追従できていない。
    • データセンターの奥での使い方しか知らない。
    • ノートPCとかmultihomeとかわからない人がおおい。
    • freebsdにおいてipv6のメットはいまはもうない。いろいろ実装はでてきている。
    • 数年にうちにはISPからおくられてくるモデム/ルータが自動でipv6のアドレスふるようになるだろう。
      • さてどのosをつかうか? ciscoはbsdをえらばなかったようだ。juniperとかnetappはbsdをつかっている。
  • 日本企業でつかってくれている話はなかなか聞こえてこない。
  • GPLがはいっているらしいぞ!ってみんなさわげ。そうすれば企業トップはリクスに敏感なのでBSDにうつってくるかも。
  • 宅配ロッカーでFreeBSD+modem、レンタサイクルでもつかっている
記事検索
月別アーカイブ
アクセスカウンター

    タグ絞り込み検索
    ギャラリー
    • 今日の練習 2022-06-26
    • 今日の練習 2022-06-26
    • 今日の練習 2022-06-26
    • 鼻栓: speedo NOSECLIP SD97A07 GY グレイ
    • 鼻栓: speedo NOSECLIP SD97A07 GY グレイ
    • 鼻栓: speedo NOSECLIP SD97A07 GY グレイ
    Amazon
    楽天市場
    adby google
    LINE読者登録QRコード
    LINE読者登録QRコード
    • ライブドアブログ