Skip to content

Commit

Permalink
Problem: block-stm has bad worst case performance (#1570)
Browse files Browse the repository at this point in the history
* Problem: block-stm has bad worst case performance

Solution:
- support optional pre-estimate logic to improve worst case performance,
  in the cost of optimal case performance.

* changelog
  • Loading branch information
yihuang committed Sep 12, 2024
1 parent 5a3c38b commit a6c9d58
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 45 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
* (store)[#1547](https://github.com/crypto-org-chain/cronos/pull/1547) Disable memiavl cache if block-stm is enabled.
* (app)[#1564](https://github.com/crypto-org-chain/cronos/pull/1564) Fix mempool data race.
* [#1568](https://github.com/crypto-org-chain/cronos/pull/1568) Update cometbft to 0.38.12.
* [#1570](https://github.com/crypto-org-chain/cronos/pull/1570) Integrate pre-estimate block-stm option to improve worst case performance.

### Bug Fixes

Expand Down
25 changes: 13 additions & 12 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -422,18 +422,6 @@ func New(

app.SetDisableBlockGasMeter(true)

if blockSTMEnabled {
sdk.SetAddrCacheEnabled(false)
workers := cast.ToInt(appOpts.Get(srvflags.EVMBlockSTMWorkers))
if workers == 0 {
workers = stdruntime.NumCPU()
}
logger.Info("block-stm executor enabled", "workers", workers)
app.SetTxExecutor(evmapp.STMTxExecutor(app.GetStoreKeys(), workers))
} else {
app.SetTxExecutor(evmapp.DefaultTxExecutor)
}

// init params keeper and subspaces
app.ParamsKeeper = initParamsKeeper(appCodec, cdc, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey])

Expand Down Expand Up @@ -1004,6 +992,19 @@ func New(
app.ScopedICAControllerKeeper = scopedICAControllerKeeper
// this line is used by starport scaffolding # stargate/app/beforeInitReturn

if blockSTMEnabled {
sdk.SetAddrCacheEnabled(false)
workers := cast.ToInt(appOpts.Get(srvflags.EVMBlockSTMWorkers))
if workers == 0 {
workers = stdruntime.NumCPU()
}
preEstimate := cast.ToBool(appOpts.Get(srvflags.EVMBlockSTMPreEstimate))
logger.Info("block-stm executor enabled", "workers", workers, "pre-estimate", preEstimate)
app.SetTxExecutor(evmapp.STMTxExecutor(app.GetStoreKeys(), workers, preEstimate, app.EvmKeeper, txConfig.TxDecoder()))
} else {
app.SetTxExecutor(evmapp.DefaultTxExecutor)
}

return app
}

Expand Down
13 changes: 8 additions & 5 deletions app/bench_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ import (
"github.com/crypto-org-chain/cronos/v2/x/cronos/types"
)

const BlockSTMPreEstimate = false

// BenchmarkERC20Transfer benchmarks execution of standard erc20 token transfer transactions
func BenchmarkERC20Transfer(b *testing.B) {
b.Run("memdb", func(b *testing.B) {
Expand All @@ -64,11 +66,12 @@ func BenchmarkERC20Transfer(b *testing.B) {
for _, workers := range []int{1, 8, 16, 32} {
b.Run(fmt.Sprintf("memiavl-stm-%d", workers), func(b *testing.B) {
benchmarkERC20Transfer(b, nil, AppOptionsMap{
flags.FlagHome: b.TempDir(),
memiavlstore.FlagMemIAVL: true,
memiavlstore.FlagCacheSize: 0,
srvflags.EVMBlockExecutor: "block-stm",
srvflags.EVMBlockSTMWorkers: workers,
flags.FlagHome: b.TempDir(),
memiavlstore.FlagMemIAVL: true,
memiavlstore.FlagCacheSize: 0,
srvflags.EVMBlockExecutor: "block-stm",
srvflags.EVMBlockSTMWorkers: workers,
srvflags.EVMBlockSTMPreEstimate: BlockSTMPreEstimate,
})
})
}
Expand Down
14 changes: 7 additions & 7 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ require (
github.com/creachadair/atomicfile v0.3.1 // indirect
github.com/creachadair/tomledit v0.0.24 // indirect
github.com/crypto-org-chain/cronos/memiavl v0.0.4 // indirect
github.com/crypto-org-chain/go-block-stm v0.0.0-20240806075927-09a64748f883 // indirect
github.com/crypto-org-chain/go-block-stm v0.0.0-20240911081142-92839e79a3ae // indirect
github.com/danieljoos/wincred v1.2.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/deckarep/golang-set/v2 v2.1.0 // indirect
Expand Down Expand Up @@ -252,10 +252,10 @@ require (

// release/v0.50.x
replace (
cosmossdk.io/client/v2 => github.com/crypto-org-chain/cosmos-sdk/client/v2 v2.0.0-20240902025731-535413db1bf4
cosmossdk.io/store => github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240902025731-535413db1bf4
cosmossdk.io/x/tx => github.com/crypto-org-chain/cosmos-sdk/x/tx v0.0.0-20240902025731-535413db1bf4
github.com/cosmos/cosmos-sdk => github.com/crypto-org-chain/cosmos-sdk v0.50.6-0.20240902025731-535413db1bf4
cosmossdk.io/client/v2 => github.com/crypto-org-chain/cosmos-sdk/client/v2 v2.0.0-20240911084450-6870ba130be2
cosmossdk.io/store => github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240911084450-6870ba130be2
cosmossdk.io/x/tx => github.com/crypto-org-chain/cosmos-sdk/x/tx v0.0.0-20240911084450-6870ba130be2
github.com/cosmos/cosmos-sdk => github.com/crypto-org-chain/cosmos-sdk v0.50.6-0.20240911084450-6870ba130be2
)

replace (
Expand All @@ -274,8 +274,8 @@ replace (
// TODO: remove it: https://github.com/cosmos/cosmos-sdk/issues/13134
github.com/dgrijalva/jwt-go => github.com/golang-jwt/jwt/v4 v4.4.2
github.com/ethereum/go-ethereum => github.com/crypto-org-chain/go-ethereum v1.10.20-0.20240425065928-ebb09502e7a7
// block-stm branch
github.com/evmos/ethermint => github.com/crypto-org-chain/ethermint v0.6.1-0.20240911060243-3fabdbeba4e0
// develop
github.com/evmos/ethermint => github.com/crypto-org-chain/ethermint v0.6.1-0.20240911093556-79bb39ed91e4
// Fix upstream GHSA-h395-qcrw-5vmq and GHSA-3vp4-m3rf-835h vulnerabilities.
// TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409
github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.9.0
Expand Down
24 changes: 12 additions & 12 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -419,18 +419,18 @@ github.com/crypto-org-chain/btree v0.0.0-20240406140148-2687063b042c h1:MOgfS4+F
github.com/crypto-org-chain/btree v0.0.0-20240406140148-2687063b042c/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY=
github.com/crypto-org-chain/cometbft-db v0.0.0-20231011055109-57922ac52a63 h1:R1QJ9a3XdYMSKo+1RdFifxb/g3lNypC52L/rpYrWoKo=
github.com/crypto-org-chain/cometbft-db v0.0.0-20231011055109-57922ac52a63/go.mod h1:rocwIfnS+kA060x64gkSIRvWB9StSppIkJuo5MWzL24=
github.com/crypto-org-chain/cosmos-sdk v0.50.6-0.20240902025731-535413db1bf4 h1:iWwxp02H5JnqCMFm0htX2B6twyob3Mhj+Vwz7PLtIQk=
github.com/crypto-org-chain/cosmos-sdk v0.50.6-0.20240902025731-535413db1bf4/go.mod h1:Rb43DdB0i/rKcCN69Tg2X3+zA4WhJ7MC8K3a6Ezh38E=
github.com/crypto-org-chain/cosmos-sdk/client/v2 v2.0.0-20240902025731-535413db1bf4 h1:wnjybA/Yl/KMa1ArcGH8yJhIoC6yA9Vx6JvcjfgdqYA=
github.com/crypto-org-chain/cosmos-sdk/client/v2 v2.0.0-20240902025731-535413db1bf4/go.mod h1:W5sR4asmVDUhJpEmuXTUBkk/yEefKlXTjVWcNciVSR0=
github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240902025731-535413db1bf4 h1:RDwJHhg8/Yh0CXNB9gfSEEJgQR5fHogO1Kz5afKAOlI=
github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240902025731-535413db1bf4/go.mod h1:gjE3DZe4t/+VeIk6CmrouyqiuDbZ7QOVDDq3nLqBTpg=
github.com/crypto-org-chain/cosmos-sdk/x/tx v0.0.0-20240902025731-535413db1bf4 h1:tsLL7ZWp9tHNTf0r9E5NoMjJyaM/NbpPJqRHxv5Kzak=
github.com/crypto-org-chain/cosmos-sdk/x/tx v0.0.0-20240902025731-535413db1bf4/go.mod h1:RTiTs4hkXG6IvYGknvB8p79YgjYJdcbzLUOGJChsPnY=
github.com/crypto-org-chain/ethermint v0.6.1-0.20240911060243-3fabdbeba4e0 h1:oyxgEN1J5qBn+6Bp7dpTa5cnP/ubBwX6C2XJmNYjX9Y=
github.com/crypto-org-chain/ethermint v0.6.1-0.20240911060243-3fabdbeba4e0/go.mod h1:LIHsU02uPdhpAyAMMaih0XFlNZsyF5GwiQHHZspI7Ow=
github.com/crypto-org-chain/go-block-stm v0.0.0-20240806075927-09a64748f883 h1:Oj7VvlK8iXRaugnpGA8CBXGrgkyigji+Ae5weSRD85I=
github.com/crypto-org-chain/go-block-stm v0.0.0-20240806075927-09a64748f883/go.mod h1:iwQTX9xMX8NV9k3o2BiWXA0SswpsZrDk5q3gA7nWYiE=
github.com/crypto-org-chain/cosmos-sdk v0.50.6-0.20240911084450-6870ba130be2 h1:4SoAvnxDaiIWcgm6XOmPDIdCf4/WNhNYLXGbij1eaA0=
github.com/crypto-org-chain/cosmos-sdk v0.50.6-0.20240911084450-6870ba130be2/go.mod h1:Rb43DdB0i/rKcCN69Tg2X3+zA4WhJ7MC8K3a6Ezh38E=
github.com/crypto-org-chain/cosmos-sdk/client/v2 v2.0.0-20240911084450-6870ba130be2 h1:5oGZtOUcauk9dtv+8BCfj2PEQyXEEEV+K3sP4OSvBmg=
github.com/crypto-org-chain/cosmos-sdk/client/v2 v2.0.0-20240911084450-6870ba130be2/go.mod h1:W5sR4asmVDUhJpEmuXTUBkk/yEefKlXTjVWcNciVSR0=
github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240911084450-6870ba130be2 h1:CGh5I0L6IYhe0AJevb4vf5TE3ru+qAgMs437BlWCwo8=
github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240911084450-6870ba130be2/go.mod h1:gjE3DZe4t/+VeIk6CmrouyqiuDbZ7QOVDDq3nLqBTpg=
github.com/crypto-org-chain/cosmos-sdk/x/tx v0.0.0-20240911084450-6870ba130be2 h1:mxlOSCru7YgmX055rrlkCSUu0D8lAqJ8Dnhp0yXCBuM=
github.com/crypto-org-chain/cosmos-sdk/x/tx v0.0.0-20240911084450-6870ba130be2/go.mod h1:RTiTs4hkXG6IvYGknvB8p79YgjYJdcbzLUOGJChsPnY=
github.com/crypto-org-chain/ethermint v0.6.1-0.20240911093556-79bb39ed91e4 h1:+eTaPw8ZN9iBbmk215r5I1lnva9oWbvYatetUffaOO0=
github.com/crypto-org-chain/ethermint v0.6.1-0.20240911093556-79bb39ed91e4/go.mod h1:Ua2vxy7IozDX878Gq6o0SneUDRbgorAKmb9tuUuAsHM=
github.com/crypto-org-chain/go-block-stm v0.0.0-20240911081142-92839e79a3ae h1:gakWYsVubWX8P9NpxaPnvg0UJYfIZigfko5WN57t7OA=
github.com/crypto-org-chain/go-block-stm v0.0.0-20240911081142-92839e79a3ae/go.mod h1:iwQTX9xMX8NV9k3o2BiWXA0SswpsZrDk5q3gA7nWYiE=
github.com/crypto-org-chain/go-ethereum v1.10.20-0.20240425065928-ebb09502e7a7 h1:V43F3JFcqG4MUThf9W/DytnPblpR6CcaLBw2Wx6zTgE=
github.com/crypto-org-chain/go-ethereum v1.10.20-0.20240425065928-ebb09502e7a7/go.mod h1:+a8pUj1tOyJ2RinsNQD4326YS+leSoKGiG/uVVb0x6Y=
github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE=
Expand Down
18 changes: 9 additions & 9 deletions gomod2nix.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ schema = 3
version = "v0.7.5"
hash = "sha256-Nuw697sJr56kU3EU7DV1eYNkyI76psznIVqYAV6RfbQ="
[mod."cosmossdk.io/client/v2"]
version = "v2.0.0-20240902025731-535413db1bf4"
version = "v2.0.0-20240911084450-6870ba130be2"
hash = "sha256-60hmufv3Ml4Pv3zNwgn8eeqlEINOR6n9MKr2QHddoxo="
replaced = "github.com/crypto-org-chain/cosmos-sdk/client/v2"
[mod."cosmossdk.io/collections"]
Expand All @@ -42,7 +42,7 @@ schema = 3
version = "v0.0.0-20230608160436-666c345ad23d"
hash = "sha256-6BMBA98BpK3jG6++ZE4LdPQwwpS+lZ0GLMRF1fO4UfM="
[mod."cosmossdk.io/store"]
version = "v0.0.0-20240902025731-535413db1bf4"
version = "v0.0.0-20240911084450-6870ba130be2"
hash = "sha256-Dm3sSZNJBcnBF33PULoTpK4rkNQbsZl0DfTqH1GPCQM="
replaced = "github.com/crypto-org-chain/cosmos-sdk/store"
[mod."cosmossdk.io/tools/confix"]
Expand All @@ -55,7 +55,7 @@ schema = 3
version = "v0.1.0"
hash = "sha256-/gWvrqvy6bW90+NU66T+9QysYgvG1VbwfYJZ8tkqpeA="
[mod."cosmossdk.io/x/tx"]
version = "v0.0.0-20240902025731-535413db1bf4"
version = "v0.0.0-20240911084450-6870ba130be2"
hash = "sha256-xT5IdapEx1h46ofBpxcBQfzGF2EntmC8xZl7aym/6xE="
replaced = "github.com/crypto-org-chain/cosmos-sdk/x/tx"
[mod."cosmossdk.io/x/upgrade"]
Expand Down Expand Up @@ -167,8 +167,8 @@ schema = 3
version = "v1.0.0-beta.5"
hash = "sha256-Fy/PbsOsd6iq0Njy3DVWK6HqWsogI+MkE8QslHGWyVg="
[mod."github.com/cosmos/cosmos-sdk"]
version = "v0.50.6-0.20240902025731-535413db1bf4"
hash = "sha256-7l0kxNsrW2TAuiOpDgy88L4WMibzPGbBNRpSUvayL1U="
version = "v0.50.6-0.20240911084450-6870ba130be2"
hash = "sha256-kl2sLe8vITIguRGtdeviDeP3R5JIbRg+eDsheGd4PqM="
replaced = "github.com/crypto-org-chain/cosmos-sdk"
[mod."github.com/cosmos/go-bip39"]
version = "v1.0.0"
Expand Down Expand Up @@ -210,8 +210,8 @@ schema = 3
version = "v0.0.24"
hash = "sha256-4vUukHONOjNn0qfQr4esK6TWfPWsIp+rbdz65og84lw="
[mod."github.com/crypto-org-chain/go-block-stm"]
version = "v0.0.0-20240806075927-09a64748f883"
hash = "sha256-DuqcnTqpUVRxV+I+CaBuDg/1CLmMeXdw4VEFeuCsUbU="
version = "v0.0.0-20240911081142-92839e79a3ae"
hash = "sha256-8MhSeC5BB5BwOet3k3Rfua0TBeBATtLSwaW6s5WpYCM="
[mod."github.com/danieljoos/wincred"]
version = "v1.2.0"
hash = "sha256-LHcvTJCc8++bFndbd8ZgMSTe4L5h2C4rN+cSWHCz54Y="
Expand Down Expand Up @@ -259,8 +259,8 @@ schema = 3
hash = "sha256-lE4G5FaRb3MVi9FFVn+WlwsSTOB4SbjmVboKyQ5yB0A="
replaced = "github.com/crypto-org-chain/go-ethereum"
[mod."github.com/evmos/ethermint"]
version = "v0.6.1-0.20240911060243-3fabdbeba4e0"
hash = "sha256-1noRWV/3BxUQnxajaSePh5Ti+uyumuLZSeuQEpvNans="
version = "v0.6.1-0.20240911093556-79bb39ed91e4"
hash = "sha256-pImZqrOysiMTCgzdWyVttLeTEiszjA1KBVTnzDU0vRg="
replaced = "github.com/crypto-org-chain/ethermint"
[mod."github.com/fatih/color"]
version = "v1.16.0"
Expand Down

0 comments on commit a6c9d58

Please sign in to comment.