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するとリファレンスを全て検索するパッチがあてられていて遅いので注意してねって感じですか。
要は、CentOSのRPM版Perl使用すると、余計なパッチが当たってしまっているので、以下のとおり除外したものを使え、とのこと。
FedoraがあてたPatch
が原因なのでspecファイルいじってrebuild
さらによく読み進めると結構深刻な問題なようで、use overload; してblessしたモジュールが覿面にパフォーマンス低下するようで。
とこのuse overload;って初見だったんだけど、Perlって演算子のオーバーロードができるんだね。
- http://search.cpan.org/~rgarcia/perl-5.10.0/lib/overload.pm
- http://perldoc.jp/docs/perl/5.6.1/overload.pod
…知らなかった。こんなのもあるのかー。
というわけで、CentOSの該当SRPMバラして、SPECファイル修正してPerlのRPMをリビルド。
$ 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以下に
- perl-5.8.8-10.3nooverloadpatch.i386.rpm
- perl-debuginfo-5.8.8-10.3nooverloadpatch.i386.rpm
- perl-suidperl-5.8.8-10.3nooverloadpatch.i386.rpm
ができあがりー。
このうち
をインストール。
$ 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の組み込みということなのである程度意味があるんだろうが。。うーん…。