Como adicionamos um toque de perfeição à ferramenta de análise de desempenho do Linux Perf GUI (Hotspot)

Durante um de nossos projetos, melhoramos o perfilador de GUI do Linux Perf desenvolvendo sua nova funcionalidade.



As necessidades do cliente podem ser expressas pelas seguintes características do perfilador desejado:



  • ter uma ferramenta de análise de desempenho para um conjunto específico de arquiteturas;
  • ser capaz de fazer análises aprofundadas de desempenho até instruções em código desmontado;
  • ter um visualizador e trabalhar com a saída do código desmontado em uma GUI conveniente para esse conjunto de arquiteturas - x86_64, ARMv7, ARMv8.


Ou seja, era necessário um criador de perfil, que deveria:



  • ser multiplataforma;
  • ser capaz de gerar um desmontador para funções para arquiteturas deste conjunto - x86_64, ARMv7, ARMv8;
  • exibir resultados e interagir com o usuário por meio da GUI e manter a usabilidade.


Para atender às necessidades do cliente, desenvolvemos um novo componente de sistema - um desmontador de plataforma cruzada com geração de código para x86_64, ARMv7, ARMv8 (funcionalidade e GUI para trabalhar com sua saída).



Vejamos um exemplo de uma demonstração simples de código C ++ no Hotspot em ação e os recursos de análise de desempenho que ele fornece. Exemplo:



cat demo.cpp:
#include <iostream>
int g (int arg) {
    return abs(rand()) * arg;
}

int f() {
    int i = 1;
    int res = 1 ;

    std::cout << abs(rand()) << std::endl;
    while (i < 1000000) {
        res += i * g(res);
        i++;
    }
    std::cout << res << std::endl;
    return res;
}

int main() {
    std::cout << f() << std::endl;
    return 0;
}


Nós compilamos, construímos nosso aplicativo de demonstração:



 g++ demo.cpp -o demo


Inicie nosso profiler:



./hotspot


Etapa 1 - coletar e gravar dados no arquivo perf.data.



Isso pode ser feito de duas maneiras - na linha de comando usando uma chamada explícita para perf



record -o /home/demo/perf.data --call-graph dwarf ./demo


Ou usando o menu Hotspot Arquivo-> Gravar Dados.



Para a nossa demonstração, coletamos eventos do tipo de ciclo, mas você pode definir qualquer outro ou um conjunto de tipos de eventos (falhas de cache, instruções, falhas de ramificação, etc.)







Clique em Iniciar gravação, espere que os resultados de visualização







acendam : Mergulhe no mundo da análise de desempenho.



Aqui, encontraremos informações resumidas e campeões entre os consumidores do tempo de execução de nossa demonstração.







Cadeias de chamadas em ambas as direções - do método chamado ao método de chamada (Bottom Up) e vice-versa (Bottom Down) com tempos (pesos).















Flame Graph e dados sobre desempenho, tempo de execução para cada

função / método que é significativo para ele.



Para obter informações mais detalhadas sobre a função que nos interessa, com a distribuição dos eventos dentro dela (até as instruções do código desmontado), pressione o item Desmontagem do menu de contexto. Ele abre clicando com o botão direito do mouse na função de sua preferência:







Agora sabemos tudo sobre esta função!







Você pode navegar na pilha de chamadas. Clique duas vezes em uma instrução de chamada destacada em azul. E diante de nós está um desmontador para a função chamada g (int). A instrução que consome CPU não tem concorrentes aqui.







Ctrl + B, Ctrl + D - e também temos códigos de máquina de comandos, e o desmontador foi gerado usando objdump. Nos casos anteriores, o código gerado ao chamar perf annotate era mostrado.







O botão Voltar está aceso, você pode mover-se ao longo da pilha de chamadas em ambas as direções!



Vá para a instrução com o endereço 1236 e clique duas vezes na instrução com o endereço 124f. E novamente, está disponível a transição de volta para a instrução com o endereço 1236.







Ctrl + B, Ctrl + I nos muda para a sintaxe do Intel Assembler: Ficaremos







felizes com a oportunidade de pesquisar o texto pelo padrão inserido, por exemplo, usando o registrador% rsp:







E ... sem sair do local, passamos para ARM ... Para fazer isso, precisaremos, basicamente, de duas entidades - o arquivo executável do aplicativo do usuário, construído no ARM, e o arquivo perf.data para ele, gravado lá. Em nossa demonstração, são coremark.1.exe e perf.1.fp.cycles.data, desenvolvido em ARMv8. Nós os colocamos em / home / demo / armv8 / e carregamos perf.data -











Assim, não apenas concluímos as tarefas definidas pelo cliente, mas também as superamos - em particular, o cálculo e a exibição da distribuição de eventos de acordo com as instruções do desmontador nos permite fazer uma análise aprofundada até uma instrução que pode ser vinculada a uma string no código, o programa tem uma GUI - uma interface amigável com configurações de perfil cruzado.



O Linux perf gui Hotspot é distribuído sob os termos da GNU General Public License por acordo com nossos parceiros. Em outras palavras, concedemos a todos os usuários interessados ​​o direito de copiar, modificar e distribuir este programa de criação de perfis gratuitamente.



Ele está hospedado no GitHub junto com instruções para download e instalação . Todos podem conhecê-lo e apreciá-lo.



Nós convidamos você, levando Linux Perf GUI (Hotspot) aos guias, em uma viagem fascinante por sua aplicação e as peculiaridades de seu trabalho, mergulhe na atmosfera de elite das equipes montadoras, visite várias arquiteturas e muito mais.



All Articles