6 dpkg, apt プロフイリング

     
_________________________________________________________________________________________________________________________________________________

apt dpkg のどの部分いのかプロフイリングしてみますこのススタデとして的に どういうをすればパフマンスチニング必要部分できるのかをあきらかにしてみま

6.1 oprofile インスト方法

Debian デフルトネルoprofile サポしていま *20 もし分でコンパイルしていたりして oprofile サポしていないネルoprofile サポきでコン パイルしなおしますオプシCONFIG_OPROFILE ですメニでは

Intrumentation support : Profiling Support : Oprofile system profiling (experimental)*21

にあります

ネルサポしているoprofile 利用するのに必要なのはoprofileですapt-get install oprofileインストしまし

ネルシンボルプロフイリング*22 するためにvmlinux イル必要ですネル分でコンパイルしたにはビルドしたレクトリvmlinux イルがありますmake-kpkg 利用してビルドしたのであれば

 /lib/modules/$(uname -r)/build

から適切リンクがはられているはずです探してみてください *23

6.2 oprofile 分の利用している CPU サポしていない

念ながら 9 現在Debian Package ではIntel core duo CPU では oprofile 動作しませんoprofile 認識でき ていないcpu_type unset というになりますネル側は cpu_type として i386/core しているのでこのでどうやらネル側のサポされているらしいということがわかり ます

$ sudo opcontrol --init
cpu_type ’unset’ is not valid
$ opcontrol --list-events
Unable to open cpu_type file for reading
Make sure you have done opcontrol --init
cpu_type ’unset’ is not valid
$ cat /dev/oprofile/cpu_type
i386/core
$ uname -a
Linux coreduo 2.6.18-rc1dancer #2 SMP Sun Jul 9 09:57:01 JST 2006 i686 GNU/Linux

プロフイルするという的をえるととしてはいくつかえられます

oprofile 発メリングリストたところ5 でだれかがいているの 発見したのでそれをとりこみます念のため今後作するのために BTS にも録しました 380462*24

認してみるとどうやら動作してくれていることがわかりましたここでなのはCPU_CLK_UNHALTED でしCPU サイクルがどのされているのかということをトラキングできますまず CPU がか ている部分してがないかを眺めてみてなくそれなりにできにくくな L2 イベント発生とかを認していけばよいでし

$ sudo opcontrol --init
$ sudo opcontrol --list-events
oprofile: available events for CPU type "Core Solo / Duo"

See Intel Architecture Developer’s Manual Volume 3, Appendix A and
Intel Architecture Optimization Reference Manual (730795-001)

CPU_CLK_UNHALTED: (counter: all)
        Unhalted clock cycles (min count: 6000)
        Unit masks (default 0x0)
        ----------
        0x00: Unhalted core cycles
        0x01: Unhalted bus cycles
        0x02: Unhalted bus cycles of this core while the other core is halted
INST_RETIRED: (counter: all)
        number of instructions retired (min count: 6000)
L2_RQSTS: (counter: all)
        number of L2 requests (min count: 6000)
        Unit masks (default 0xf)
        ----------
        0x08: (M)odified cache state
        0x04: (E)xclusive cache state
        0x02: (S)hared cache state
        0x01: (I)nvalid cache state
        0x0f: All cache states
        0x10: HW prefetched line only
        0x20: all prefetched line w/o regarding mask 0x10.

[]

6.3 デバグシンボル収集する dpkg apt コンパイルしなおす

まずデバがすでにあるについてはインストしますではきいものとして libc6-dbg があるのでそれはインストしますプロフイルイメするな どで必要そうであればあとで他のライブラリなどについてもデバのあるしま

プロフイルdpkg apt デフルトではデバがありませんプロフイル認しやすいよう デバグシンボルしてコンパイルしなおします

 $ debuild -e DEB_BUILD_OPTIONS=nostrip

そのインストします

まずoprofile するのを便にするためにスクリプトみますされたコマンド10 してそのプロ イルするというものです

 read CMD
 sudo opcontrol --shutdown
 sudo opcontrol --reset
 sudo opcontrol --setup \
  --vmlinux=/lib/modules/$(uname -r)/build/vmlinux \
    --event=CPU_CLK_UNHALTED:180000:0:1:1 --separate=library
    sudo opcontrol --start
 for A in $(seq 1 10); do
   $CMD
 done
 opcontrol --dump && \
 opreport -l -p /lib/modules/$(uname -r)/kernel 2>/dev/null \
  | head -30

まずデババイナリ正常できているか単に認しますまずapt-get update でまわしてみま libapt-pkg シンボルレベル認できているのでデバグシンボル存在しているということがわかり ます

