ISUCON5に参加して私の心を折ったいくつかの事象と原因

  • 投稿者:
  • 投稿カテゴリー:event / PHP

臥薪嘗胆
rebootしてreadonlyになったくらいで折れるガラスのハート

1.rebootしたらreadonlyに

OSチューニングをして、再起動するとファイルシステムがreadonlyに
確認したところ、aptitude upgradeで発生している模様

その段階で原因はわからず、再起動して動作しないと違反となるため
ちょくちょく再起動&スナップショットしつつ震えながら作業することにorz

原因

ISUCON5 本選出場者決定のお知らせにもあるようにバグの模様

具体的にはaptitude upgradeにてgrub.cfgが変更されたことが原因
upgradeによって、以下(grub.cfgより参照)のrwがroとなり、その結果ファイルシステムがreadonlyとなる
linux /boot/vmlinuz-3.19.0-30-generic root=UUID=e176bae0-84a5-4bd2-b968-e809e902488c rw console=ttyS0)
(grub.cfgをroからrwに変更したところ、起動するようになった)

GCP公式のubuntu15.04のgrub.cfgはroであることから、正しいのはroだと思われる
今回であれば、
・他のインスタンスにboot時にreadonlyとなるディスクを追加し、roをrwに書き換える
・readonlyとなる前に、次に記述する「ファイルシステムチューニングができず」での対応策を実施する
ことによって対処可能

これ以上はboot周りについて知識不足なので、また機会のあるときに追う

2.ファイルシステムチューニングができず

とりあえずnoatimeにしたいのに

root@isucon-retry4:/home/isucon# vi /etc/fstab
LABEL=cloudimg-rootfs   /        ext4   defaults,noatime        0 0
root@isucon-retry4:/home/isucon# mount -o remount /
mount: can't find LABEL=cloudimg-rootfs

原因

fstabの設定と実際のマウント情報が違うことが原因
mtab(mounted filesystem table)は実際にマウントした情報を記録している。mtabを確認すると

/dev/disk/by-uuid/e176bae0-84a5-4bd2-b968-e809e902488c / ext4 rw,relatime,data=ordered 0 0

となっており、デバイス名でマウントされている
そのため、デバイスにラベルをつけるべし(もしくはfstabのラベル利用をやめる)

root@isucon-retry4:/home/isucon# tune2fs -l /dev/disk/by-uuid/e176bae0-84a5-4bd2-b968-e809e902488c | grep "volume name"
Filesystem volume name:   <none>

root@isucon-retry4:/home/isucon# e2label /dev/disk/by-uuid/e176bae0-84a5-4bd2-b968-e809e902488c cloudimg-rootfs
root@isucon-retry4:/home/isucon# tune2fs -l /dev/disk/by-uuid/e176bae0-84a5-4bd2-b968-e809e902488c | grep "volume name"
Filesystem volume name:   cloudimg-rootfs

root@isucon-retry4:/home/katukatu# cat /etc/mtab | grep ext4
/dev/disk/by-uuid/e176bae0-84a5-4bd2-b968-e809e902488c / ext4 rw,noatime,data=ordered 0 0

### sda1にラベルを付けても同義 ###
root@isucon-retry4:/home/isucon# ls -al /dev/disk/by-uuid/e176bae0-84a5-4bd2-b968-e809e902488c
lrwxrwxrwx 1 root root 10 Oct  5 21:39 /dev/disk/by-uuid/e176bae0-84a5-4bd2-b968-e809e902488c -> ../../sda1

3.PHPにモジュール追加できない&hhvmが利用できない

原因

・パッケージ管理に頼りすぎている、私の技術不足
・hhvmについては知識不足
以下、調べた

方法-PHPにモジュール追加

root@isucon-retry:/home/isucon# cat /etc/systemd/system/isuxi.php.service
[Unit]
Description=isuxi-php
After=syslog.target

[Service]
WorkingDirectory=/home/isucon/webapp/php
EnvironmentFile=/home/isucon/env.sh
ExecStart=/home/isucon/.local/php/sbin/php-fpm -y php-fpm.conf

[Install]
WantedBy=multi-user.target

root@isucon-retry:/home/isucon# cd .local/php/

root@isucon-retry:/home/isucon/.local/php# bin/php -m | grep mem

root@isucon-retry:/home/isucon/.local/php# aptitude install php5-memcached
...

root@isucon-retry:/home/isucon/.local/php# vi etc/conf.d/memcached.ini
extension="/usr/lib/php5/20131226/memcached.so"

