envoyproxy / envoyproxy/envoy

Host metadata take up a lot of memory

Ouverte
#9,532 13 commentaires 0 réactions 1 personne assignée Réclamée par @zyfjeff Voir sur GitHub
area/perf area/xds help wanted
Langage dominant
C++
Étoiles
28.9k
Forks
5.6k
Merge moyen
1 j 22 h
PR mergées (30 j)
430

Description

*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

Guide de contribution

Ouvrir le guide de contribution

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.