DBIx::Class導入時Perlアップデート

CentOS5.1の環境にて、CatalystのためのO/RマッパーにDBIx::Class導入したとき、

WARNING: DBIx::Class::StartupCheck: This version of Perl is likely to exhibit
extremely slow performance for certain critical operations.
Please consider recompiling Perl.  For more information, see
https://bugzilla.redhat.com/show_bug.cgi?id=196836 and/or
http://lists.scsys.co.uk/pipermail/dbix-class/2007-October/005119.html.
You can suppress this message by setting DBIC_NO_WARN_BAD_PERL=1 in your
environment.

と散々言われた。おそらくワーニングのとおり環境変数DBIC_NO_WARN_BAD_PERL=1をセットすればいいんだろうが、パフォーマンス悪くなるとかいうのが気になったのでググってみたらいろいろ出てきたのでメモ。

kazeburoさんやYappoさんが言ってたRed Hat系のディストリビューションPerlのパッケージにはoverloadされたクラスをblessするとリファレンスを全て検索するパッチがあてられていて遅いので注意してねって感じですか。


hide-k.net#blog: CentOSでDBIC最新版を使うときの注意

要は、CentOSRPMPerl使用すると、余計なパッチが当たってしまっているので、以下のとおり除外したものを使え、とのこと。

FedoraがあてたPatch

  • perl-5.8.8-U27509.patch
  • perl-5.8.8-U27512.patch

が原因なのでspecファイルいじってrebuild


kazeburo : FC5 FC6でPerlが遅い問題

さらによく読み進めると結構深刻な問題なようで、use overload; してblessしたモジュールが覿面にパフォーマンス低下するようで。


とこのuse overload;って初見だったんだけど、Perlって演算子オーバーロードができるんだね。

…知らなかった。こんなのもあるのかー。


というわけで、CentOSの該当SRPMバラして、SPECファイル修正してPerlRPMをリビルド。

 $ wget ftp://ftp.iij.ad.jp/pub/linux/centos/5/updates/SRPMS/perl-5.8.8-10.el5_2.3.src.rpm
 $ rpm -ivh perl-5.8.8-10.el5_2.3.src.rpm
 $ cd SPECS
 $ vim perl.spec
--- perl.spec.bak       2008-06-05 21:01:41.000000000 +0900
+++ perl.spec   2008-08-05 17:46:06.000000000 +0900
@@ -5,7 +5,7 @@
 %define multilib_64_archs x86_64 s390x ppc64 sparc64
 
 %define perlver    5.8.8
-%define perlrel    10%{?dist}.3
+%define perlrel    10%{?dist}.3nooverloadpatch
 %define perlepoch  4
 
 %{?!perl_debugging:    %define perl_debugging 0}
@@ -160,8 +160,8 @@
 Patch27116:    perl-5.8.8-U27116.patch
 Patch27391:     perl-5.8.8-U27391.patch
 Patch27426:    perl-5.8.8-U27426.patch
-Patch27509:     perl-5.8.8-U27509.patch
-Patch27512:     perl-5.8.8-U27512.patch
+#Patch27509:     perl-5.8.8-U27509.patch
+#Patch27512:     perl-5.8.8-U27512.patch
 Patch27604:     perl-5.8.8-U27604.patch
 Patch27605:     perl-5.8.8-U27605.patch
 Patch27914:     perl-5.8.8-U27914.patch
@@ -370,9 +370,9 @@
 
 %patch27426 -p1
 
-%patch27509 -p1
+#%patch27509 -p1
 
-%patch27512 -p1
+#%patch27512 -p1
 
 %patch27604 -p1
 $ rpmbuild -ba perl.spec

これで、RPMS/i386以下に

ができあがりー。


このうち

をインストール。

 $ sudo rpm -Uvh perl-5.8.8-10.3nooverloadpatch.i386.rpm

2008/10/30追記:

CentOS5.2にしたらPerlのパッケージバージョンがperl-5.8.8-15.1にあがってた。。


ChangeLog読んだら、この周りの対応がされてたっぽい。

* Thu Aug 28 2008 Marcela Maslanova <mmaslano@redhat.com> - 4:5.8.8-15.el5.1
- add upstream fix for bless/overload problem (changes 31996,32018,32019,
        32025) and perl-5.8.8-bug24254.patch. Without this patch had bless
        poor performance.
- Resolves: rhbz#460308

なので、そのままDBIx::Classで怒られなくなると思いきや、やっぱり怒られる。(T_T)


しょうがないので、関連するパッチを一切合財排除。

  • Patch27509: perl-5.8.8-U27509.patch
  • Patch27512: perl-5.8.8-U27512.patch
  • Patch24254: perl-5.8.8-bug24254.patch
  • Patch31996: perl-5.8.8-U31996.patch
  • Patch32018: perl-5.8.8-U32018.patch
  • Patch32019: perl-5.8.8-U32019.patch
  • Patch32025: perl-5.8.8-U32025.patch

大元のパッチ(27509,27512)はupstream changesの組み込みということなのである程度意味があるんだろうが。。うーん…。