2016年6月7日火曜日

CentOS 向けに ZFS on Linux の kmod-zfs がリリースされていました

ZFS on Linux のコミュニティメーリングリストをパラ見していて、CentOS 6 および 7 向けに、kmod-zfs がリリースされていることを知りました。これは朗報です。
http://list.zfsonlinux.org/pipermail/zfs-discuss/2016-June/025692.html
https://github.com/zfsonlinux/zfs/wiki/RHEL-%26-CentOS

今まで、DKMS にお世話になってましたが、DKMS の場合は、カーネルをアップデートするたびに、ソースからコンパイルするという方式なので、それなりに時間がかかる仕掛けでした。それと、kernel-devel (サイズが大きくてディスク消費量大です) を入れる必要がありました。
kmod 方式の場合は、提供されるパッケージ (kmod-zfs) の中に、コンパイル済みのモジュールが入っていて、そのまま利用出来るため、カーネルアップデートが楽になります。

DKMS からの切り替え方法は、前述の URL に書かれてますが、次のような手順です。
# zpool export tankX    ※まずは、いったん使用中のプールを export します
# yum remove spl-dkms libnvpair1 libuutil1 libzfs2 libzpool2    ※DKMS 方式のパッケージを削除
# yum clean all                       ※ここから3行はゴミ掃除です
# rm /lib/modules/*/extra/*           
# rm /lib/modules/*/weak-updates/*    ※特に、kmod モジュールは、このディレクトリを使うので注意
# shutdown -r now    ※ここでいったんリブート
/etc/yum.repos.d/zfs.repo を次のように修正します。
[zfs]
name=ZFS on Linux for EL7
#baseurl=http://archive.zfsonlinux.org/epel/7/$basearch/
baseurl=http://download.zfsonlinux.org/epel/7/kmod/$basearch/
...
あとは、kmod-zfs をインストールすれば良いです。次は、わたしのマシンの実際のログです。
[root@hoge ~]# yum install kmod-zfs --enablerepo=zfs
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * elrepo: ftp.ne.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package kmod-zfs.x86_64 0:0.6.5.7-1.el7.centos will be installed
--> Processing Dependency: zfs = 0.6.5.7 for package: kmod-zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: spl-kmod for package: kmod-zfs-0.6.5.7-1.el7.centos.x86_64
--> Running transaction check
---> Package kmod-spl.x86_64 0:0.6.5.7-1.el7.centos will be installed
--> Processing Dependency: spl = 0.6.5.7 for package: kmod-spl-0.6.5.7-1.el7.centos.x86_64
---> Package zfs.x86_64 0:0.6.5.7-1.el7.centos will be installed
--> Processing Dependency: libzpool2 = 0.6.5.7 for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: libzfs2 = 0.6.5.7 for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: libuutil1 = 0.6.5.7 for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: libnvpair1 = 0.6.5.7 for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: libzpool.so.2()(64bit) for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: libzfs_core.so.1()(64bit) for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: libzfs.so.2()(64bit) for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: libuutil.so.1()(64bit) for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: libnvpair.so.1()(64bit) for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Running transaction check
---> Package libnvpair1.x86_64 0:0.6.5.7-1.el7.centos will be installed
---> Package libuutil1.x86_64 0:0.6.5.7-1.el7.centos will be installed
---> Package libzfs2.x86_64 0:0.6.5.7-1.el7.centos will be installed
---> Package libzpool2.x86_64 0:0.6.5.7-1.el7.centos will be installed
---> Package spl.x86_64 0:0.6.5.7-1.el7.centos will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package           Arch          Version                       Repository  Size
================================================================================
Installing:
 kmod-zfs          x86_64        0.6.5.7-1.el7.centos          zfs        672 k
Installing for dependencies:
 kmod-spl          x86_64        0.6.5.7-1.el7.centos          zfs        112 k
 libnvpair1        x86_64        0.6.5.7-1.el7.centos          zfs         32 k
 libuutil1         x86_64        0.6.5.7-1.el7.centos          zfs         38 k
 libzfs2           x86_64        0.6.5.7-1.el7.centos          zfs        119 k
 libzpool2         x86_64        0.6.5.7-1.el7.centos          zfs        419 k
 spl               x86_64        0.6.5.7-1.el7.centos          zfs         28 k
 zfs               x86_64        0.6.5.7-1.el7.centos          zfs        330 k

Transaction Summary
================================================================================
Install  1 Package (+7 Dependent packages)

