catapult-service-bootstrapでexit 132エラーになるときはCPUが古い可能性がある

# きっかけ

そらりすさんとのやりとりの中で、ノードのコンテナーがログ出力がほとんどない状態で落ちてしまうということがあったので、調べていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/d2238b6f-7f9f-14a3-f77d-862f67909cda.png)

これの経緯とかもう少し詳しくとか書いてみたいと思います。

# はじめに

catapult-service-bootstrapやsymbol-service-bootstrapを起動したときに、ノードが何もログを出力せずに終了してしまうことがあります。

`Exit 132`で異常終了して、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/694cd464-9a4d-5820-d2d5-0b761ecd3b70.png)

特にヒントとなるようなログが出力されていない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/41d844a4-1923-24a5-db02-63de7fe9f2e6.png)


これの原因には、古いCPUで動いているマシンで起こるような気がしています。


# Intel AVX2がないと動かない？

そらりすさんの見立てでは、`Intel AVX2`の対応可否あたりに原因がありそうだということでした。

それで、いろいろやってみた結果、`Haswell`以降のCPUだとうごくっぽいことがわかっています。

CPUのことを見てみます。

`Intel AVX2`というのが、`Haswell`から搭載されています。

[ストリーミングSIMD拡張命令](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0SIMD%E6%8B%A1%E5%BC%B5%E5%91%BD%E4%BB%A4)

AWSのEC2を見てみます。

`CPU比較結果一覧`の箇所を参照。
https://dev.classmethod.jp/cloud/aws/ec2-instance-detail/

`m3.medium`が`Intel(R) Xeon(R) CPU E5-2670 v2`を使っており、これは`Ivy Bridge`です。

`Nehalem` -> `Sandy Bridge` -> `Ivy Bridge` -> `Haswell` -> `Haswell Refresh`という順番で新しくなっているので、この`m3.medium`はAVX2は対応していないはずです。

# エラーの再現

AWSのEC2で、`m3.medium`の古い（現行世代ではない）インスタンスタイプでマシンを起動してみます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/32fd9298-5001-03dd-1409-88ebd989ef92.png)

CPU情報を見てみます。

```bash
$ cat /proc/cpuinfo 
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 62
model name	: Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz
```

## catapult-service-bootstrap

https://github.com/tech-bureau/catapult-service-bootstrap

今回はこちらのコミットを使います。

```
commit 73acef917b8beb667d6c0bdf058a59455fd605b6 (HEAD -> master, tag: 0.9.2.1, origin/master, origin/HEAD)
Author: kaiyzen <daminate@hotmail.com>
Date:   Fri Jan 24 20:08:50 2020 +0000

    readme update
```

それでは`catapult-service-bootstrap`を起動してみます。

```bash
$ docker-compose -f cmds/docker/docker-compose.yml up -d --build
$ docker-compose -f cmds/docker/docker-compose.yml ps
             Name                            Command                State             Ports         
----------------------------------------------------------------------------------------------------
docker_api-node-0-nemgen_1        bash -c /bin-mount/wait /s ...   Up                               
docker_api-node-0_1               bash -c /bin-mount/wait /s ...   Up                               
docker_api-node-broker-0_1        bash -c /bin-mount/wait /s ...   Up                               
docker_db_1                       docker-entrypoint.sh bash  ...   Up         27017/tcp             
docker_generate-raw-addresses_1   bash -c /bin-mount/generat ...   Exit 132                         
docker_init-db_1                  docker-entrypoint.sh bash  ...   Exit 0                           
docker_peer-node-0-nemgen_1       bash -c /bin-mount/wait /s ...   Up                               
docker_peer-node-0_1              bash -c /bin-mount/wait /s ...   Up                               
docker_peer-node-1-nemgen_1       bash -c /bin-mount/wait /s ...   Up                               
docker_peer-node-1_1              bash -c /bin-mount/wait /s ...   Up                               
docker_rest-gateway_1             ash -c /bin-mount/wait /st ...   Up         0.0.0.0:3000->3000/tcp
docker_setup-network_1            ash -c /bin-mount/wait /ad ...   Up                               
docker_store-addresses_1          ash -c /bin-mount/wait /ad ...   Exit 1    
```

ログを見てみます。よくわかりません。

```bash
$ docker-compose -f cmds/docker/docker-compose.yml logs generate-raw-addresses
Attaching to docker_generate-raw-addresses_1
generate-raw-addresses_1  | /bin-mount/generate-raw-addresses-if-needed: line 8:     6 Illegal instruction     (core dumped) /usr/catapult/bin/catapult.tools.address --generate=${num_addresses} -n public-test > ${raw_addresses_path}
```

`dmesg`で何かないか探してみます。

```bash
$ dmesg
...
[ 1902.850651] traps: Tool Main[5585] trap invalid opcode ip:7f28225e555c sp:7ffc2fa861e0 error:0 in libboost_program_options.so.1.71.0[7f282259a000+88000]
...
```