root@isucon-retry:/home/isucon/.local/php# bin/php -m | grep mem
memcached

方法-hhvmの利用

root@isucon-retry:/home/isucon# apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449
...
root@isucon-retry:/home/isucon# add-apt-repository 'deb http://dl.hhvm.com/ubuntu vivid main'
root@isucon-retry:/home/isucon# aptitude update
...
root@isucon-retry:/home/isucon# aptitude install hhvm
The following NEW packages will be installed:
  ghostscript{a} gsfonts{a} hhvm imagemagick-common{a} libboost-context1.55.0{a} libboost-program-options1.55.0{a} libboost-regex1.55.0{a}
  libboost-thread1.55.0{a} libc-client2007e{a} libcupsfilters1{a} libcupsimage2{a} libfftw3-double3{a} libgflags2{a} libgoogle-glog0{a} libgs9{a}
  libgs9-common{a} libijs-0.35{a} libjbig2dec0{a} libjemalloc1{a} liblqr-1-0{a} libmagickcore-6.q16-2{a} libmagickwand-6.q16-2{a} libonig2{a}
  libpaper-utils{a} libpaper1{a} libtbb2{a} libunwind8{a} mlock{a} poppler-data{a}
0 packages upgraded, 29 newly installed, 0 to remove and 0 not upgraded.
Need to get 30.0 MB of archives. After unpacking 54.2 MB will be used.
Do you want to continue? [Y/n/?] y
...
update-alternatives: using /usr/bin/hhvm to provide /usr/bin/php (php) in auto mode
********************************************************************
* HHVM is installed.
*
* Running PHP web scripts with HHVM is done by having your
* webserver talk to HHVM over FastCGI. Install nginx or Apache,
* and then:
* $ sudo /usr/share/hhvm/install_fastcgi.sh
* $ sudo /etc/init.d/hhvm restart
* (if using nginx)  $ sudo /etc/init.d/nginx restart
* (if using apache) $ sudo /etc/init.d/apache restart
*
* Detailed FastCGI directions are online at:
* https://github.com/facebook/hhvm/wiki/FastCGI
*
* If you're using HHVM to run web scripts, you probably want it
* to start at boot:
* $ sudo update-rc.d hhvm defaults
*
* Running command-line scripts with HHVM requires no special setup:
* $ hhvm whatever.php
*
* You can use HHVM for /usr/bin/php even if you have php-cli
* installed:
* $ sudo /usr/bin/update-alternatives \
*    --install /usr/bin/php php /usr/bin/hhvm 60
********************************************************************
Setting up libpaper-utils (1.1.24+nmu2ubuntu3) ...
Processing triggers for libc-bin (2.21-0ubuntu4) ...
Processing triggers for systemd (219-7ubuntu6) ...
Processing triggers for ureadahead (0.100.0-19) ...

root@isucon-retry:/home/isucon# hhvm --version
HipHop VM 3.9.1 (rel)
Compiler: tags/HHVM-3.9.1-0-g0f72cfc2f0a01fdfeb72fbcfeb247b72998a66db
Repo schema: 6416960c150a4a4726fda74b659105ded8819d9c

root@isucon-retry:/home/isucon# php -v
HipHop VM 3.9.1 (rel)
Compiler: tags/HHVM-3.9.1-0-g0f72cfc2f0a01fdfeb72fbcfeb247b72998a66db
Repo schema: 6416960c150a4a4726fda74b659105ded8819d9c

root@isucon-retry:/home/isucon# systemctl stop isuxi.php

root@isucon-retry:/home/isucon# vi /etc/hhvm/server.ini
...
hhvm.server.port = 8080
...
root@isucon-retry:/home/isucon# systemctl restart hhvm

root@isucon-retry:/home/isucon# netstat -anp | grep "hhvm"
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      25111/hhvm
unix  3      [ ]         STREAM     CONNECTED     47465    25111/hhvm
unix  3      [ ]         STREAM     CONNECTED     47464    25111/hhvm
unix  3      [ ]         STREAM     CONNECTED     47468    25111/hhvm
unix  3      [ ]         STREAM     CONNECTED     47467    25111/hhvm

参考URL

phpに後から拡張モジュールを追加する
Prebuilt packages on Ubuntu 15.04 (vivid)
How To Install And Configure HHVM On Ubuntu 15.04
ISUCON5 予選通過しました (@methane編)