Total download size: 1.7 M
Installed size: 5.7 M
Is this ok [y/d/N]: y
Downloading packages:
No Presto metadata available for zfs
(1/8): kmod-spl-0.6.5.7-1.el7.centos.x86_64.rpm            | 112 kB   00:01     
(2/8): libnvpair1-0.6.5.7-1.el7.centos.x86_64.rpm          |  32 kB   00:00     
(3/8): kmod-zfs-0.6.5.7-1.el7.centos.x86_64.rpm            | 672 kB   00:01     
(4/8): libuutil1-0.6.5.7-1.el7.centos.x86_64.rpm           |  38 kB   00:00     
(5/8): libzfs2-0.6.5.7-1.el7.centos.x86_64.rpm             | 119 kB   00:00     
(6/8): spl-0.6.5.7-1.el7.centos.x86_64.rpm                 |  28 kB   00:00     
(7/8): libzpool2-0.6.5.7-1.el7.centos.x86_64.rpm           | 419 kB   00:01     
(8/8): zfs-0.6.5.7-1.el7.centos.x86_64.rpm                 | 330 kB   00:02     
--------------------------------------------------------------------------------
Total                                              332 kB/s | 1.7 MB  00:05     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : libuutil1-0.6.5.7-1.el7.centos.x86_64                        1/8 
  Installing : libnvpair1-0.6.5.7-1.el7.centos.x86_64                       2/8 
  Installing : libzpool2-0.6.5.7-1.el7.centos.x86_64                        3/8 
  Installing : kmod-spl-0.6.5.7-1.el7.centos.x86_64                         4/8 
  Installing : spl-0.6.5.7-1.el7.centos.x86_64                              5/8 
  Installing : libzfs2-0.6.5.7-1.el7.centos.x86_64                          6/8 
  Installing : zfs-0.6.5.7-1.el7.centos.x86_64                              7/8 
  Installing : kmod-zfs-0.6.5.7-1.el7.centos.x86_64                         8/8 
  Verifying  : kmod-zfs-0.6.5.7-1.el7.centos.x86_64                         1/8 
  Verifying  : spl-0.6.5.7-1.el7.centos.x86_64                              2/8 
  Verifying  : zfs-0.6.5.7-1.el7.centos.x86_64                              3/8 
  Verifying  : libzfs2-0.6.5.7-1.el7.centos.x86_64                          4/8 
  Verifying  : libnvpair1-0.6.5.7-1.el7.centos.x86_64                       5/8 
  Verifying  : kmod-spl-0.6.5.7-1.el7.centos.x86_64                         6/8 
  Verifying  : libuutil1-0.6.5.7-1.el7.centos.x86_64                        7/8 
  Verifying  : libzpool2-0.6.5.7-1.el7.centos.x86_64                        8/8 

Installed:
  kmod-zfs.x86_64 0:0.6.5.7-1.el7.centos                                        

Dependency Installed:
  kmod-spl.x86_64 0:0.6.5.7-1.el7.centos                                        
  libnvpair1.x86_64 0:0.6.5.7-1.el7.centos                                      
  libuutil1.x86_64 0:0.6.5.7-1.el7.centos                                       
  libzfs2.x86_64 0:0.6.5.7-1.el7.centos                                         
  libzpool2.x86_64 0:0.6.5.7-1.el7.centos                                       
  spl.x86_64 0:0.6.5.7-1.el7.centos                                             
  zfs.x86_64 0:0.6.5.7-1.el7.centos                                             

Complete!
[root@hoge ~]# zpool import
The ZFS modules are not loaded.
Try running '/sbin/modprobe zfs' as root to load them.
[root@hoge ~]# modprobe zfs
[root@hoge ~]# zpool import     
   pool: tankM
     id: 17978947249853082376
  state: ONLINE
 status: Some supported features are not enabled on the pool.
 action: The pool can be imported using its name or numeric identifier, though
 some features will not be available without an explicit 'zpool upgrade'.
 config:

 tankM                                            ONLINE
   ata-SAMSUNG_MCCOE64G8MPP-0VA_SE809N0057-part1  ONLINE
[root@hoge ~]# zpool import tankM
[root@hoge ~]# df
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sdb5       20480000 14936304   5303232  74% /
devtmpfs         8182796        0   8182796   0% /dev
tmpfs            8192824      256   8192568   1% /dev/shm
tmpfs            8192824     9292   8183532   1% /run
tmpfs            8192824        0   8192824   0% /sys/fs/cgroup
tmpfs            1638568        8   1638560   1% /run/user/0
tankM           60436352 38044288  22392064  63% /tankM
このあと、最新カーネルにアップデートしてみました。
[root@hoge ~]# uname -a
Linux hoge 3.10.0-327.13.1.el7.x86_64 #1 SMP Thu Mar 31 16:04:38 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge ~]# yum update kernel
Loaded plugins: fastestmirror, langpacks
base                                                     | 3.6 kB     00:00     
elrepo                                                   | 2.9 kB     00:00     
extras                                                   | 3.4 kB     00:00     
updates                                                  | 3.4 kB     00:00     
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * elrepo: ftp.ne.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package kernel.x86_64 0:3.10.0-327.18.2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package       Arch          Version                       Repository      Size
================================================================================
Installing:
 kernel        x86_64        3.10.0-327.18.2.el7           updates         33 M

