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


きっかけ

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

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

はじめに

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

Exit 132で異常終了して、

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

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

Intel AVX2がないと動かない?

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

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

CPUのことを見てみます。

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

ストリーミングSIMD拡張命令

AWSのEC2を見てみます。

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

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

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

エラーの再現

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

CPU情報を見てみます。

$ 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

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

commit 73acef917b8beb667d6c0bdf058a59455fd605b6 (HEAD -> master, tag: 0.9.2.1, origin/master, origin/HEAD)
Author: kaiyzen <[email protected]>
Date:   Fri Jan 24 20:08:50 2020 +0000

    readme update

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

$ 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    

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

$ 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で何かないか探してみます。

$ 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

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

commit 536d131d123a89b564d095afc12308e7b9cc6992 (HEAD -> master, tag: 0.9.2.1-beta4, origin/master, origin/HEAD)
Author: kaiyzen <[email protected]>
Date:   Sat Feb 8 00:35:44 2020 +0000

    readme update

起動してみます。

$ 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となったコンテナのログを見てみます。

$ 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に対応していないマシンで、ソースからコンパイルした場合にどうなるのかは、よくわかっていません。(誰か教えて)

追記

追記

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]

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