ルギア君の戯言

雑多な記事。

texmf の ls-R の必要性

ls-R の必要性

まず、インストール時に mktexlsr を実行する必要があるかどうか以前に ls-R ファイルそのものが必要かどうか。


TeX Live で ls-R ファイルがある理由は、

  • TeX Live のデフォルト設定である
  • Momonga Linux が提供していた teTeX のデフォルト設定と同じである
  • ls-R ファイルがない場合の tex 処理にストレスを感じた

と言ったところ。


問題になるのは 3 番目の奴。ストレスを感じるかどうかは個人の問題である。

# hdparm -Tt /dev/sda

/dev/sda:
 Timing cached reads:   1692 MB in  2.00 seconds = 846.49 MB/sec
 Timing buffered disk reads: 238 MB in  3.02 seconds =  78.73 MB/sec

こんな HDD で、ファイルシステムは ext4 (おそらくこれが nilfs2 だったりするとまた事情は全く変わる)。で、ls-R を使わないように設定し、ls-R を削除する。この時 kpsewhich -a でいろいろ探し、その実行時間を計測する。この計測は 2 回行い、ディスクキャッシュの効果を調べる。

まず、ls-R を使わない設定とは上の TEXMF= にて !! を外す (ls-R を探さない) のと、TEXMFDBS= から削除する (ls-R を作成しない)。なお、TEXMFDBS= を空にした場合の mktexlsr の実行は何もしないのと「ほぼ」等価。

--- /usr/share/texmf/web2c/texmf.cnf.orig       2011-09-16 19:44:22.000000000 +0900
+++ /usr/share/texmf/web2c/texmf.cnf    2011-09-22 22:44:02.036369322 +0900
@@ -117,7 +117,7 @@
 % versions should take precedence over those (although it is generally a
 % source of confusion to have different versions of a package installed,
 % whatever the trees, so try to avoid it).
-TEXMF = {$TEXMFCONFIG,$TEXMFVAR,$TEXMFHOME,!!$TEXMFSYSCONFIG,!!$TEXMFSYSVAR,!!$TEXMFMAIN,!!$TEXMFLOCAL,!!$TEXMFDIST}
+TEXMF = {$TEXMFCONFIG,$TEXMFVAR,$TEXMFHOME,$TEXMFSYSCONFIG,$TEXMFSYSVAR,$TEXMFMAIN,$TEXMFLOCAL,$TEXMFDIST}
 
 % Where to look for ls-R files.  There need not be an ls-R in the
 % directories in this path, but if there is one, Kpathsea will use it.
@@ -125,7 +125,8 @@
 % does not create ls-R files in the non-!! elements -- because if an
 % ls-R is present, it will be used, and the disk will not be searched.
 % This is arguably a bug in kpathsea.
-TEXMFDBS = {!!$TEXMFSYSCONFIG,!!$TEXMFSYSVAR,!!$TEXMFMAIN,!!$TEXMFLOCAL,!!$TEXMFDIST}
+%TEXMFDBS = {!!$TEXMFSYSCONFIG,!!$TEXMFSYSVAR,!!$TEXMFMAIN,!!$TEXMFLOCAL}
+TEXMFDBS = {}
 
 % The system trees.  These are the trees that are shared by all the users.
 % If a tree appears in this list, the mktex* scripts will use

ls-R を削除。