sudo apt-get update
[]
CPU: Core Solo / Duo, speed 1833 MHz (estimated)
Counted CPU_CLK_UNHALTED events (Unhalted clock cycles) with a unit mask of 0x00 (Unhalted core cycles) count 180000
samples  %        image name               app name                 symbol name
23823    46.3519  libapt-pkg-libc6.3-6.so.3.11.0 apt-get
SHA1Transform(unsigned int*, unsigned char const*)
12732    24.7724  libapt-pkg-libc6.3-6.so.3.11.0 apt-get
 MD5Transform(unsigned int*, unsigned int const*)
4282      8.3314  processor.ko             processor                acpi_processor_idle
2584      5.0276  libc-2.3.6.so            apt-get                  (no symbols)
2012      3.9147  vmlinux                  vmlinux                  __copy_to_user_ll
503       0.9787  gpgv                     gpgv                     (no symbols)
222       0.4319  vmlinux                  vmlinux                  timer_interrupt
166       0.3230  libapt-pkg-libc6.3-6.so.3.11.0 apt-get
 MD5Summation::Add(unsigned char const*, unsigned long)
160       0.3113  vmlinux                  vmlinux                  page_fault
158       0.3074  libapt-pkg-libc6.3-6.so.3.11.0 apt-get
 SHA1Summation::Add(unsigned char const*, unsigned long)
140       0.2724  libstdc++.so.6.0.8       apt-get                  (no symbols)
134       0.2607  vmlinux                  vmlinux                  find_get_page
125       0.2432  ld-2.3.6.so              http                     do_lookup_x
123       0.2393  vmlinux                  vmlinux                  sysenter_past_esp
95        0.1848  libapt-pkg-libc6.3-6.so.3.11.0 apt-get                  .plt
94        0.1829  ld-2.3.6.so              gpgv                     do_lookup_x
89        0.1732  libc-2.3.6.so            http                     (no symbols)
89        0.1732  vmlinux                  vmlinux                  do_generic_mapping_read
88        0.1712  ld-2.3.6.so              file                     do_lookup_x
87        0.1693  vmlinux                  vmlinux                  memcpy
72        0.1401  ld-2.3.6.so              http                     strcmp
69        0.1343  vmlinux                  vmlinux                  _spin_lock
65        0.1265  vmlinux                  vmlinux                  vfs_read
64        0.1245  ld-2.3.6.so              gpgv                     _dl_elf_hash
62        0.1206  vmlinux                  vmlinux                  __handle_mm_fault
60        0.1167  ld-2.3.6.so              http                     _dl_elf_hash
58        0.1128  oprofiled                oprofiled                (no symbols)

dpkg についてもプロフイリングしてみます*25

sudo dpkg -i ../dselect_1.13.22_i386.deb
[]
CPU: Core Solo / Duo, speed 1833 MHz (estimated)
Counted CPU_CLK_UNHALTED events (Unhalted clock cycles) with a unit mask of 0x00 (Unhalted core cycles) count 180000
samples  %        image name               app name                 symbol name
41009    32.6009  libc-2.3.6.so            dpkg                     (no symbols)
27485    21.8497  processor.ko             processor                acpi_processor_idle
14863    11.8156  dpkg                     dpkg                     parsedb
4845      3.8516  dpkg                     dpkg                     findnamenode
2691      2.1393  dpkg                     dpkg                     findpackage
1994      1.5852  dpkg                     dpkg                     f_dependency
1742      1.3848  vmlinux                  vmlinux                  get_page_from_freelist
1660      1.3196  dpkg-deb                 dpkg-deb                 inflate_fast
1552      1.2338  dpkg                     dpkg                     iterpkgnext
1520      1.2084  dpkg                     dpkg                     .plt
1500      1.1925  dpkg                     dpkg                     varbufaddbuf
1192      0.9476  dpkg                     dpkg                     filesdbinit
1080      0.8586  dpkg                     dpkg                     w_dependency
1001      0.7958  dpkg                     dpkg                     varbufdependency
988       0.7854  dpkg                     dpkg                     nfmalloc
884       0.7028  dpkg                     dpkg                     illegal_packagename
849       0.6749  vmlinux                  vmlinux                  page_fault
802       0.6376  vmlinux                  vmlinux                  __copy_from_user_ll_nocache_nozero
687       0.5461  dpkg                     dpkg                     ensure_packagefiles_available
633       0.5032  dpkg                     dpkg                     varbufaddc
568       0.4515  dpkg                     dpkg                     f_filecharf
516       0.4102  vmlinux                  vmlinux                  __copy_to_user_ll
473       0.3760  dpkg                     dpkg                     copy_dependency_links
458       0.3641  dpkg                     dpkg                     parseversion
427       0.3395  dpkg                     dpkg                     ensure_package_clientdata
406       0.3228  dpkg                     dpkg                     nfstrsave
384       0.3053  dpkg                     dpkg                     varbufrecord

