riken_simulatorが偶然弊社のOSXでbuild出来てしまった話


はじめに

弊社に設置してあるOSX(iMac)でdockerいじってたら、面白そうなシミュレータの記事が出てたので、commitできる余地があればと思い本記事を投稿するに至りました。

参考にした記事はこちらになります。

自分がした操作は、以下の通りになります。

操作

  1. 上記記事に記載のDockerfile(下記)を丸パクリ。
FROM ubuntu:18.04
MAINTAINER kaityo256

ENV USER user
ENV HOME /home/${USER}
ENV SHELL /bin/bash

RUN useradd -m ${USER}
RUN gpasswd -a ${USER} sudo
RUN echo 'user:userpass' | chpasswd

RUN apt-get update && apt-get install -y \
    g++ \
    g++-8-aarch64-linux-gnu \
    git \
    m4 \
    python-dev \
    scons \
    sudo \
    vim \
    qemu-user-binfmt \
    zlib1g-dev

USER ${USER}

RUN cd ${HOME} \
 && mkdir build \
 && cd build \
 && git clone --depth 1 https://github.com/RIKEN-RCCS/riken_simulator.git

RUN cd ${HOME} \
 && cd build/riken_simulator \
 && sed -i "369,372s:^:#:" SConstruct \
 && scons build/ARM/gem5.opt -j 20

RUN cd ${HOME} \
 && git clone https://github.com/kaityo256/aarch64env.git

RUN cd ${HOME} \
 && echo alias gem5=\'~/build/riken_simulator/build/ARM/gem5.opt ~/build/riken_simulator/configs/example/se.py -c\' >> .bashrc \
 && echo alias ag++=\'aarch64-linux-gnu-g++-8 -static -march=armv8-a+sve\' >> .bashrc

