LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2020-07-08

はじめに

弊社に設置してある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周りの設定の影響だったようですね。混乱を招いてしまう記事投稿で申し訳なかったです。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0