diff --git a/plugins/wasm-go/extensions/gc-test/README.md b/plugins/wasm-go/extensions/gc-test/README.md new file mode 100644 index 000000000..76c458f5f --- /dev/null +++ b/plugins/wasm-go/extensions/gc-test/README.md @@ -0,0 +1,28 @@ +--- +title: GC Test +keywords: [higress, gc test] +description: use to test the gc of tinygo +--- + +## Description + +The `gc-test` plugin is used to test whether there are memory leaks in TinyGO's GC mechanism. + +This plugin should not be used in production. + +## Configuration Fields + +| Name | Type | Requirement | Default Value | Description | +| ----------- | --------------- | -------- | ------ | ---------------------------------------------------- | +| `bytes` | Number | Required | - | Number of bytes allocated per-request | + + +## How to + +The plugin will response the stats of memory as follows: + +```bash +{"Sys": 15073280,"HeapSys": 10682368,"HeapIdle": 139264,"HeapInuse": 0,"HeapReleased": 0} +``` + +We can use bench tools to test whether the `HeapSys` field keeps growing, and then we can determine whether a memory leak has occurred. diff --git a/plugins/wasm-go/extensions/gc-test/VERSION b/plugins/wasm-go/extensions/gc-test/VERSION new file mode 100644 index 000000000..afaf360d3 --- /dev/null +++ b/plugins/wasm-go/extensions/gc-test/VERSION @@ -0,0 +1 @@ +1.0.0 \ No newline at end of file diff --git a/plugins/wasm-go/extensions/gc-test/go.mod b/plugins/wasm-go/extensions/gc-test/go.mod new file mode 100644 index 000000000..b3d01eaf2 --- /dev/null +++ b/plugins/wasm-go/extensions/gc-test/go.mod @@ -0,0 +1,21 @@ +module github.com/alibaba/higress/plugins/wasm-go/extensions/gc-test + +go 1.19 + +replace github.com/alibaba/higress/plugins/wasm-go => ../.. + +replace github.com/wasilibs/nottinygc v0.5.1 => github.com/higress-group/nottinygc v0.0.0-20231019105920-c4d985d443e1 + +require ( + github.com/alibaba/higress/plugins/wasm-go v0.0.0 + github.com/tetratelabs/proxy-wasm-go-sdk v0.22.0 + github.com/tidwall/gjson v1.14.3 +) + +require ( + github.com/google/uuid v1.3.0 // indirect + github.com/magefile/mage v1.14.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/wasilibs/nottinygc v0.5.1 // indirect +) diff --git a/plugins/wasm-go/extensions/gc-test/go.sum b/plugins/wasm-go/extensions/gc-test/go.sum new file mode 100644 index 000000000..87b9b0467 --- /dev/null +++ b/plugins/wasm-go/extensions/gc-test/go.sum @@ -0,0 +1,18 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/higress-group/nottinygc v0.0.0-20231019105920-c4d985d443e1 h1:BYQ7gcwucYL28RMAGwg3/nBzmuj2qar/+IeMT7kmRdg= +github.com/higress-group/nottinygc v0.0.0-20231019105920-c4d985d443e1/go.mod h1:oDcIotskuYNMpqMF23l7Z8uzD4TC0WXHK8jetlB3HIo= +github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= +github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/tetratelabs/proxy-wasm-go-sdk v0.22.0 h1:kS7BvMKN+FiptV4pfwiNX8e3q14evxAWkhYbxt8EI1M= +github.com/tetratelabs/proxy-wasm-go-sdk v0.22.0/go.mod h1:qkW5MBz2jch2u8bS59wws65WC+Gtx3x0aPUX5JL7CXI= +github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw= +github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/plugins/wasm-go/extensions/gc-test/main.go b/plugins/wasm-go/extensions/gc-test/main.go new file mode 100644 index 000000000..66f290d96 --- /dev/null +++ b/plugins/wasm-go/extensions/gc-test/main.go @@ -0,0 +1,39 @@ +package main + +import ( + "fmt" + "runtime" + + . "github.com/alibaba/higress/plugins/wasm-go/pkg/wrapper" + "github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm" + "github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm/types" + "github.com/tidwall/gjson" +) + +func main() { + SetCtx( + "gc-test", + ParseConfigBy(parseConfig), + ProcessRequestHeadersBy(onHttpRequestHeaders), + ) +} + +type MyConfig struct { + bytes uint64 +} + +func parseConfig(json gjson.Result, config *MyConfig, log Log) error { + config.bytes = json.Get("bytes").Uint() + return nil +} + +func onHttpRequestHeaders(ctx HttpContext, config MyConfig, log Log) types.Action { + b := make([]byte, int(config.bytes)) + var m runtime.MemStats + runtime.ReadMemStats(&m) + log.Infof("alloc success, point address: %p", b) + memstats := fmt.Sprintf(`{"Sys": %d,"HeapSys": %d,"HeapIdle": %d,"HeapInuse": %d,"HeapReleased": %d}`, m.Sys, m.HeapSys, m.HeapIdle, m.HeapInuse, m.HeapReleased) + log.Info(memstats) + proxywasm.SendHttpResponse(200, [][2]string{{"Content-Type", "application/json"}}, []byte(memstats), -1) + return types.ActionContinue +}