envoyproxy / envoyproxy/envoy

Host metadata take up a lot of memory

Abierto
#9,532 13 comentarios 0 reacciones 1 asignado Reclamado por @zyfjeff Ver en GitHub
area/perf area/xds help wanted
Lenguaje dominante
C++
Estrellas
28.9k
Forks
5.6k
Merge medio
1 d 22 h
PR fusionados (30 d)
430

Descripción

*Title*: *Host metadata take up a lot of memory*

*Description*:
>Currently, our host metadata use `map` type, because of the use of `google.protobuf.struct`, which contains a lot of type reflection information, which takes up more memory space. Even without any metadata information, an empty object would take up 144 bytes.

The following code is my test

```c++

message Metadata {
// Key is the reverse DNS filter name, e.g. com.acme.widget. The envoy.*
// namespace is reserved for Envoy's built-in filters.
map filter_metadata = 1;
}

tutorial::Metadata meta;
google::protobuf::Struct struct_obj;
auto& fields_map = *struct_obj.mutable_fields();
fields_map["test_key"] = stringValue("test_value");
google::protobuf::Struct struct_inner;
(*struct_inner.mutable_fields())["inner_key"] = stringValue("inner_value");
google::protobuf::Value val;
*val.mutable_struct_value() = struct_inner;
fields_map["test_obj"] = val;
(*meta.mutable_filter_metadata())["com.test"] = struct_obj;

std::cout << meta.SpaceUsedLong() << std::endl;

tutorial::Metadata meta1;
std::cout << "empty:" << meta1.SpaceUsedLong() << std::endl;
```

Output:

```
720
empty:144
```

Is it possible to use a Map instead of a Struct, or to use Any nested Struct instead? In addition, we can actually optimize the default values so that we don't have to build Metadata objects when we don't have any metadata information.

@mattklein123

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.