インストしてするというしてみましapt-listbugsapt-listchanges れておりruby python いことがわかりますまたlibc6 のなかでたいをしているのがわかり ます

 sudo apt-get install -y dsh; sudo apt-get remove -y libdshconfig1
[]
Counted CPU_CLK_UNHALTED events (Unhalted clock cycles) with a unit mask of 0x00 (Unhalted core cycles) count 180000
samples  %        image name               app name                 symbol name
195383   24.3783  processor                processor                (no symbols)
114285   14.2595  libc-2.3.6.so            dpkg                     (no symbols)
67157     8.3793  libruby1.8.so.1.8.4      ruby1.8                  (no symbols)
48893     6.1005  libc-2.3.6.so            dpkg-query               (no symbols)
41537     5.1826  dpkg                     dpkg                     parsedb
30685     3.8286  perl                     perl                     (no symbols)
28353     3.5377  dpkg-query               dpkg-query               parsedb
26135     3.2609  python2.4                python2.4                (no symbols)
13951     1.7407  libc-2.3.6.so            ruby1.8                  (no symbols)
10023     1.2506  libc-2.3.6.so            apt-get                  (no symbols)
9138      1.1402  dpkg                     dpkg                     findnamenode
7914      0.9874  vmlinux                  vmlinux                  get_page_from_freelist
7656      0.9553  dpkg                     dpkg                     findpackage
5963      0.7440  vmlinux                  vmlinux                  read_hpet
5777      0.7208  libc-2.3.6.so            perl                     (no symbols)
5465      0.6819  dpkg                     dpkg                     f_dependency
5108      0.6373  dpkg-query               dpkg-query               findpackage
4525      0.5646  dpkg                     dpkg                     filesdbinit
4452      0.5555  libapt-pkg-libc6.3-6.so.3.11.0 apt-get
 pkgDepCache::CheckDep(pkgCache::DepIterator, int,
 pkgCache::PkgIterator&)
4237      0.5287  vmlinux                  vmlinux                  page_fault
4182      0.5218  dpkg                     dpkg                     .plt
4101      0.5117  dpkg                     dpkg                     varbufaddbuf
3874      0.4834  dpkg-query               dpkg-query               f_dependency
3744      0.4671  dpkg                     dpkg                     iterpkgnext
3645      0.4548  libstdc++.so.6.0.8       apt-get                  (no symbols)
3287      0.4101  libapt-pkg-libc6.3-6.so.3.11.0 apt-get
 pkgProblemResolver::MakeScores()
3277      0.4089  vmlinux                  vmlinux                  delay_tsc

6.4 テスト

テストしますchroot apt-get update, apt-get install apt-get remove してベンチマをとてみまし

dpkg apt するとシステム動作しなくなるためテストすることは大切です

chroot ではchroot イルアクセスすることができませんそのためbind-mount イルせます必要になるイルとしてはapt/dpkg デバoprofile あれば) 、 してLinux kernel する vmlinux イルです

 $ sudo cowbuilder --login --bindmount $(pwd)
 # apt-get install gnupg
 # apt-get update
 # apt-get install oprofile libc6-dbg
 # dpkg -i (bind-moumt したところにおいたした apt/dpkg/oprofile)
 # apt-get -y install gnome; apt-get -y remove libglib2.0-0
 # unset LD_PRELOAD
 # unset COWDANCER_ILISTFILE
 # mount -t oprofilefs nodev /dev/oprofile >/dev/null

chroot 調べてみるとperl たいをしているということがわかりましたこりニングしにくいです 存関などのがかかているかとをたてていたのですが露骨立っとい うのはけることはできませんでした

apt-get install -y dsh; apt-get remove -y libdshconfig1
[]
CPU: Core Solo / Duo, speed 1833 MHz (estimated)
Counted CPU_CLK_UNHALTED events (Unhalted clock cycles) with a unit mask of 0x00 (Unhalted core cycles) count 180000
samples  %        image name               app name                 symbol name
51258    32.2132  processor                processor                (no symbols)
7929      4.9830  libc-2.3.6.so            apt-get                  (no symbols)
7321      4.6009  libc-2.3.6.so            dpkg                     (no symbols)
5239      3.2925  vmlinux                  vmlinux                  read_hpet
4377      2.7507  libc-2.3.6.so            perl                     (no symbols)
4282      2.6910  libapt-pkg-libc6.3-6.so.3.11.0 apt-get
 pkgDepCache::CheckDep(pkgCache::DepIterator, int,
 pkgCache::PkgIterator&)
2888      1.8150  libstdc++.so.6.0.8       apt-get                  (no symbols)
2570      1.6151  libapt-pkg-libc6.3-6.so.3.11.0 apt-get
 debVersioningSystem::CmpFragment(char const*, char const*, char const*,
 char const*)