Transaction Summary
================================================================================
Install  1 Package

Total download size: 33 M
Installed size: 136 M
Is this ok [y/d/N]: y
Downloading packages:
updates/7/x86_64/prestodelta                               | 502 kB   00:00     
kernel-3.10.0-327.18.2.el7.x86_64.rpm                      |  33 MB   00:03     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : kernel-3.10.0-327.18.2.el7.x86_64                            1/1 
  Verifying  : kernel-3.10.0-327.18.2.el7.x86_64                            1/1 

Installed:
  kernel.x86_64 0:3.10.0-327.18.2.el7                                           

Complete!
DKMS 方式と違い、あっという間に完了します。まさに Great job! ですね。kmod 化してくれた人たちに感謝です。

2016-06-09追記
別のマシンで CentOS 6.8 でも同様にインストールできることを確認しました。
なお、kmod は、kABI の互換性が維持されていることが前提になっているので、自分でカーネルに手を加えて再構築している環境 (オラクル UEK なども) では使えません (そのような環境では、旧来通り DKMS を使えば OK) 。

2016-09-19追記
v0.6.5.8 がリリースされたものの、yum に来ないなと思っていたら、リポジトリの指定が間違っていたようなので、修正しました。
http://download.zfsonlinux.org/epel/7/kmod/$basearch/ こちらが正解。

2016-12-05追記
CentOS 7 の cr リポジトリで kernel-3.10.0-514.el7.x86_64 へアップデートできるようになりましたが、残念ながら kmod-zfs の kABI 互換が保たれないようで、514.el7 にアップデートすると ZFS 領域にアクセスできなくなります。そのうち対応されると思うので、しばらく待っておいたほうがいいかもしれません。または、dkms を使うか。。
https://github.com/zfsonlinux/zfs/issues/5377

2016-12-18追記
7.3 対応 (カーネル 514.el7 系への対応) されてました。よかった。
http://list.zfsonlinux.org/pipermail/zfs-discuss/2016-December/026845.html

2017-08-30追記
CentOS 7.4 cr (カーネル 693.1.1.el7) が来たので、アップデートしたのですが、今回も 7.4 向けの kmod-zfs に切り替える必要がありました。コミュニティ ML の投稿 (下記) を参照して、zfs-release.el7_4.noarch.rpm を入れてから 7.4 向けの kmod-zfs に入れ替えればよいです。
http://list.zfsonlinux.org/pipermail/zfs-discuss/2017-August/029089.html
余談ですが、なんだか Red Hat の開発方針が少し変化してきている気がします。リベースし杉な感じ (自分の環境では、GNOME ターミナルのデフォルト色が変わったり、アイコンが巨大化しました、、、そういうのはやめて欲しいのだが) 。

■関連記事
CentOS 6 の root ファイルシステムに ZFS を使う

2016年6月4日土曜日

SSD の突然死

ちょうど1年ほど前(2015-5-14)に、某ショップから購入した中古 SSD が突然死したので、備忘録です。
壊れた SSD は、Intel 313 Series SSD (SSDSA2UP020G3H) (SSD/20GB/2.5インチ/SATA) というもので、中古で 2000 円程度で購入したものです。20G と小容量で SLC タイプということで、Linux サーバの OS ディスク用にと思ったのですが、実際には殆ど使っておらず、サーバに接続して通電 (モバイルラックに挿していた) していました。
そのサーバ (CentOS 7) が、めずらしくフリーズ (この1年の運用で初めて) したのですが、そのフリーズ後から認識しなくなりました。モバイルラックから取り出す時は、かなりの高温 (かろうじて手に持つことが出来るが、焼き芋のようにアツアツな状態) になってましたので、何か暴走的なことが起きたのかも?
症状から察するに、冷えたらまた認識できるかもと思ったのですが、全く認識されなくなりました。所謂、突然死です。
SSD って、こういう壊れ方するかもしれない、という憶測はもってましたが、自分の手持ちの SSD で本当に突然死したのはこれが初めてです。
幸い、大事なデータや OS 環境すらも入っておらず、たしか空っぽだったので、良かったですが、こういったことを踏まえると、バックアップや冗長化 (RAIDなど) は大事だなと思ったのでした。

購入直後 (2015-05-16) の CDI キャプチャ画面です。新古品と言ってもよさそうな、ショップさんがゼロクリアした程度の値でした。 なお、その当時、安かったのでもう1個購入しているのですが、そちらはまだ動いてます (中身は突然死した個体と同様に空っぽ)。
今後、同様に壊れるかもしれないし、ZFS の L2ARC (キャッシュ) にでもして、酷使してみようかなと思っています。そうだ、そうしよう。

