Как лучше всего понять объем памяти и использование нативного образа, который запускается внутри контейнера докеров? - PullRequest
0 голосов
/ 27 мая 2020

Я создал несколько сервисов с использованием Quarkus и хочу сам изучить некоторые различия в производительности. Здесь я столкнулся с проблемой, заключающейся в том, что использование памяти docker и отчет kubernetes в контейнере намного ниже, чем использование памяти, сообщаемое с помощью smallrye metrics или с помощью команды типа top из контейнера. Теперь я хотел бы собрать более подробную информацию о памяти в сервисе, чтобы провести как можно более точное сравнение, однако я не знаю, как получить более подробную информацию.

GraalVM также предлагает инструменты, такие как visualVM, но, похоже, он может работать только тогда, когда изображения запускаются изначально (а не в контейнере docker). Метрики Smallrye не содержат деталей, которые я хотел бы видеть, и такие вещи, как NativeMemoryTracking, недоступны (насколько мне известно).

Есть ли что-нибудь еще, что я могу изучить, или информацию, которую я знаю отсутствует?

1 Ответ

0 голосов
/ 27 мая 2020

Я использую следующие:

docker stats <containerId>

или

docker stats $(docker ps -q)

, чтобы увидеть использование памяти всем контейнером.

Я использую метрики или:

ps -o "pid,rss,command" <pid> 

из командной строки, чтобы увидеть использование памяти.

Или просто напишите свой собственный Метри c «Проверка работоспособности»:

    @Liveness                                                                                                                                              
    @ApplicationScoped                                                                                                                                               
    public class InfoCheck implements HealthCheck {                                                                                             


    private final DecimalFormat nf = new DecimalFormat("###,### MB", new 
    DecimalFormatSymbols(new Locale("nl")));


    @ConfigProperty(name = "quarkus.application.name")                                                                                                                                                   
    String appName;


    @ConfigProperty(name = "app.version")                                                                                                                                                   
    String version;                                               


    @Override                                                                                                                                                                                               
    public HealthCheckResponse call() {                                                                                                            
        nf.setGroupingUsed(true);                                                                                                                                                               
        nf.setParseIntegerOnly(true);                                                                                                                                                                                                                   

        Runtime runtime = Runtime.getRuntime();                                
        long totalMemory = runtime.totalMemory();                                                                                                                                                       
        long freeMemory = runtime.freeMemory();                                                                                                                                                       
        long maxMemory = runtime.maxMemory();                                                                                                                                                                                                                                                                  

        return HealthCheckResponse.named(this.appName)                                                                                                                                                               
                .up()                                                                                                                                                               
                .withData("application.version", this.version)                                                                                                                                                            
                .withData("cpu.amount", runtime.availableProcessors())                                                                                                                                                              
                .withData("memory.free", nf.format(freeMemory / (1024 * 1024)))                                                                                                                                                               
                .withData("memory.allocated", nf.format(totalMemory / (1024 * 1024)))                                                                                                                                                              
                .withData("memory.total.free", nf.format((freeMemory + (maxMemory - totalMemory)) / (1024 * 1024)))

                .build();                                                       

        }                                                                                

    } 
...