2 . 上記Dockerfileを配置しているディレクトリにホストOS上で移動し、docker build -t aarch64env .
3. scons コマンドでこけてbuild未完了のdocker imageに対して、docker run --rm -it ${IMAGEID} /bin/bash
4. riken_simulator/.git/hooks以下(.git以下だったかな...?)の中身に対してrm -rf ./*という暴挙。
5. cd ~/build/riken_simulator && git init
6. sconsのbuild process時に使用するcore数を -j 4に変更し、containerにloginした状態で再度sed -i "369,372s:^:#:" SConstruct && scons build/ARM/gem5.opt -j 4

結果

  • 時々iMacのdisplayをダウンさせながらも、余計なことを並列でしなければsimulatorは動作する。

  • build後にdocker network pruneでなぜかパフォーマンスが改善する現象を発見した。

Log (上記操作3以降)

user@67870d4b0466:~/build/riken_simulator$ cd .git/hooks
user@67870d4b0466:~/build/riken_simulator/.git/hooks$ ls
applypatch-msg.sample  fsmonitor-watchman.sample  pre-applypatch.sample  pre-merge-commit.sample  pre-rebase.sample   prepare-commit-msg.sample
commit-msg.sample      post-update.sample         pre-commit.sample      pre-push.sample          pre-receive.sample  update.sample
user@67870d4b0466:~/build/riken_simulator/.git/hooks$ cd ..
user@67870d4b0466:~/build/riken_simulator/.git$ rm -r hooks
rm: descend into write-protected directory 'hooks'? 
user@67870d4b0466:~/build/riken_simulator/.git$ ls
HEAD  config  description  hooks  index  info  logs  objects  packed-refs  refs
user@67870d4b0466:~/build/riken_simulator/.git$ cd hooks
user@67870d4b0466:~/build/riken_simulator/.git/hooks$ ls
applypatch-msg.sample  fsmonitor-watchman.sample  pre-applypatch.sample  pre-merge-commit.sample  pre-rebase.sample   prepare-commit-msg.sample
commit-msg.sample      post-update.sample         pre-commit.sample      pre-push.sample          pre-receive.sample  update.sample
user@67870d4b0466:~/build/riken_simulator/.git/hooks$ rm ./*
rm: remove write-protected regular file './applypatch-msg.sample'? yes
rm: cannot remove './applypatch-msg.sample': Permission denied
rm: remove write-protected regular file './commit-msg.sample'? ^C
user@67870d4b0466:~/build/riken_simulator/.git/hooks$ sudo rm ./*
user@67870d4b0466:~/build/riken_simulator/.git/hooks$ ls
user@67870d4b0466:~/build/riken_simulator/.git/hooks$ cd ../..
user@67870d4b0466:~/build/riken_simulator$ git init
fatal: cannot copy '/home/user/.git_template/hooks/pre-commit' to '/home/user/build/riken_simulator/.git/hooks/pre-commit': Permission denied
user@67870d4b0466:~/build/riken_simulator$ sudo git init
Reinitialized existing Git repository in /home/user/build/riken_simulator/.git/
user@67870d4b0466:~/build/riken_simulator$ sudo sed -i "369,372s:^:#:" SConstruct && scons build/ARM/gem5.opt -j 4
scons: Reading SConscript files ...
OSError: [Errno 13] Permission denied: '/home/user/build/riken_simulator/build':
  File "/home/user/build/riken_simulator/SConstruct", line 253:
    mkdir(build_root)
user@67870d4b0466:~/build/riken_simulator$ sudo sed -i "369,372s:^:#:" SConstruct && sudo scons build/ARM/gem5.opt -j 4
scons: Reading SConscript files ...
Warning: Your compiler doesn't support incremental linking and lto at the same time, so lto is being disabled. To force lto on anyway, use the --force-lto option. That will disable partial linking.
Warning: Protocol buffer compiler (protoc) not found.
         Please install protobuf-compiler for tracing support.
Checking for C header file Python.h... yes
Checking for C library python2.7... yes
Checking for C library pthread... yes
Checking for C library dl... yes
Checking for C library util... yes
Checking for C library m... yes
Checking for accept(0,0,0) in C++ library None... yes
Checking for zlibVersion() in C++ library z... yes
Checking for clock_nanosleep(0,0,NULL,NULL) in C library None... yes
Checking for timer_create(CLOCK_MONOTONIC, NULL, NULL) in C library None... no
Checking for timer_create(CLOCK_MONOTONIC, NULL, NULL) in C library rt... yes
Checking for C library tcmalloc... no
Checking for C library tcmalloc_minimal... no
You can get a 12% performance improvement by installing tcmalloc (libgoogle-perftools-dev package on Ubuntu or RedHat).
Checking for char temp; backtrace_symbols_fd((void*)&temp, 0, 0) in C library None... yes
Checking for C header file fenv.h... yes
Checking for C header file png.h... no
Warning: Header file <png.h> not found.
         This host has no libpng library.
         Disabling support for PNG framebuffers.
Checking for C header file linux/kvm.h... yes
Checking for C header file linux/if_tun.h... yes
Checking size of struct kvm_xsave ... yes
Checking for member exclude_host in struct perf_event_attr...yes

(以下略)

考察

作業環境の問題(弊iMacのCPUのCore数の問題)もあってか、ホストOSの作業を減らさないとbuild option -j 4ではかなり動作が遅くなってしまう模様。
ただ試してみるだけなら、build option -j 2でbuildした方が良かったのかもしれないです。

所感

ビルドに2時間くらいかかった記憶がありましたが、CPUにガンガン負荷をかけつつbuildが成功しました....

あとは、Dockerfileに記載のコマンドを順次実行して、sampleを試してたら、cacheが溜まるのかホストが動かなくなったので、docker system pruneでオサラバ。

自分はbuild時に他のコンテナを動かしてなかったのでネットワーク設定に干渉がなかったのかもしれませんが、排他制御してないとネットワーク設定が上書きされる場合があるのかもしれませんね。システムの整合性に関する調査に関しては要検討です。

git clone --depth 1の意味がザックリと理解できたこと、echo ${PASSWORD} | sudo -S commandでワンライナー実行できることなど、小技が学べたのが良かったです。

上記のみでは再現できない可能性がある(途中でやみくもにchmodしてた記憶がある)ので、気を付けてください。

現在(2020年7月8日時点)、pipenvも動作するようなall-in-oneコンテナに改変するべくDockerfileを書きなぐっていますが、前回と異なる挙動をする(具体的には、sconsでSyntaxError: except hogehoge , e ^ みたいなエラーで止まる)ので、Docker-engineの送る処理とコマンドライン実行とでは違うのか?それとも勝手にubuntu20:04に変えたのが間違い?などと考えを巡らせています。(pipenvとvirtualenvはそもそも分離すべき?)

あとがき

端的に説明すると.git以下のディレクトリを一度削除するのが解決方法のようです。参考記事ではメモリの問題であると言及があるので、.gitにbuildで使用するmemsizeが設定されているのでしょうか。

docker system pruneで改善するのはどうやらlocalstack周りの設定の影響だったようですね。混乱を招いてしまう記事投稿で申し訳なかったです。

参考