[DBチューニングコンテスト とんがりナレッジ] Arch Linux で勝負してみた

9/25(金)に社内Oracleのチューニングコンテスト決勝戦が開催されました。
チューニングコンテストのルールは予算10万円でマシンを構築し、予選でTPC-Cのnumber of warehouses=1,sessio=20を規定時間以内に終了させれば決勝進出という内容で、決勝戦はTPC-Hのscale factor=10,session=4の実行終了までの時間を競いました。
細かなチューニングをせずに勝負に挑み2位という結果でした。
その要因の1つがマシンスペックの差によるものです。
これはCPU,メモリ,マザーボードをオーバークロック向きの構成でまとめたことが大きかったように思います。

そしてもう1つの要因となったのがOSでした。
OSを選択する上でこだわったのはシンプルであるということです。
いろいろ検討する中で見つけたのはがArch LinuxというLinuxのディストリビューションでした。
Arch Linuxは「シンプリシティ」、ミニマリズム、エレガンスさ、コードの正しさに焦点を当てて開発されている軽量なLinuxでARM向けのイメージ用意されており、Raspberry PiのOSとしても知られています。
ただし、シンプルさゆえにインストーラは存在せずLive CDを起動してもコンソールが立ち上がるのみといった非常に潔い構成となっています。
検証のため、OSとOracleをインストールした直後にTPC-Hのscale factor=10,session=4でCentOSと比較してみましたが1.17倍ほどArch Linuxの方が速いという結果となりました。