`invalid opcode`とあるので、CPU命令が存在しない的なエラーだと思いました。（詳しくないので誰か教えて）

## symbol-testnet-bootstrap

https://github.com/nemfoundation/symbol-testnet-bootstrap

こちらのコミットを使います

```
commit 536d131d123a89b564d095afc12308e7b9cc6992 (HEAD -> master, tag: 0.9.2.1-beta4, origin/master, origin/HEAD)
Author: kaiyzen <daminate@hotmail.com>
Date:   Sat Feb 8 00:35:44 2020 +0000

    readme update
```

起動してみます。

```bash
$ cd api-harvest-assembly
$ docker-compose up -d --build
$ docker-compose ps
                    Name                                   Command                State       Ports  
-----------------------------------------------------------------------------------------------------
api-harvest-assembly_api-broker_1               bash -c /bin-mount/wait /s ...   Exit 132            
api-harvest-assembly_api-node_1                 bash -c /bin-mount/wait /s ...   Exit 132            
api-harvest-assembly_db_1                       docker-entrypoint.sh bash  ...   Up         27017/tcp
api-harvest-assembly_generate-raw-addresses_1   bash -c /bin-mount/generat ...   Exit 132            
api-harvest-assembly_init-db_1                  docker-entrypoint.sh bash  ...   Exit 1              
api-harvest-assembly_rest-gateway_1             ash -c /bin-mount/wait /st ...   Exit 1              
api-harvest-assembly_store-addresses_1          ash -c /bin-mount/wait /ad ...   Exit 0              
api-harvest-assembly_update_vars_1              ash -c /bin-mount/wait /ad ...   Exit 0    
```

`Exit 132`となったコンテナのログを見てみます。

```bash
$ docker-compose logs api-node api-broker generate-raw-addresses
Attaching to api-harvest-assembly_api-node_1, api-harvest-assembly_api-broker_1, api-harvest-assembly_generate-raw-addresses_1
api-node_1                | No index.dat file, creating now....
api-node_1                | !!!! Going to start api node now....
generate-raw-addresses_1  | /bin-mount/generate-raw-addresses-if-needed: line 8:     6 Illegal instruction     (core dumped) /usr/catapult/bin/catapult.tools.address --generate=${num_addresses} -n public-test > ${raw_addresses_path}
api-broker_1              | rm: cannot remove '/data/startup/datadir-initialized': No such file or directory
```

`dmesg`を見てみます。

```
...
[ 2856.881428] traps: catapult.server[23093] trap invalid opcode ip:7f8559a7df70 sp:7ffe32454680 error:0 in librocksdb.so.6.2.4[7f85598fb000+55f000]
...
```

`invalid opcode`とあるので、CPU命令が存在しない的なエラーだと思いました。（詳しくないので誰か教えて）

# おわりに

`exit 132`エラーが起きるときは、たぶんCPUが古いということがわかりました。

クラウドを使っている場合は、新しい世代のものを使うとか、別のサービスを利用するとかを検討する必要があるかもしれません。

# あと

AVX2に対応していないマシンで、ソースからコンパイルした場合にどうなるのかは、よくわかっていません。（誰か教えて）

# 追記

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-conversation="none"><p lang="en" dir="ltr">This is SIGILL signal, which is CPU generated exception.<br><br>That is the outcome of compiling for target that supports AVX2 (Skylake) and - as you&#39;ve investigsated - running on machine that doesn&#39;t support avx2.<br><br>side-note: compilation does NOT need to happen on machine with AVX2</p>&mdash; gimre 👁️ (@NCOSIGIMCITYNRE) <a href="https://twitter.com/NCOSIGIMCITYNRE/status/1228322051796217857?ref_src=twsrc%5Etfw">February 14, 2020</a></blockquote>

<blockquote class="twitter-tweet" data-conversation="none"><p lang="en" dir="ltr">P.S. quick way to check if cpu supports given feature looks like this:<br><br>`cat /proc/cpuinfo | grep flags | head -1 | grep avx2`</p>&mdash; gimre 👁️ (@NCOSIGIMCITYNRE) <a href="https://twitter.com/NCOSIGIMCITYNRE/status/1228322175658209281?ref_src=twsrc%5Etfw">February 14, 2020</a></blockquote>

# 追記

HaswellであるCPUのIntel(R) Celeron(R) CPU G1820で試したところ、うまく動きませんでした。

このCPUはAVX2をサポートしていません。

```
$ dmesg
[44210875.478242] traps: catapult.broker[12089] trap invalid opcode ip:7f998ce1f40a sp:7ffffcb04240 error:0 in librocksdb.so.6.2.4[7f998cc9f000+560000]
```

コードネームでは一意に決められないようです。