■関連記事
ThinkPad X300 のSSDで不良セクタを発見

2016年4月10日日曜日

perlの無名配列について

自作の perl スクリプトで、次のようなコードがありました。
sub xxxx {
...
    my @tmp_xxxx = split(" ", <FH>) ;
    return $tmp_xxxx[38] ;
}
これを見ていたら、@tmp_xxxx が無駄に思えてきました。オブジェクト指向言語っぽく、split(" ", <FH>)[38] のように書けないのか?と思ったわけです。
調べてみると、無名配列を使うと、次のように書けることを知りました。
sub xxxx {
...
    return = [split(" ", <FH>)]->[38] ;
}
これいいなと思って、他の似た箇所も全部これのほうが良いかなと、さらに自作スクリプトを眺めてみたら、次のようなコードもありました。
...
    (undef, $p) = split(" ", $k)
...
これを見て、性能面では、どの書き方が良いのか?ということが気になってしまいました。
そこで、ベンチマークで確認しました。
#use strict;
#use warnings;
use Benchmark qw(cmpthese timethese :hireswallclock);

$x = "a b c d e f g h i j k l m n o p" ;

cmpthese(1000000,{
    method1 => sub {
        (undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef, my $y)
            = split(" ", $x) ;
    },
    method2 => sub {
        my $y = [split(" ", $x)]->[15] ;
    },
    method3 => sub {
        my @temp = split(" ", $x) ;
        my $y = $temp[15] ;
    },
});
[root@hoge ]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core)
[root@hoge ]# rpm -q perl
perl-5.16.3-286.el7.x86_64
[root@hoge ]# perl bench_split16.pl 
            Rate method2 method3 method1
method2 386100/s      --    -11%    -43%
method3 434783/s     13%      --    -36%
method1 680272/s     76%     56%      --
このように、無名配列(method2)が一番遅いという結果になりました。しかしながら、[38] などという場合は、実行頻度も加味して、可読性の観点から、無名配列による書き方を選んだほうが良い場合もあると思います。
なお、興味深いことに、CentOS 6 では順序が入れ替わります。
[root@hoge ~]# cat /etc/redhat-release 
CentOS release 6.7 (Final)
[root@hoge ~]# rpm -q perl
perl-5.10.1-141.el6.x86_64
[root@hoge ~]# perl bench_split16.pl 
            Rate method3 method2 method1
method3 349650/s      --    -19%    -48%
method2 432900/s     24%      --    -35%
method1 671141/s     92%     55%      --
ThinkPad W520 のマルチブート環境にて実行しています。

perl を毛嫌いする人を見かけますが、この記事に書いたような側面(同じことを幾通りにも書ける)からなのだろうか?と思いました。ところが、これこそ perl の面白さと思うのです。私的には。
よーし、今こそ、もっと perl 勉強しよう (活用しよう) っと!

2016-04-14追記
「Effective Perl」を読んでみたら、スライスを使って次のように書けることを知りました。
    method4 => sub {
        my ($y) = (split(" ", $x))[15] ;
    },
ふたたび、ベンチマークしてみると、スライス(method4)が1番速いという結果になりました。
[root@hoge ~]# cat /etc/redhat-release 
CentOS release 6.7 (Final)
[root@hoge ~]# rpm -q perl
perl-5.10.1-141.el6_7.1.x86_64
[root@hoge ~]# perl bench_split16.pl
            Rate method3 method2 method1 method4
method3 255754/s      --    -17%    -46%    -48%
method2 307692/s     20%      --    -34%    -38%
method1 469484/s     84%     53%      --     -5%
method4 495050/s     94%     61%      5%      --
[root@hoge ~]# service cpuspeed start
Enabling ondemand cpu frequency scaling:                   [  OK  ]
[root@hoge ~]# perl bench_split16.pl
            Rate method3 method2 method1 method4
method3 347222/s      --    -19%    -46%    -49%
method2 431034/s     24%      --    -33%    -36%
method1 645161/s     86%     50%      --     -5%
method4 675676/s     95%     57%      5%      --
本題からそれますが、cpuspeed を止めていると Turbo Boost まで効かなくなるようで、パフォーマンス低下するようです。前回のベンチの際は、chkconfig on にしてたんですが、性能下がるかと思って off にしてましたが、逆効果でした。マシンは、ThinkPad W520 (Core i7 2960XM) です。利用シーンによっては、逆手にとって、静音性のために chkconfig cpuspeed off もよいかもしれません。
人気ブログランキングへ にほんブログ村 IT技術ブログへ