環境構築にあたりUEFIブート、Fake RAIDでディスクを構築しましたが情報がまとまっているサイトがなく苦労しましたのでOracleの導入までの手順を紹介したいと思います。

 

  1. Arch Linux導入

    • インストールメディアの準備次のいずれかからダウンロードしてください。
      ローリングアップデートを採用しているためバージョンではなく日付でインストールメディアは管理されています。
      http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso
      http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/iso
    • キーボードレイアウト変更
      インストール作業用にキーボードレイアウトを変更します。
      英語キーボードで作業する場合は不要です。

      # loadkeys jp106
    • ネットワーク接続の確立
      ip aもしくはifconifg

      ipが割り当てられていることを確認。
      リポジトリからパッケージをダウンロードすることになりますので必ずネットワークは確立してください。
      ※インストール後にifconfigを使用したい場合はnet-toolsの導入が必要です。

      # ping -c 3 www.google.com
    • sshの設定
      この設定はLive CDから起動した状態でsshを使用したい場合の設定です。
      インストール後のssh設定は別途必要になります。
      以降の設定をコピー&ペーストで実行したい場合は設定してください。

      # systemctl start sshd
      # passwd "パスワード"
    • パーティション作成
      まずはRAIDの構成を確認します。

      # ls -l /dev/md/*

      raid
      デュアルブートにするためにFakeRaidのRAID0で2つRAID0_VOL1,RAID0_VOL1のラベル名で用意しています。
      今回はArch Linuxには/dev/md/RAID0_VOL1_0を使用します。

      それではパーティションを作成していきます。
      最低限必要となるパーティションは3つあります。

      1. EFI System Partition
      2. Swap Partition
      3. root Partition

      Arch linuxを紹介しているサイトではfdisk,cgdiskなどを使用していますが今回はgdiskを使用します。

      # cgdisk /dev/md/RAID0_VOL1_0

      1. EFI System Partition

       Command (? for help): n
       Partition number (1-128, default 1): 
       First sector (34-500129758, default = 2048) or {+-}size{KMGTP}:
       Last sector (2048-500129758, default = 500129758) or {+-}size{KMGTP}: +512M
       Current type is 'Linux filesystem'
       Hex code or GUID (L to show codes, Enter = 8300): EF00
       Changed type of partition to 'EFI System'

      2. Swap Partition

       Command (? for help): n
       Partition number (2-128, default 2): 
       First sector (34-500129758, default = 1050624) or {+-}size{KMGTP}:
       Last sector (1050624-500129758, default = 500129758) or {+-}size{KMGTP}: +16G
       Current type is 'Linux filesystem'
       Hex code or GUID (L to show codes, Enter = 8300): 8200
       Changed type of partition to 'Linux swap'

      3. root Partition

       Command (? for help): n
       Partition number (3-128, default 3):
       First sector (34-500129758, default = 34605056) or {+-}size{KMGTP}:
       Last sector (34605056-500129758, default = 500129758) or {+-}size{KMGTP}:
       Current type is 'Linux filesystem'
       Hex code or GUID (L to show codes, Enter = 8300):
       Changed type of partition to 'Linux filesystem'

      最後に設定を書き込んで終了です。

       Command (? for help): w
       
       Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
       PARTITIONS!!
       
       Do you want to proceed? (Y/N): Y
       OK; writing new GUID partition table (GPT) to /dev/md/RAID0_VOL1_0.
       The operation has completed successfully.

      念のためgdiskで構成を確認します。
      partition

      続いて作成されたパーティションを確認します。
      dev_partition

       

    • パーティションのフォーマット
      1. EFI System Partition

      # mkfs.vfat -F32 /dev/md/RAID0_VOL1_0p1

      2. Swap Partition

      # mkswap /dev/md/RAID0_VOL1_0p2

      3. root Partition
      今回はext4でフォーマットします。
      xfsなど好みのファイルシステムでフォーマットしてください。

      # mkfs.ext4 /dev/md/RAID0_VOL1_0p3
    • パーティションのマウント
      rootパーティションにEFI System Partitionをブートするため先ほどまでと逆順に進めます。
      3. root Partition

      # mount /dev/md/RAID0_VOL1_0p3 /mnt

      2. Swap Partition

      # swapon /dev/md/RAID0_VOL1_0p2

      1. EFI System Partition

      # mkdir /mnt/boot
      # mount /dev/md/RAID0_VOL1_0p1 /mnt/boot
    • インストール
      ミラーリストの設定

      # vi /etc/pacman.d/mirrorlist

      次の2つがファイルの先頭に来るように移動してください。
      Japanで検索するとすぐに見つかります。

      ## Score: 2.0, Japan
      Server = http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch
      ## Score: 2.2, Japan
      Server = http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/$repo/os/$arch

      以下のように変更してください。
      mirrorlist
      マウントしたrootパーティションにシステムをインストールします。

      # pacstrap -i /mnt base base-devel

      fstabの作成
      EFI System Partition,Swap Paritition,root,Parition以外にもマウントする場合は先にマウントしておくか、
      あとでfstabを編集してください。

      # genfstab -U -p /mnt >> /mnt/etc/fstab

      作成されたfstabを確認してみます。

      # view /mnt/etc/fstab
      #
      # /etc/fstab: static file system information
      #
      # <file system> <dir>   <type>  <options>       <dump>  <pass>
      # /dev/md124p3
      UUID=95c9a107-353a-4b45-beaa-6a10c50d4aa6       /               ext4            rw,relatime,stripe=8,data=ordered       0 1
      
      # /dev/md124p1
      UUID=DD31-1D98          /boot           vfat            rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro    0 2
      
      # /dev/md124p2
      UUID=a06a4d39-4a1a-4929-bfb3-f820b4790c5e       none            swap            defaults        0 0
    • Arch Linuxの設定
      以降はインストールしたシステム上で行います。
      次のコマンドでシステムに移動できます。

      # arch-chroot /mnt /bin/bashインストール漏れなどがあってLive CDから起動しなおす場合はマウントとこのコマンドを実行してください。

      ロケール設定

      # vi /etc/locale.gen

      今回はUTF-8で構築するので次の2つの行のコメントをはずします。

      en_US.UTF-8 UTF-8
      ja_JP.UTF-8 UTF-8

      次のコマンドを実行します。

      # locale-gen

      以下のように出力されれば完了です。

      Generating locales...
      en_US.UTF-8... done
      ja_JP.UTF-8... done
      Generation complete.

      次にlocale.confを設定します。

      # echo LANG=en_US.UTF-8 > /etc/locale.conf
      # export LANG=en_US.UTF-8
    • コンソールフォントとキーボードレイアウトの設定
      コンソールの設定なのでgnome,xfce4などは別途設定が必要になります。

      # vi /etc/vconsole.conf
      KEYMAP=jp106
      FONT=Lat2-Terminus16
    • ロケーション設定
      # ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
    • システムクロック設定
      UTCで設定します。

      # hwclock -u -w
    • ホスト名の設定
       # echo "ホスト名" > /etc/hostname

      Oracleをインストールするので/etc/hostsにもホスト名を追加しておいてください。

    • ネットワーク設定
      以下はdhcpを利用する場合です。

      # systemctl enable dhcpcd.service

      固定IPの場合はnetctlで設定してください。

    • rootパスワード設定
      パスワードの設定を忘れるとログインできなくなるので必ず実施してください。

      # passwd
    • ブートローダーのインストール
      grubのインストール
      ※arch linuxではapt-get,apt-cacheやyumではなくパッケージマネージャーとしてpackmanを使用します。

      # pacman -S grub dosfstools efibootmgr
      # grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=arch_grub --recheck --debug
      # grub-mkconfig -o /boot/grub/grub.cfg

      /boot/EFI/bootにもブータブルスタブを作成。

      # mkdir /boot/EFI/boot
      # cp /boot/EFI/arch_grub/grubx64.efi  /boot/EFI/boot/bootx64.efi
    • raidディスクの読み込み設定
      raidの構成を設定ファイルに書き出す。

      # mdadm --examine --scan > /mnt/etc/mdadm.conf
      # vi /etc/mkinitcpio.conf

      HOOKS行にmdadm,mdadm_udevを追加

      HOOKS="base udev mdadm_udev autodetect modconf block mdadm filesystems keyboard fsck"
      # mkinitcpio -p linux

      このときにmdadmモジュールとmdadm_udevモジュールをブートイメージに追加します。
      mdadmの追加時にmdadm.confが読み込まれますので変更があった場合はmkinitcpioを再実行してください。

      ここまででインストール作業は終了です。
      sshdもインストール環境にはインストールされていませんので必要な場合はopensshを導入してください。

    • 起動確認
      まずはシステムを移動します。

      # exit

      後は再起動してください。

      # reboot
      
      
  2. GUI環境の導入

    • ビデオドライバーの確認
      次のコマンドで必要となるドライバを確認してください

      # lspci | grep VGA

      core i7 4790Kの場合は次のようになります。

       00:02.0 VGA compatible controller: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller (rev 06)

      intelのドライバを検索します。

      # pacman -Ss video intel

      パッケージが2つ見つかりましたが”(xorg-drivers xorg)”と記載されている方が必要になります

      extra/xf86-video-i740 1.3.4-6
          X.org Intel i740 video driver
      extra/xf86-video-intel 1:2.99.917+381+g5772556-1 (xorg-drivers xorg)
          X.org Intel i810/i830/i915/945G/G965+ video drivers

      対象のドライバーをインストールします。

      # pacman -S xf86-video-intel
    • X関連パッケージの導入
      # pacman -S xorg-server xorg-server-utils xorg-xinit xterm
    • gnome関連パッケージの導入
      # pacman -S gnome gnome-extra

      ディスプレイマネージャを有効化します。

      # systemctl enable gdm.service

      localectlでX環境でのキーボード設定ファイルを作成します。

      # localectl set-x11-keymap jp,us pc104 ,dvorak grp:alt_shift_toggle

      作成された設定ファイルを確認します。

      # view /etc/X11/xorg.conf.d/00-keyboard.conf

      次のような内容で作成されるはずです。

      # Read and parsed by systemd-localed. It's probably wise not to edit this file
      # manually too freely.
      Section "InputClass"
              Identifier "system-keyboard"
              MatchIsKeyboard "on"
              Option "XkbLayout" "jp,us"
              Option "XkbModel" "pc104"
              Option "XkbVariant" ",dvorak"
              Option "XkbOptions" "grp:alt_shift_toggle"
      EndSection
      

      GNOMEの日本語化は今回は特に必要がないので省略します。

  3. oracleのインストール

    • ユーザー作成
      # groupadd oinstall
      # groupadd dba
      # useradd -g oinstall -G dba oracle
      # passwd oracle

      ホームディレクトリが自動で作成されないので手動で作成します。

      # mkdir /home/oracle
      # chown oracle:oinstall /home/oracle
      # chmod 775 /home/oracle
    • ulimitの設定
      # vi /etc/security/limits.conf
      oracle soft nproc 2047
      oracle hard nproc 16384
      oracle soft nofile 1024
      oracle hard nofile 65536
      oracle soft stack 10240
      oracle hard stack 32768
    • カーネルパラメータの設定
      カーネルパラメータは/etc/sysctl.confではなく/etc/sysctl.d/99-sysctl.confに設定します。

      # vi /etc/sysctl.d/99-sysctl.conf
      kernel.sem = 250 32000 100 128
      fs.file-max = 6815744
      net.ipv4.ip_local_port_range = 9000 65500
      net.core.rmem_default = 262144
      net.core.rmem_max = 4194304
      net.core.wmem_default = 262144
      net.core.wmem_max = 1048576
      fs.aio-max-nr = 1048576
    • 必要パッケージのインストール
      # pacman -S base-devel elfutils libaio unixodbc sysstat pdksh icu gdb make  binutils expat libstdc++5
    • シンボリックリンク作成
      ※ 既に作成されている場合があります。

      # ln -s /usr/bin/basename /bin/basename
      # ln -s /usr/bin/tr /bin/tr
      # ln -s /usr/lib/libgcc_s.so.1 /lib/libgcc_s.so.1
    • oracleのインストールについては
      手順は通常通りのインストール手順になりますので省略します。
      私はOracle 11.2.0.3をインストールしました。
      12cについては調べた限りではインストールの成功例は見つかりませんでした。
      途中でダイアログがちゃんと表示されなかったり、ライブラリが不足していたりでエラーが出ますがインストールは最後までできます。
      以前はGUIとしてXfce4で構築したのですがそのときにもウィンドウの最大化が出来ないなどの問題が発生してたこともありGUI周りはどうも挙動が怪しいがしてなりません。
      ローリング・リリースで日々アップデートされているOSなので今後に期待です。