2548      1.6013  libapt-pkg-libc6.3-6.so.3.11.0 apt-get
 pkgProblemResolver::MakeScores()
2045      1.2852  dpkg                     dpkg                     parsedb
2019      1.2688  libapt-pkg-libc6.3-6.so.3.11.0 apt-get
 debVersioningSystem::DoCmpVersion(char const*, char const*, char
 const*, char const*)
1722      1.0822  libapt-pkg-libc6.3-6.so.3.11.0 apt-get
 pkgDepCache::Update(OpProgress*)
1571      0.9873  dpkg                     dpkg                     findnamenode
1558      0.9791  perl                     perl                     Perl_sv_gets
1461      0.9182  perl                     perl                     Perl_yyparse
1408      0.8849  libapt-pkg-libc6.3-6.so.3.11.0 apt-get
 debVersioningSystem::CheckDep(char const*, int, char const*)
1222      0.7680  vmlinux                  vmlinux                  __copy_to_user_ll
1181      0.7422  vmlinux                  vmlinux                  get_page_from_freelist
1129      0.7095  perl                     perl                     S_hv_fetch_common
1055      0.6630  perl                     perl                     Perl_yylex
1054      0.6624  ldconfig                 ldconfig                 (no symbols)
1051      0.6605  libapt-pkg-libc6.3-6.so.3.11.0 apt-get
 OpProgress::CheckChange(float)
1050      0.6599  vmlinux                  vmlinux                  page_fault
911       0.5725  libapt-pkg-libc6.3-6.so.3.11.0 apt-get
 pkgPolicy::GetCandidateVer(pkgCache::PkgIterator)
816       0.5128  dpkg                     dpkg                     filesdbinit
815       0.5122  libapt-pkg-libc6.3-6.so.3.11.0 apt-get
 pkgDepCache::DependencyState(pkgCache::DepIterator&)
793       0.4984  libapt-pkg-libc6.3-6.so.3.11.0 apt-get                  .plt

まずopreport 認しますネル16%, apt-get 10%, perl 7% であることがわかりますここ なのはこのdpkg ニングしてもして反映しなさそうだということがになたこと です

# opreport
CPU: Core Solo / Duo, speed 1833 MHz (estimated)
Counted CPU_CLK_UNHALTED events (Unhalted clock cycles) with a unit mask of 0x00 (Unhalted core cycles) count 180000
CPU_CLK_UNHALT...|
  samples|      %|
------------------
   182440 51.3356 processor
    59664 16.7885 vmlinux
    38517 10.8380 apt-get
        CPU_CLK_UNHALT...|
          samples|      %|
        ------------------
            25578 66.4070 libapt-pkg-libc6.3-6.so.3.11.0
             7929 20.5857 libc-2.3.6.so
             2888  7.4980 libstdc++.so.6.0.8
             1701  4.4162 apt-get
              381  0.9892 ld-2.3.6.so
               12  0.0312 anon (tgid:31689 range:0xb7f47000-0xb7f48000)
               11  0.0286 anon (tgid:31917 range:0xb7f49000-0xb7f4a000)
                9  0.0234 anon (tgid:31841 range:0xb7fcb000-0xb7fcc000)
                8  0.0208 anon (tgid:31765 range:0xb7f9d000-0xb7f9e000)
    27091  7.6230 perl
        CPU_CLK_UNHALT...|
          samples|      %|
        ------------------
            22216 82.0051 perl
             4377 16.1567 libc-2.3.6.so
              273  1.0077 libpthread-2.3.6.so
              214  0.7899 ld-2.3.6.so
                3  0.0111 libnss_compat-2.3.6.so
                2  0.0074 libdl-2.3.6.so
                2  0.0074 Fcntl.so
                1  0.0037 libnss_files-2.3.6.so
                1  0.0037 libnss_nis-2.3.6.so
                1  0.0037 IO.so
                1  0.0037 gettext.so
    23916  6.7296 opreport
        CPU_CLK_UNHALT...|
          samples|      %|
        ------------------
            14091 58.9187 opreport
             5445 22.7672 libc-2.3.6.so
             4119 17.2228 libstdc++.so.6.0.8
              257  1.0746 ld-2.3.6.so
                3  0.0125 libgcc_s.so.1
                1  0.0042 libpopt.so.0.0.0
    16010  4.5049 dpkg
        CPU_CLK_UNHALT...|
          samples|      %|
        ------------------
             8611 53.7851 dpkg
             7321 45.7277 libc-2.3.6.so
               74  0.4622 ld-2.3.6.so

このして apt-get update についてはニングできそうだということがわかたのですがそれはま 機会

6.5 まとめ

この文章では Debian oprofile 利用してボトルネするをするためのについてまとめま した

6.6 文献

____________________________________________________________________________________________

PIC Debian

2006 9 16   1 発行
エ リ ア Debian 発行
__________________________