Home topics ebpf Che cos'è l'eBPF?
Esplora IBM Instana Observability
Design astratto che simboleggia l'attività del sistema operativo
Che cos'è l'eBPF?

Extended Berkeley Packet Filter (eBPF) è una tecnologia di programmazione che consente agli sviluppatori di scrivere programmi efficienti, sicuri e non intrusivi che vengono eseguiti direttamente nel sistema operativo (OS) Linux.

Poiché possono eseguire programmi in sandbox in contesti privilegiati, come un kernel del sistema operativo, gli eBPF possono espandere le funzioni del software esistente in fase di runtime senza modificare il codice sorgente o caricare moduli del kernel, né interrompere l'esecuzione complessiva del programma. Le tecnologie eBPF rappresentano un'evoluzione del Berkeley Packet Filter (BPF) originale, che forniva un modo semplice per selezionare e analizzare i pacchetti di rete in un programma di spazio utente. Ma oltre al filtro dei pacchetti, i programmi BPF non avevano la flessibilità per gestire attività più complesse all'interno del kernel.

Riconoscendo la necessità di una tecnologia più versatile, la community di Linux ha sviluppato eBPF, che si basava sulle funzionalità backend di BPF ma ne estendeva la programmabilità interna al kernel. La funzionalità avanzata dei programmi eBPF consente agli sviluppatori di implementare processi avanzati di filtraggio dei pacchetti, condurre analisi di fascia alta sulle prestazioni e installare firewall e protocolli di debug sia nei data center in loco che negli ambienti nativi del cloud.

I progressi della tecnologia eBPF hanno spinto gli sviluppatori di software ad espandere le sue applicazioni a tutti i sistemi operativi, in modo ch anche le piattaforme non basate su Linux potessero sfruttare le sofisticate funzionalità di tracciamento, rete e monitoraggio di eBPF.1 Infatti, l'eBPF Foundation, un'estensione della Linux Foundation i cui membri comprendono Google, Meta, Netflix, Microsoft, Intel e Isovalent, tra gli altri, hanno investito molto nell'espansione della compatibilità del sistema operativo per i programmi eBPF, nella speranza di ampliare l'utilità della programmazione eBPF.2

Richiedi una demo di Instana

Richiedi una demo di IBM Instana Observability per scoprire come ottenere l'osservabilità e il monitoraggio full stack in pochi minuti.

Contenuti correlati

Iscriviti alla newsletter IBM

Componenti dei programmi eBPF

I componenti principali di un programma eBPF sono:

Bytecode eBPF

I programmi eBPF sono inizialmente scritti in un sottoinsieme C limitato e poi compilati in bytecode eBPF utilizzando strumenti come LLVM, che funge da architettura back-end di eBPF per linguaggi di programmazione front-end come Clang. Il bytecode è, essenzialmente, un insieme limitato di istruzioni che aderiscono all'architettura del set di istruzioni eBPF e prevengono errori di runtime.

Interprete/compilatore JIT eBPF

La tecnologia kernel di Linux è in grado di tradurre il bytecode eBPF in azioni eseguibili, ma i compilatori just-in-time (JIT) offrono prestazioni superiori. I compilatori JIT possono tradurre rapidamente il codice bytecode in codice macchina nativo per piattaforme hardware specifiche. 

Caricatore dello spazio utente

I caricatori dello spazio utente sono programmi nello spazio utente che caricano il bytecode eBPF nel kernel, collegandolo agli hook appropriati e gestendo tutte le mappe eBPF associate. Alcuni esempi includono strumenti come BPF Compiler Collection (BCC) e bpftrace.   

Mappe eBPF

Le mappe eBPF sono strutture di dati con coppie chiave-valore e accesso in lettura e scrittura che offrono uno spazio di archiviazione condiviso e facilitano l'interazione tra i programmi eBPF kernel e le applicazioni di spazio utente. Create e gestite tramite chiamate di sistema, le mappe eBPF possono essere utilizzate anche per mantenere lo stato tra diverse iterazioni dei programmi eBPF.

Verificatore eBPF