# rm /usr/share/texmf-dist/ls-R
rm: remove regular file `/usr/share/texmf-dist/ls-R'? y
[lugia@arpa-castle ~]$ time kpsewhich -a graphics.sty
/usr/share/texmf-dist/tex/latex/graphics/graphics.sty

real    0m10.067s
user    0m0.040s
sys     0m0.173s
[lugia@arpa-castle ~]$ time kpsewhich -a graphics.sty
/usr/share/texmf-dist/tex/latex/graphics/graphics.sty

real    0m0.057s
user    0m0.025s
sys     0m0.031s
[lugia@arpa-castle ~]$ time kpsewhich -a subfig.sty
/usr/share/texmf-dist/tex/latex/subfig/subfig.sty

real    0m0.105s
user    0m0.023s
sys     0m0.044s
[lugia@arpa-castle ~]$ time kpsewhich -a graphics.sty subfig.sty
/usr/share/texmf-dist/tex/latex/graphics/graphics.sty
/usr/share/texmf-dist/tex/latex/subfig/subfig.sty

real    0m0.075s
user    0m0.028s
sys     0m0.043s

始めは時間がかかるが、2 回目以降はほぼ即時に返事が来る。


次に、mktexlsr を使う場合の実行時間を調べる (こちらは ls-R を読むだけのためディスクキャッシュの影響は殆どなくなる)。

# mv texmf.cnf.orig texmf.cnf
# mktexlsr 
mktexlsr: Updating /usr/share/texmf/ls-R... 
mktexlsr: Updating /usr/share/texmf-config/ls-R... 
mktexlsr: Updating /usr/share/texmf-dist/ls-R... 
mktexlsr: Updating /usr/share/texmf-var/ls-R... 
mktexlsr: Done.
[lugia@arpa-castle ~]$ time kpsewhich -a graphics.sty
/usr/share/texmf-dist/tex/latex/graphics/graphics.sty

real    0m0.125s
user    0m0.108s
sys     0m0.015s
[lugia@arpa-castle ~]$ time kpsewhich -a subfig.sty
/usr/share/texmf-dist/tex/latex/subfig/subfig.sty

real    0m0.126s
user    0m0.106s
sys     0m0.019s
[lugia@arpa-castle ~]$ time kpsewhich -a graphics.sty
/usr/share/texmf-dist/tex/latex/graphics/graphics.sty

real    0m0.121s
user    0m0.103s
sys     0m0.016s
[lugia@arpa-castle ~]$ time kpsewhich -a graphics.sty subfig.sty
/usr/share/texmf-dist/tex/latex/graphics/graphics.sty
/usr/share/texmf-dist/tex/latex/subfig/subfig.sty

real    0m0.126s
user    0m0.112s
sys     0m0.013s

この場合、探す物の数はおろか回数や順番に依らず一定だということだ。残念なのは、
ディスクキャッシュより遅い
ことだ。


さて、実際のコンパイルではどれだけ速度に差がでるか、だ。ここでは 11 個の LaTeX ファイルを Makefile を使って pdf を作成するまで一気にやった時の実行時間を調べる。\ref{} を使ったので、platex は各々 2 回ずつ + dvipdfmx の実行である。なお、pdf 以外の画像ファイルでは、gs を実行する。

LATEX=platex -halt-on-error -interaction=nonstopmode -kanji=utf8
DVIPDFMX=dvipdfmx -V 5
EBB=ebb
XBB=ebb -x

SRCS=0.tex 1.tex 2.tex 3.tex 4.tex 5.tex \
     6.tex 7.tex 8.tex 9.tex 10.tex 11.tex
HEADER=header.tex

.SUFFIXES: .tex .dvi .pdf .png .jpg .bb .xbb
.PHONY: all clean distclean

all: $(SRCS:.tex=.pdf)

.tex.dvi:  
        $(LATEX) $<
        $(LATEX) $<

.dvi.pdf:
        $(DVIPDFMX) $<

.pdf.bb:
        $(EBB) $<

.png.bb:
        $(EBB) $<

.jpg.bb:
        $(EBB) $<

0.pdf: header.tex tashizan.f answer/0.f
1.pdf: header.tex answer/1/*
2.pdf: header.tex tridag.f
3.pdf: header.tex bounce.pdf bounce.bb hanabi.c
4.pdf: header.tex
5.pdf: header.tex
6.pdf: header.tex futo.f
7.pdf: header.tex
8.pdf: header.tex
9.pdf: header.tex
10.pdf: header.tex
11.pdf: header.tex

clean:
        $(RM) $(SRCS:.tex=.dvi) $(SRCS:.tex=.aux) $(SRCS:.tex=.log)

distclean: clean
        $(RM) $(SRCS:.tex=.pdf)

なお、ヘッダ部分は共通で、

\documentclass[a4j]{jsarticle}
\usepackage{listings}
\usepackage{amsmath}
\usepackage[T1]{fontenc}
%\usepackage[deluxe]{otf}
\usepackage{inconsolata}
\usepackage[charter]{mathdesign}
\usepackage{bbding}
\usepackage{nicefrac}
\usepackage{faktor}
\usepackage[dvipdfm]{graphicx}
\usepackage{wrapfloat}
\usepackage{color}

% ...

である。まず、ls-R を使わない場合ですでにディスクキャッシュが効いている場合。

$ time make
... (略) ...

real    0m27.445s
user    0m11.954s
sys     0m12.707s

ls-R を使わずに、ディスクキャッシュされてない場合。

$ time make
... (略) ...

real    0m50.528s
user    0m12.142s
sys     0m13.495s

見かけでは殆ど変わったようには見えぬのだが…。なお、ディスクキャッシュは単純ではないので、kpsewhich を実行しておけば全てがキャッシュされる「わけではない」。多分ルーチンも違うかも。したがって、思わぬところで引っかかる可能性がでる。


ls-R を使った場合。

$ time make
... (略) ...

real    0m16.989s
user    0m13.888s
sys     0m2.590s

kpsewhich の時と違ってかなり速くなった。

結論
  1. こういう事情では ls-R はもはや不要である、とも言える。
    • とても遅くストレスになるならユーザーに変えてもらう。

パッケージのインストール

yum でインストールしたりアンインストールしたりする場合の mktexlsr の実行時間について考察する。
まずは ls-R あり。

# time yum remove -y texlive-texmf-latex-subfig
Loaded plugins: dellsysid, installonlyn, langpacks, presto, refresh-packagekit
Setting up Remove Process
Resolving Dependencies
--> Running transaction check
---> Package texlive-texmf-latex-subfig.noarch 0:2010-9m.mo8 will be erased
--> Processing Dependency: texlive-texmf-latex-subfig >= 2010-6m for package: texlive-all-2010-2m.mo8.noarch
--> Running transaction check
---> Package texlive-all.noarch 0:2010-2m.mo8 will be erased
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package                     Arch    Version         Repository            Size
================================================================================
Removing:
 texlive-texmf-latex-subfig  noarch  2010-9m.mo8     @momonga-devel-i686  920 k
Removing for dependencies:
 texlive-all                 noarch  2010-2m.mo8     @momonga-devel-i686  0.0  

Transaction Summary
================================================================================
Remove        1 Package  (+    1 Dependent package)

Installed size: 920 k
Downloading Packages:
Running Transaction Check
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Warning: RPMDB altered outside of yum.
** Found 2 pre-existing rpmdb problem(s), 'yum check' output follows:
dejagnu-1.4.4-8m.mo8.noarch has missing requires of expect >= ('0', '5.21', None)
flashplayer-plugin-11.0.d1.98-2m.mo8.x86_64 is a duplicate with flashplayer-plugin-10.3.181.26-1m.mo8.i686
  Erasing    : texlive-all-2010-2m.mo8.noarch                               1/2 
  Erasing    : texlive-texmf-latex-subfig-2010-9m.mo8.noarch                2/2 

Removed:
  texlive-texmf-latex-subfig.noarch 0:2010-9m.mo8                               

Dependency Removed:
  texlive-all.noarch 0:2010-2m.mo8                                              

Complete!

real    2m22.534s
user    0m16.565s
sys     0m4.042s
# time yum install -y texlive-texmf-latex-subfig
Loaded plugins: dellsysid, installonlyn, langpacks, presto, refresh-packagekit
local-development                                        | 2.9 kB     00:00 ... 
local-development-Alter                                  | 2.9 kB     00:00 ... 
local-development-Nonfree                                | 2.9 kB     00:00 ... 
momonga-devel-i686                                       | 3.6 kB     00:00     
momonga-devel-i686/primary_db                            | 6.6 MB     00:01     
momonga-devel-x86_64                                     | 3.6 kB     00:00     
momonga-devel-x86_64/primary_db                          | 6.6 MB     00:01     
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package texlive-texmf-latex-subfig.noarch 0:2010-9m.mo8 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package                      Arch     Version       Repository            Size
================================================================================
Installing:
 texlive-texmf-latex-subfig   noarch   2010-9m.mo8   momonga-devel-i686   493 k

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

Total download size: 493 k
Installed size: 920 k
Downloading Packages:
Setting up and reading Presto delta metadata
Processing delta metadata
Package(s) data still to download: 493 k
texlive-texmf-latex-subfig-2010-9m.mo8.noarch.rpm        | 493 kB     00:00     
Running Transaction Check
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : texlive-texmf-latex-subfig-2010-9m.mo8.noarch                1/1 

Installed:
  texlive-texmf-latex-subfig.noarch 0:2010-9m.mo8                               

Complete!

real    0m19.150s
user    0m12.730s
sys     0m1.948s

次に ls-R なし。

# time yum remove -y texlive-texmf-latex-subfig
Loaded plugins: dellsysid, installonlyn, langpacks, presto, refresh-packagekit
Setting up Remove Process
Resolving Dependencies
--> Running transaction check
---> Package texlive-texmf-latex-subfig.noarch 0:2010-9m.mo8 will be erased
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package                     Arch    Version         Repository            Size
================================================================================
Removing:
 texlive-texmf-latex-subfig  noarch  2010-9m.mo8     @momonga-devel-i686  920 k

Transaction Summary
================================================================================
Remove        1 Package

Installed size: 920 k
Downloading Packages:
Running Transaction Check
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Erasing    : texlive-texmf-latex-subfig-2010-9m.mo8.noarch                1/1 

Removed:
  texlive-texmf-latex-subfig.noarch 0:2010-9m.mo8                               

Complete!

real    0m6.833s
user    0m4.771s
sys     0m1.144s
# time yum install -y texlive-texmf-latex-subfig
Loaded plugins: dellsysid, installonlyn, langpacks, presto, refresh-packagekit
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package texlive-texmf-latex-subfig.noarch 0:2010-9m.mo8 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package                      Arch     Version       Repository            Size
================================================================================
Installing:
 texlive-texmf-latex-subfig   noarch   2010-9m.mo8   momonga-devel-i686   493 k

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

Total download size: 493 k
Installed size: 920 k
Downloading Packages:
Setting up and reading Presto delta metadata
Processing delta metadata
Package(s) data still to download: 493 k
texlive-texmf-latex-subfig-2010-9m.mo8.noarch.rpm        | 493 kB     00:00     
Running Transaction Check
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : texlive-texmf-latex-subfig-2010-9m.mo8.noarch                1/1 

Installed:
  texlive-texmf-latex-subfig.noarch 0:2010-9m.mo8                               

Complete!

real    0m8.428s
user    0m5.821s
sys     0m1.342s

まあ、確かに速いな。半分…か…。

パッケージ数の削減

パッケージ数の削減は多いに構わないのだがいくつか問題もある。


極端な例として

/usr/share/texmf*

以下をすべて 1 つにまとめた場合、圧縮される分を考慮しても kdelibs-apidocs よりサイズがでかくなることは間違いない。DVD に収録されなくてもよいので、サイズに付いては問題ないかも知れないが (いくつか TeX 系に依存するパッケージ kile とかがドロップすることになるんだろう)。


まとめるとしてどういう風にまとめるかも少々問題ではある。自分の中であたためていた構想としては

texlive-pdftex         \
texlive-texmf-pdftex   / texlive-pdftex

texlive-texmf-latex    \
texlive-texmf-latex-*  / texlive-latex ← ここが今 1167 個ある。

...

といった感じ。ここで示したように、texlive-texmf-* なパッケージは実は 60% 以上が texlive-texmf-latex-* であり、均等なサイズに分けるというのは難しいだろう。


余談だが、本家のインストーラ install-tl では実に 2300 個以上 *1 のアーカイブをダウンロードして展開する。RPM と違って簡単に出し入れできないので、なぜそんなに細かく分けたのかは疑問が残る。パッケージ単位でインストールの設定出来るのかな…?

結論(?)

  • 半ば当り前だが mktexlsr まで外さなくともとりあえず ls-R を作成させないだけでもインストール時間の削減は可能。
    • 問題はデフォルトの設定をどっちにするか、である。
      • 作成させなくとも tex は使えるので作成させない方に軍配があがるのだろうか。
      • どっちの設定でもこのファイルは kpathsea に含まれるファイルで、DVD を何のパッケージの変更をせずインストールすれば入るため (Mo7)、多少注意喚起すれば見逃さないのでは? *2
    • 一番最初に ls-R なしで platex を起動した時の苛立ちはどこへいったのだろうか。
    • あとアップデート時に上書きされないかだけ注視しておく必要がある。
    • ls-R を置くかどうかは過去に n* さんと議論した記憶があるような、ないような
  • パッケージ数の削減については latex-* を 1 つにするか複数にするかが問題とはなる
    • インストールのしやすさ的には 1 つだろうな。
    • これだけでも 700 個ぐらいまで減るんだな。なんか淋しい。
    • 多分カテゴリわけでやると 1/10 どころか 1/100 以下になると思われ。

その他の可能性について

texlive-* なパッケージをインストールしたりアップデートした際に yum 側で mktexlsr を実行するプラグインを書くことはできるだろうか。調べては見たものの資料があまりなかった。


監視する Daemon を作って
f:id:lugia:20110923090408p:image
みたいなことをやるとか。ま、これも起動させるのを忘れたら話にならないので意味は無いかも。

*1:TeX Live 2011

*2:何も知らずにやってしまう人はいるかも知れないが…。