O que o nível quatro de paranóia de desempenho faz?

O que o nível quatro de paranóia de desempenho faz?

Na minha instalação do Ubuntu Focal, kernel.perf_event_paranoidestá definido como 4 por padrão:

$ sysctl kernel.perf_event_paranoid
kernel.perf_event_paranoid = 4

(Eu verifiquei /etc/sysctl.confo diretório de configuração associado, não configurei isso.)

Isso me parece estranho, porque a documentação do kernel não descreve nenhum efeito adicional para valores superiores a 2:

perf_event_paranoid:

Controls use of the performance events system by unprivileged
users (without CAP_SYS_ADMIN).  The default value is 2.

 -1: Allow use of (almost) all events by all users
     Ignore mlock limit after perf_event_mlock_kb without CAP_IPC_LOCK
>=0: Disallow ftrace function tracepoint by users without CAP_SYS_ADMIN
     Disallow raw tracepoint access by users without CAP_SYS_ADMIN
>=1: Disallow CPU event access by users without CAP_SYS_ADMIN
>=2: Disallow kernel profiling by users without CAP_SYS_ADMIN

(Fonte.)

Fiz uma pesquisa rápida no código-fonte do kernel principal e não consegui encontrar nenhum lugar onde perf_event_paranoidfosse comparado a um número superior a 2.

No entanto, definir como 4 tem um efeito. Executei o seguinte comando perf, perf_event_paranoiddefinido como 4, como umnão raizdo utilizador:

perf stat -e context-switches,cpu-migrations -r 1 -- sleep 1

Apresenta o seguinte erro:

Error:
Access to performance monitoring and observability operations is limited.
Consider adjusting /proc/sys/kernel/perf_event_paranoid setting to open
access to performance monitoring and observability operations for processes
without CAP_PERFMON, CAP_SYS_PTRACE or CAP_SYS_ADMIN Linux capability.
More information can be found at 'Perf events and tool security' document:
https://www.kernel.org/doc/html/latest/admin-guide/perf-security.html
perf_event_paranoid setting is 4:
  -1: Allow use of (almost) all events by all users
      Ignore mlock limit after perf_event_mlock_kb without CAP_IPC_LOCK
>= 0: Disallow raw and ftrace function tracepoint access
>= 1: Disallow CPU event access
>= 2: Disallow kernel profiling
To make the adjusted perf_event_paranoid setting permanent preserve it
in /etc/sysctl.conf (e.g. kernel.perf_event_paranoid = <setting>)

Se eu mudar kernel.perf_event_paranoidpara 3 e executar o mesmo comando, obtenho o seguinte resultado, novamente como usuário não root:


 Performance counter stats for 'sleep 1':

                 0      context-switches:u                                          
                 0      cpu-migrations:u                                            

       1.000502603 seconds time elapsed

       0.000460000 seconds user
       0.000000000 seconds sys

Portanto, alterar a perf_event_paranoidconfiguração do padrão 4 para 3 tem algum efeito, mesmo que a documentação do kernel Linux não diga o quê.

O que da? O Ubuntu vem com um patch personalizado que adiciona um nível de desempenho novo e mais paranóico?

Outras distribuições

O Debian parece carregar um patch não padrão criando um perf_event_paranoidnível 3:

Jeff Vander Stoep postou o patch em 27 de julho. Ele adiciona outro valor que pode ser definido para o parâmetro sysctl (ou seja, kernel.perf_event_paranoid=3) que restringe perf_event_open()a processos com esse CAP_SYS_ADMINrecurso. Atualmente, perf_event_paranoidestá definido como 2 por padrão, o que não permite o acesso a alguns recursos de desempenho (acesso bruto a pontos de rastreamento, acesso a eventos de CPU e criação de perfil de kernel) para processos sem os recursos adequados; o patch não altera o padrão. Ele também enviou outro patch que permitiria configurar o kernel para fazer com que 3 fosse o valor perf_event_paranoid padrão.

(Fonte.)

Mas parece que o Ubuntu é ainda mais paranóico do que isso.

Responder1

O nível 4 faz exatamente a mesma coisa que o patch do Debian: ele desativa o uso de processos sem privilégios perf_event_open(). No entanto, a restrição entra em ação no nível de paranóia 4, em vez do nível de paranóia 3.

Os atuais níveis de paranóia estão documentados em um comentário no código-fonte do kernel, no arquivo kernel/events/core.c.

/*
 * perf event paranoia level:
 *  -1 - not paranoid at all
 *   0 - disallow raw tracepoint access for unpriv
 *   1 - disallow cpu events for unpriv
 *   2 - disallow kernel profiling for unpriv
 *   4 - disallow all unpriv perf event use
 */

O commit que faz esta mudança pode ser encontradoaqui. (Nota: a mensagem de commit e os comentários do kernel se contradizem. Os comentários do kernel parecem corretos para mim.)

Para resumir:

  • Níveis -1 a 2: iguais ao kernel principal.
  • Nível 3: Igual ao nível 2? Não foi possível confirmar isso 100%. Existe uma constante PERF_SECURITY_TRACEPOINTdefinida como 3 que ainda é usada em alguns lugares.
  • Nível 4: Desabilite perf_event_open totalmente para usuários sem privilégios.

Responder2

Além de desativá-lo para usuários não privilegiados, como Nick aponta corretamente, o nível 4 de paranóia também parece aplicar as mesmas restrições a arquivos privilegiados.

Por exemplo, no meu sistema Ubuntu 20.04 eu configurei um grupo perf_users de acordo com odocumentação oficial, e dotado perfdos seguintes recursos

$ getcap perf
perf = cap_sys_ptrace,cap_syslog,38+ep

Executar com paranóia nível 3 funciona conforme o esperado para usuários não privilegiados. No nível de paranóia 4, entretanto, perfretorna o erro da pergunta, apesar dos recursos do arquivo.

informação relacionada