Il verificatore, un componente critico dei sistemi eBPF, controlla il bytecode prima che venga caricato nel kernel per assicurarsi che non contenga operazioni dannose, come cicli infiniti, istruzioni dannose o accesso alla memoria fuori dai limiti. Assicura inoltre che tutti i percorsi di dati del programma vengano portati a termine correttamente.

Hook eBPF

Gli hook sono punti del codice del kernel in cui i programmi eBPF possono essere collegati. Quando il kernel raggiunge un hook, esegue il programma eBPF allegato.

Diversi tipi di hook, come punti di traccia, kprobes e code di ricezione dei pacchetti di rete, forniscono ai programmi eBPF un ampio accesso ai dati e permettono di eseguire varie operazioni. I punti di analisi, ad esempio, consentono ai programmi di ispezionare e raccogliere dati sul kernel o su altri processi, mentre gli hook di controllo del traffico possono essere utilizzati per ispezionare e modificare i pacchetti di rete.

Funzioni di supporto

Poiché gli eBPF non sono in grado di generare funzioni arbitrarie e devono mantenere la compatibilità con ogni possibile versione del kernel, talvolta i set di istruzioni base dell'eBPF non sono abbastanza sfumati per eseguire operazioni avanzate. Le funzioni di supporto colmano questa lacuna.

Le funzioni di supporto, ovvero insiemi di funzioni kernel predefinite basate su API che gli eBPF possono chiamare dall'interno del sistema, consentono ai programmi eBPF di eseguire operazioni più complesse (come ottenere l'ora e la data correnti o generare numeri casuali) non direttamente supportate dal set di istruzioni.  

Come funziona l'eBPF?

In genere, gli eBPF funzionano come virtual machine (VM) all'interno del kernel Linux, lavorando su un'architettura a basso livello di istruzioni ed eseguendo il bytecode eBPF. Tuttavia, il complesso processo di esecuzione di un programma eBPF tende a seguire alcuni passaggi principali.

Gli sviluppatori prima scrivono il programma eBPF, poi compilano il codice a barre. Lo scopo del programma determinerà il tipo di codice appropriato. Ad esempio, se un team vuole monitorare l'utilizzo della CPU, scriverà codice che include funzionalità per l'acquisizione delle metriche di utilizzo.

Una volta che il compilatore eBPF converte il codice C di alto livello in un bytecode di livello inferiore, un caricatore di spazio utente genererà una chiamata di sistema BPF per caricare il programma nel kernel. Il caricatore è anche responsabile della risoluzione degli errori e dell'impostazione di tutte le mappe eBPF necessarie al programma.

Con il bytecode e le mappe del programma in atto, l'eBPF eseguirà un processo di verifica per garantire che l'esecuzione del programma nel kernel sia sicura. Se viene ritenuto non sicuro, la chiamata di sistema per caricare il programma fallirà e il programma di caricamento riceverà un messaggio di errore. Se il programma supera la verifica, può essere eseguito.

Utilizzando un interprete o un compilatore JIT, eBPF tradurrà il codice bytecode in codice macchina fruibile. Tuttavia, eBPF è una tecnologia basata sugli eventi, quindi verrà eseguita solo in risposta a specifici punti hook o eventi all'interno del kernel (come chiamate di sistema, eventi di rete, avvio di processi, inattività della CPU, ecc.). Quando si verifica un evento, eBPF eseguirà il programma bytecode corrispondente, consentendo agli sviluppatori di ispezionare e manipolare vari componenti del sistema.

Quando il programma eBPF viene eseguito, gli sviluppatori possono interagire con esso dallo spazio utente utilizzando le mappe eBPF. Ad esempio, l'applicazione potrebbe controllare periodicamente una mappa per raccogliere dati dal programma eBPF oppure potrebbe aggiornare una mappa per modificare il comportamento del programma.

Lo scarico del programma è il passaggio finale della maggior parte dei processi di esecuzione di eBPF. Quando l'eBPF ha fatto il suo lavoro, il caricatore può utilizzare di nuovo il sistema BPF per scaricarlo dal kernel. A quel punto l'eBPF smette di funzionare e libera le risorse associate. Il processo di scarico può anche includere l'iterazione su qualsiasi mappa eBPF di cui il team non ha più bisogno per liberare singoli elementi utili, e quindi l'eliminazione della mappa stessa (utilizzando la chiamata di sistema "delete").

