# BSC Node Setup Story I had an AWS `c6g.2xlarge` instance even set IOPS to 16k doesn't seem to help after one day. I've started a new AWS EC2 i3 instance with 900G ephemeral NVME SSD to verify whether an even higher IOPS can help sync eventually. Will update this thread if I got some progress. Date when the comment was posted: 2021-05-28. ## Update 1 Some raw numbers to check during syncing: `i3.xlarge` instance with ephemeral native NVME, IOPS 70K, iostat MB_wrtn/s was averaged to be about 10M/s <details> <summary>expand to see details</summary> ``` # /usr/local/bin/geth attach http://localhost:8545 --exec "eth.syncing" { currentBlock: 5045035, highestBlock: 7796190, knownStates: 96385243, pulledStates: 95904052, startingBlock: 0 } # iostat -m -d 10 10 Linux 4.14.231-173.361.amzn2.x86_64 (ip-172-31-66-40.ec2.internal) 05/28/2021 _x86_64_ (4 CPU) Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn xvda 9.06 0.04 0.10 236 587 nvme0n1 125.74 0.00 164.96 6 982969 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn xvda 0.30 0.00 0.00 0 0 nvme0n1 69.80 0.00 4.22 0 42 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn xvda 0.00 0.00 0.00 0 0 nvme0n1 202.20 0.00 18.09 0 180 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn xvda 39.20 0.00 0.34 0 3 nvme0n1 117.30 0.00 6.66 0 66 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn xvda 0.20 0.00 0.00 0 0 nvme0n1 84.00 0.00 4.57 0 45 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn xvda 35.60 0.00 0.26 0 2 nvme0n1 192.90 0.00 18.79 0 187 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn xvda 31.20 0.10 0.18 1 1 nvme0n1 87.20 0.00 4.41 0 44 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn xvda 0.40 0.00 0.00 0 0 nvme0n1 55.70 0.00 3.03 0 30 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn xvda 36.50 0.00 0.28 0 2 nvme0n1 185.50 0.00 18.31 0 183 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn xvda 0.00 0.00 0.00 0 0 nvme0n1 97.10 0.00 6.20 0 62 ``` </details> `c5.2xlarge` instance with `gp3` volume, IOPS 16K, MB_wrtn/s was almost 0 <details> <summary>expand to see details</summary> ``` # /usr/local/bin/geth attach http://localhost:8545 --exec "eth.syncing" { currentBlock: 7797374, highestBlock: 7797452, knownStates: 687576703, pulledStates: 687420045, startingBlock: 7794295 } # iostat -m -d 10 10 Linux 4.14.231-173.361.amzn2.aarch64 (ip-172-31-3-204.ec2.internal) 05/28/2021 _aarch64_ (8 CPU) Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn nvme0n1 1631.77 15.09 1.67 10541477 1166468 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn nvme0n1 1503.30 12.04 0.66 120 6 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn nvme0n1 759.20 5.85 0.00 58 0 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn nvme0n1 1555.24 12.45 0.00 124 0 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn nvme0n1 1356.30 10.76 0.00 107 0 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn nvme0n1 750.30 6.12 1.07 61 10 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn nvme0n1 837.80 6.93 0.00 69 0 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn nvme0n1 927.60 7.53 0.00 75 0 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn nvme0n1 1528.40 12.61 0.06 126 0 Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn nvme0n1 1484.80 12.07 0.00 120 0 ``` </details> ## Update 2 Finally synced in 10 hours! Based on geth process log, those are some final signals before the node became synced. - Indexing transactions, it kept printing out percentage until it reaches 100, took about 20mins for this may be, during this period `eth.syncing` result was frozen, but we can notice that pulledStates was the same as knownStates. - Generating state snapshot, this was a new feature in 1.10 for a faster snapshot sync mode, it kept saying resuming/aborting. Just let it running for a while and don't worry about it. <details> <summary>expand to see details</summary> ``` # /usr/local/bin/geth attach http://localhost:8545 --exec "eth.syncing" { currentBlock: 7808427, highestBlock: 7808533, knownStates: 340871401, pulledStates: 340871401, startingBlock: 7803641 } # /usr/local/bin/geth attach http://localhost:8545 --exec "eth.syncing" false # date Fri May 28 17:48:12 UTC 2021 # journalctl -f -u geth May 28 17:50:38 ip-172-31-66-40.ec2.internal geth[3882]: INFO [05-28|17:50:38.371] Imported new chain segment blocks=1 txs=104 mgas=14.633 elapsed=271.241ms mgasps=53.948 number=7,808,617 hash=d33527..30585e dirty=1019.97MiB May 28 17:50:38 ip-172-31-66-40.ec2.internal geth[3882]: INFO [05-28|17:50:38.373] Unindexed transactions blocks=1 txs=77 tail=5,458,618 elapsed=1.835ms May 28 17:50:41 ip-172-31-66-40.ec2.internal geth[3882]: INFO [05-28|17:50:41.471] Imported new chain segment blocks=1 txs=212 mgas=22.106 elapsed=392.647ms mgasps=56.300 number=7,808,618 hash=a543ea..e0b103 dirty=1020.60MiB May 28 17:50:41 ip-172-31-66-40.ec2.internal geth[3882]: INFO [05-28|17:50:41.472] Unindexed transactions blocks=1 txs=59 tail=5,458,619 elapsed=1.510ms ``` </details> ## Update 3 I'll share my AWS EC2 based configuration here hope that can help others struggling with building a fully synced node. <details> <summary>1. EC2 Instance Config</summary> I used a `i3.xlarge` EC2 instance with 4 CPUs, 32GB Memory, 900G native NVME and 8G gp3 volume for hosting the operating system. The AMI was Amazon Linux 2 AMI (HVM), SSD Volume Type, in 64-bit (x86) arch. When the instance first started you have to create file system on the 900G blk device by `mkfs -t xfs /dev/nvme0n1` (check device id by running `lsblk`). And then `mkdir /opt/bsc` and `mount /dev/nvme0n1 /opt/bsc` </details> <details> <summary>2. /opt/bsc/node/config.toml</summary> ``` [Eth] NetworkId = 56 SyncMode = "fast" NoPruning = false NoPrefetch = false LightPeers = 100 DatabaseCache = 24000 DatabaseFreezer = "" TrieCleanCache = 256 TrieDirtyCache = 256 UltraLightFraction = 75 TrieTimeout = 5000000000000 EnablePreimageRecording = false EWASMInterpreter = "" EVMInterpreter = "" [Eth.Miner] DelayLeftOver = 50000000 GasFloor = 8000000 GasCeil = 8000000 GasPrice = 1000000000 Recommit = 3000000000 Noverify = false [Eth.Ethash] CacheDir = "ethash" CachesInMem = 2 CachesOnDisk = 3 CachesLockMmap = false DatasetDir = "/opt/bsc/node/ethash" DatasetsInMem = 1 DatasetsOnDisk = 2 DatasetsLockMmap = false PowMode = 0 [Eth.TxPool] Locals = [] NoLocals = false Journal = "transactions.rlp" Rejournal = 3600000000000 PriceLimit = 1000000000 PriceBump = 10 AccountSlots = 512 GlobalSlots = 10000 AccountQueue = 256 GlobalQueue = 5000 Lifetime = 10800000000000 [Eth.GPO] Blocks = 20 Percentile = 60 OracleThreshold = 1000 [Node] DataDir = "/opt/bsc/node/data" HTTPHost = "0.0.0.0" NoUSB = true InsecureUnlockAllowed = false IPCPath = "geth.ipc" HTTPPort = 8545 HTTPVirtualHosts = ["localhost"] HTTPModules = ["net", "web3", "eth", "debug"] WSPort = 8546 WSModules = ["net", "web3", "eth", "debug"] [Node.P2P] MaxPeers = 1000 NoDiscovery = false BootstrapNodes = ["enode://1cc4534b14cfe351ab740a1418ab944a234ca2f702915eadb7e558a02010cb7c5a8c295a3b56bcefa7701c07752acd5539cb13df2aab8ae2d98934d712611443@52.71.43.172:30311","enode://28b1d16562dac280dacaaf45d54516b85bc6c994252a9825c5cc4e080d3e53446d05f63ba495ea7d44d6c316b54cd92b245c5c328c37da24605c4a93a0d099c4@34.246.65.14:30311","enode://5a7b996048d1b0a07683a949662c87c09b55247ce774aeee10bb886892e586e3c604564393292e38ef43c023ee9981e1f8b335766ec4f0f256e57f8640b079d5@35.73.137.11:30311"] StaticNodes = ["enode://f3cfd69f2808ef64838abd8786342c0b22fdd28268703c8d6812e26e109f9a7cb2b37bd49724ebb46c233289f22da82991c87345eb9a2dadeddb8f37eeb259ac@18.180.28.21:30311","enode://ae74385270d4afeb953561603fcedc4a0e755a241ffdea31c3f751dc8be5bf29c03bf46e3051d1c8d997c45479a92632020c9a84b96dcb63b2259ec09b4fde38@54.178.30.104:30311","enode://d1cabe083d5fc1da9b510889188f06dab891935294e4569df759fc2c4d684b3b4982051b84a9a078512202ad947f9240adc5b6abea5320fb9a736d2f6751c52e@54.238.28.14:30311","enode://f420209bac5324326c116d38d83edfa2256c4101a27cd3e7f9b8287dc8526900f4137e915df6806986b28bc79b1e66679b544a1c515a95ede86f4d809bd65dab@54.178.62.117:30311","enode://c0e8d1abd27c3c13ca879e16f34c12ffee936a7e5d7b7fb6f1af5cc75c6fad704e5667c7bbf7826fcb200d22b9bf86395271b0f76c21e63ad9a388ed548d4c90@54.65.247.12:30311","enode://f1b49b1cf536e36f9a56730f7a0ece899e5efb344eec2fdca3a335465bc4f619b98121f4a5032a1218fa8b69a5488d1ec48afe2abda073280beec296b104db31@13.114.199.41:30311","enode://4924583cfb262b6e333969c86eab8da009b3f7d165cc9ad326914f576c575741e71dc6e64a830e833c25e8c45b906364e58e70cdf043651fd583082ea7db5e3b@18.180.17.171:30311","enode://4d041250eb4f05ab55af184a01aed1a71d241a94a03a5b86f4e32659e1ab1e144be919890682d4afb5e7afd837146ce584d61a38837553d95a7de1f28ea4513a@54.178.99.222:30311","enode://b5772a14fdaeebf4c1924e73c923bdf11c35240a6da7b9e5ec0e6cbb95e78327690b90e8ab0ea5270debc8834454b98eca34cc2a19817f5972498648a6959a3a@54.170.158.102:30311","enode://f329176b187cec87b327f82e78b6ece3102a0f7c89b92a5312e1674062c6e89f785f55fb1b167e369d71c66b0548994c6035c6d85849eccb434d4d9e0c489cdd@34.253.94.130:30311","enode://cbfd1219940d4e312ad94108e7fa3bc34c4c22081d6f334a2e7b36bb28928b56879924cf0353ad85fa5b2f3d5033bbe8ad5371feae9c2088214184be301ed658@54.75.11.3:30311","enode://c64b0a0c619c03c220ea0d7cac754931f967665f9e148b92d2e46761ad9180f5eb5aaef48dfc230d8db8f8c16d2265a3d5407b06bedcd5f0f5a22c2f51c2e69f@54.216.208.163:30311","enode://352a361a9240d4d23bb6fab19cc6dc5a5fc6921abf19de65afe13f1802780aecd67c8c09d8c89043ff86947f171d98ab06906ef616d58e718067e02abea0dda9@79.125.105.65:30311","enode://bb683ef5d03db7d945d6f84b88e5b98920b70aecc22abed8c00d6db621f784e4280e5813d12694c7a091543064456ad9789980766f3f1feb38906cf7255c33d6@54.195.127.237:30311","enode://11dc6fea50630b68a9289055d6b0fb0e22fb5048a3f4e4efd741a7ab09dd79e78d383efc052089e516f0a0f3eacdd5d3ffbe5279b36ecc42ad7cd1f2767fdbdb@46.137.182.25:30311","enode://21530e423b42aed17d7eef67882ebb23357db4f8b10c94d4c71191f52955d97dc13eec03cfeff0fe3a1c89c955e81a6970c09689d21ecbec2142b26b7e759c45@54.216.119.18:30311","enode://d61a31410c365e7fcd50e24d56a77d2d9741d4a57b295cc5070189ad90d0ec749d113b4b0432c6d795eb36597efce88d12ca45e645ec51b3a2144e1c1c41b66a@34.204.129.242:30311","enode://bb91215b1d77c892897048dd58f709f02aacb5355aa8f50f00b67c879c3dffd7eef5b5a152ac46cdfb255295bec4d06701a8032456703c6b604a4686d388ea8f@75.101.197.198:30311","enode://786acbdf5a3cf91b99047a0fd8305e11e54d96ea3a72b1527050d3d6f8c9fc0278ff9ef56f3e56b3b70a283d97c309065506ea2fc3eb9b62477fd014a3ec1a96@107.23.90.162:30311","enode://4653bc7c235c3480968e5e81d91123bc67626f35c207ae4acab89347db675a627784c5982431300c02f547a7d33558718f7795e848d547a327abb111eac73636@54.144.170.236:30311","enode://c6ffd994c4ef130f90f8ee2fc08c1b0f02a6e9b12152092bf5a03dd7af9fd33597d4b2e2000a271cc0648d5e55242aeadd6d5061bb2e596372655ba0722cc704@54.147.151.108:30311","enode://99b07e9dc5f204263b87243146743399b2bd60c98f68d1239a3461d09087e6c417e40f1106fa606ccf54159feabdddb4e7f367559b349a6511e66e525de4906e@54.81.225.170:30311","enode://1479af5ea7bda822e8747d0b967309bced22cad5083b93bc6f4e1d7da7be067cd8495dc4c5a71579f2da8d9068f0c43ad6933d2b335a545b4ae49a846122b261@52.7.247.132:30311"] ListenAddr = ":30311" EnableMsgEvents = false [Node.HTTPTimeouts] ReadTimeout = 30000000000 WriteTimeout = 30000000000 IdleTimeout = 120000000000 ``` </details> <details> <summary>3. /etc/systemd/system/geth.service</summary> ``` [Unit] Description=BSC geth go client After=syslog.target network.target [Service] Type=simple ExecStart=/usr/local/bin/geth --config /opt/bsc/node/config.toml --metrics --metrics.addr 0.0.0.0 KillMode=process KillSignal=SIGINT TimeoutStopSec=90 Restart=on-failure RestartSec=10s [Install] WantedBy=multi-user.target ``` </details> <details> <summary>4. chain initialization steps</summary> ``` # follow the guide to setup AWS EC2 time sync # https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html # use /tmp as the working directory cd /tmp # download bsc 1.1.0-beta wget https://github.com/binance-chain/bsc/releases/download/v1.1.0-beta/geth_linux chmod +x geth_linux mv geth_linux /usr/local/bin/geth # initialize genesis wget https://github.com/binance-chain/bsc/releases/download/v1.1.0-beta/mainnet.zip unzip mainnet.zip /usr/local/bin/geth --datadir /opt/bsc/node/data init genesis.json # start service systemctl enable geth systemctl start geth # check syncing progress /usr/local/bin/geth attach http://localhost:8545 --exec "eth.syncing" # check peer count curl -s 127.0.0.1:6060/debug/metrics | grep peer # check geth daemon logs journalctl -f -u geth ``` </details> ## Update 4 ### Cost According to [AWS Pricing Calculator](https://calculator.aws/#/createCalculator/EC2), the cost for a `i3.xlarge` instance is about $228.40 per month. ### Caveats `i3.xlarge` instance NVME disk was ephemeral which means the data would be gone if you ever stopped the EC2 instance. Since EC2 SLA is not particularly high (99.99% which translates into 52m 35s downtime per year), it is recommended to run at least 2 of the above instances behind a load balancer to ensure continuous service. ## Update 5 Instance type should be changed to `i3.2xlarge` now due to disk space usage is reaching `i3.xlarge` instance type's SSD upper limits.