Casi d'uso e vantaggi dell'eBPF

Le tecnologie eBPF sono già diventate una pietra miliare dei moderni sistemi Linux, consentendo un controllo preciso sul kernel Linux e consentendo alle aziende di creare soluzioni più innovative all'interno dell'ecosistema Linux.

L'eBPF ha facilitato i progressi in: 

Reti

L'eBPF consente agli sviluppatori di installare funzionalità di elaborazione dei pacchetti più veloci e personalizzate, processi di bilanciamento del carico, script di profilazione delle applicazioni e procedure di monitoraggio della rete. Alcune piattaforme open-source, come Cilium, utilizzano l'eBPF per fornire una rete sicura e scalabile per cluster Kubernetes e workload e altri microservizi containerizzati. Inoltre, sfruttando la logica di inoltro dei pacchetti a livello di kernel, gli eBPF possono semplificare i processi di instradamento e consentire una risposta complessiva della rete più rapida.

Osservabilità

Gli eBPF consentono agli sviluppatori di dotare il kernel e le applicazioni dello spazio utente di strumenti per raccogliere dati e metriche dettagliate sulle prestazioni senza influire in modo significativo sulle prestazioni del sistema. Queste funzionalità aiutano le organizzazioni a rimanere all'avanguardia, consentendo il monitoraggio e l'osservabilità in tempo reale.

Protezione

L'eBPF è in grado di monitorare le chiamate di sistema, il traffico di rete e il comportamento del sistema per rilevare e rispondere in tempo reale a potenziali minacce per la sicurezza. Soluzioni IT come Falco, ad esempio, utilizzano l'eBPF per implementare il controllo della sicurezza del runtime e la risposta agli incidenti, migliorando la sicurezza complessiva del sistema.

Ottimizzazione delle prestazioni

Tracciando le chiamate di sistema, monitorando l'utilizzo della CPU e tenendo traccia dell'utilizzo delle risorse (come l'I/O del disco), l'eBPF aiuta gli sviluppatori a esaminare più facilmente i colli di bottiglia nelle prestazioni del sistema e a identificare le opportunità di ottimizzazione.

Soluzioni correlate
IBM Instana Observability

IBM Instana democratizza l'osservabilità fornendo una soluzione che chiunque tra DevOps, SRE, piattaforma, ITOps e sviluppo può utilizzare per ottenere i dati desiderati con il contesto di cui ha bisogno. Costruita appositamente per il cloud-native, ma indipendente dalla tecnologia, la piattaforma fornisce automaticamente e continuamente dati ad alta fedeltà con una granularità di 1 secondo e tracce end-to-end, con il contesto delle dipendenze logiche e fisiche tra dispositivi mobili, web, applicazioni e infrastrutture.

Esplora Instana Richiedi una demo di Instana

IBM Turbonomic

La piattaforma di ottimizzazione dei costi del cloud ibrido di IBM Turbonomic consente di automatizzare continuamente le azioni critiche in tempo reale che offrono proattivamente un utilizzo più efficiente delle risorse di calcolo, di storage e di rete per le app a ogni livello dello stack. 

Esplora Turbonomic Prova Turbonomic gratuitamente
Fai il passo successivo

IBM Instana consente osservabilità in tempo reale che tutti, e chiunque, possono utilizzare. Offre un rapido time to value, verificando al contempo che la strategia di osservabilità possa tenere il passo con la complessità dinamica degli ambienti di oggi e di domani. Dal mobile al mainframe, Instana supporta oltre 250 tecnologie ed è in continua crescita. 

Esplora IBM Instana Prenota una demo live
Note a piè di pagina

Foundation Proposes Advancing eBPF Adoption Across Multiple OSes,(link esterno a ibm.com)" DevOps.com, 21 agosto 2021

Latest eBPF Advances Are Harbingers of Major Changes to IT (link esterno a ibm.com), DevOps.com, 13 settembre 2023