Réamhrá gairid ar BPF agus eBPF

Hey Habr! Cuirimid in iúl duit go bhfuil muid ag ullmhú chun leabhar a scaoileadh"Infheictheacht Linux le BPF".

Réamhrá gairid ar BPF agus eBPF
De réir mar a leanann an meaisín fíorúil BPF ag forbairt agus go n-úsáidtear go gníomhach é go praiticiúil, tá alt aistrithe againn duit ag cur síos ar a phríomhghnéithe agus a staid reatha.

Le blianta beaga anuas, tá an-tóir ar uirlisí agus ar theicnící ríomhchlárúcháin chun teorainneacha an eithne Linux a chúiteamh i gcásanna ina bhfuil gá le próiseáil paicéid ardfheidhmíochta. Tugtar ceann de na modhanna is coitianta den chineál seo seachbhóthar croí (seachbhóthar eithne) agus ceadaíonn sé, gan bacadh le ciseal líonra an eithne, gach próiseáil paicéad a dhéanamh ó spás úsáideora. Is éard atá i gceist le seachaint an eithne ná an cárta líonra a bhainistiú ó spás úsáideora. I bhfocail eile, agus muid ag obair le cárta líonra, táimid ag brath ar an tiománaí spás úsáideora.

Trí rialú iomlán ar an gcárta líonra a aistriú chuig clár spáis úsáideora, laghdaítear an forchostais de bharr an eithne (lasca comhthéacs, próiseáil ciseal líonra, cur isteach, etc.), rud atá tábhachtach go leor nuair a bhíonn sé ag rith ag luasanna 10Gb / s nó níos airde. Ag seachaint an eithne chomh maith le meascán de ghnéithe eile (próiseáil bhaisc) agus tiúnadh cúramach feidhmíochta (Cuntasaíocht NUMA, leithlisiú LAP, etc.) na bunghnéithe a bhaineann le líonrú ardfheidhmíochta úsáideora-spáis a chur in oiriúint. B’fhéidir gur sampla den scoth é an cur chuige nua seo maidir le próiseáil paicéid DPDK ó Intel (Trealamh Forbartha Eitleán Sonraí), cé go bhfuil uirlisí agus teicnící aitheanta eile ann, lena n-áirítear VPP ó Cisco (Próiseáil Paicéad Veicteoir), Netmap agus, ar ndóigh, snabb.

Tá roinnt míbhuntáistí ag baint le heagrú idirghníomhaíochtaí líonra sa spás úsáideora:

  • Is ciseal astarraingthe é eithne OS d'acmhainní crua-earraí. Toisc go gcaithfidh cláir spáis úsáideoirí a gcuid acmhainní a bhainistiú go díreach, caithfidh siad a gcuid crua-earraí féin a bhainistiú freisin. Ciallaíonn sé seo go minic do thiománaithe féin a ríomhchlárú.
  • Ós rud é go bhfuil muid ag tabhairt suas spás eithne go hiomlán, táimid ag tabhairt suas freisin an fheidhmiúlacht líonraithe go léir a sholáthraíonn an eithne. Ní mór do chláir spáis úsáideora gnéithe a d'fhéadfadh an eithne nó an córas oibriúcháin a sholáthar cheana féin a chur i bhfeidhm.
  • Oibríonn cláir i mód bosca gainimh, rud a chuireann srian tromchúiseach ar a n-idirghníomhaíocht agus a chuireann cosc ​​​​orthu comhtháthú le codanna eile den chóras oibriúcháin.

Go bunúsach, nuair a bhíonn líonrú i spás úsáideora, baintear gnóthachain feidhmíochta amach trí phróiseáil paicéad a aistriú ón eithne go spás úsáideora. Déanann XDP a mhalairt go díreach: bogann sé cláir líonra ó spás úsáideoirí (scagairí, tiontairí, ródú, etc.) go dtí an limistéar eithne. Ligeann XDP dúinn feidhm an líonra a fhorghníomhú chomh luath agus a bhuaileann an paicéad an comhéadan líonra agus sula dtosaíonn sé ag taisteal suas go dtí fochóras líonra na heithne. Mar thoradh air sin, tá an luas próiseála paicéad méadaithe go suntasach. Mar sin féin, conas a ligeann an eithne don úsáideoir a gcláir a reáchtáil i spás eithne? Sula bhfreagróimid an cheist seo, déanaimis féachaint ar cad é BPF.

BPF agus eBPF

In ainneoin nach bhfuil an t-ainm iomlán soiléir, is samhail meaisín fíorúil é BPF (Paicéad Scagadh, Berkeley). Dearadh an meaisín fíorúil seo ar dtús chun scagadh paicéad a láimhseáil, agus mar sin an t-ainm.

Is é ceann de na huirlisí is cáiliúla a úsáideann BPF tcpdump. Nuair a bheidh paicéid á nglacadh le tcpdump is féidir leis an úsáideoir slonn a shonrú le haghaidh scagadh paicéad. Ní ghlacfar ach paicéid a mheaitseálann an slonn seo. Mar shampla, an abairt "tcp dst port 80Tagraíonn ” do gach paicéad TCP a thagann go calafort 80. Is féidir leis an tiomsaitheoir an slonn seo a ghiorrú trína thiontú go seachchód BPF.

$ sudo tcpdump -d "tcp dst port 80"
(000) ldh [12] (001) jeq #0x86dd jt 2 jf 6
(002) ldb [20] (003) jeq #0x6 jt 4 jf 15
(004) ldh [56] (005) jeq #0x50 jt 14 jf 15
(006) jeq #0x800 jt 7 jf 15
(007) ldb [23] (008) jeq #0x6 jt 9 jf 15
(009) ldh [20] (010) jset #0x1fff jt 15 jf 11
(011) ldxb 4*([14]&0xf)
(012) ldh [x + 16] (013) jeq #0x50 jt 14 jf 15
(014) ret #262144
(015) ret #0

Is é seo go bunúsach a dhéanann an clár thuas:

  • Treoir (000): Luchtaítear an paicéad ag fritháireamh 12, mar fhocal 16-giotán, isteach sa charnadóir. Freagraíonn Fritháireamh 12 d'éiteartype an phaicéid.
  • Teagasc (001): déantar comparáid idir an luach sa charnadóir le 0x86dd, is é sin, leis an luach éiteartype do IPv6. Má tá an toradh fíor, ansin téann cuntar an chláir chuig an teagasc (002), agus mura bhfuil, ansin chuig (006).
  • Teagasc (006): i gcomparáid leis an luach le 0x800 (luach éiteartype do IPv4). Má tá an freagra fíor, ansin téann an clár go (007), mura bhfuil, ansin go (015).

Agus mar sin de, go dtí go dtabharfaidh an clár scagtha paicéad toradh ar ais. De ghnáth is boolean é. Má chuirtear luach neamh-nialasach ar ais (treoir (014)) ciallaíonn sé sin go bhfuil an paicéad comhoiriúnaithe, agus le nialas a thabhairt ar ais (treoir (015)) ciallaíonn sé sin nár mheaitseáil an paicéad.

Mhol Steve McCann agus Van Jacobson an meaisín fíorúil BPF agus a bytecode go déanach i 1992 nuair a tháinig a bpáipéar amach. Scagaire Paicéad BSD: Ailtireacht nua chun paicéad a ghabháil ar leibhéal an úsáideora, den chéad uair a cuireadh an teicneolaíocht seo i láthair ag comhdháil Usenix sa gheimhreadh 1993.

Toisc gur meaisín fíorúil é BPF, sainmhíníonn sé an timpeallacht ina ritheann cláir. Chomh maith le bytecode, sainmhíníonn sé freisin múnla cuimhne paicéad (cuirtear treoracha ualaigh i bhfeidhm go hintuigthe ar phaicéad), cláir (A agus X; cláir charntha agus innéacs), stóráil cuimhne scratch, agus cuntar cláir intuigthe. Díol spéise é gur múnlaíodh bytecode BPF tar éis Motorola 6502 ISA. Mar a mheabhraigh Steve McCann ina chuid tuarascáil iomlánach ag Sharkfest '11, bhí sé eolach ar thógáil 6502 ón scoil ard agus é ag ríomhchlárú ar an Apple II, agus bhí tionchar ag an eolas seo ar a chuid oibre ag dearadh bytecode BPF.

Cuirtear tacaíocht BPF i bhfeidhm san eithne Linux i leagan v2.5 agus níos déanaí, curtha leis go príomha ag Jay Schullist. Níor tháinig aon athrú ar an gcód BPF go dtí 2011, nuair a d’athdhear Eric Dumaset an t-ateangaire BPF chun oibriú i mód JIT (Foinse: JIT le haghaidh Scagairí Paicéad). Tar éis sin, in ionad an bytecode BPF a léirmhíniú, d'fhéadfadh an eithne cláir BPF a thiontú go díreach chuig an sprioc-ailtireacht: x86, ARM, MIPS, etc.

Níos déanaí, in 2014, mhol Alexei Starovoitov meicníocht JIT nua le haghaidh BPF. Déanta na fírinne, rinneadh ailtireacht nua den JIT nua seo bunaithe ar BPF agus tugadh eBPF air. Sílim go raibh an dá VM taobh le chéile ar feadh tamaill, ach tá scagadh paicéad i bhfeidhm faoi láthair ar bharr eBPF. Go deimhin, i go leor samplaí doiciméadaithe nua-aimseartha, tugtar eBPF do BPF, agus tugtar cBPF ar BPF clasaiceach inniu.

Síneann eBPF an meaisín fíorúil BPF clasaiceach ar bhealaí éagsúla:

  • Ag brath ar ailtireachtaí nua-aimseartha 64-giotán. Úsáideann eBPF cláir 64-giotán agus méadaíonn sé líon na gclár atá ar fáil ó 2 (accumulator agus X) go 10. Soláthraíonn eBPF opcodes breise freisin (BPF_MOV, BPF_JNE, BPF_CALL…).
  • Scoite ón bhfochóras ciseal líonra. Bhí BPF ceangailte leis an tsamhail sonraí baisc. Ós rud é gur úsáideadh é chun paicéid a scagadh, bhí a chód san fhochóras a sholáthair idirghníomhaíochtaí líonra. Mar sin féin, níl an meaisín fíorúil eBPF ceangailte le samhail sonraí a thuilleadh agus is féidir é a úsáid chun críche ar bith. Mar sin, anois is féidir an clár eBPF a nascadh le rianphointe nó le kprobe. Osclaíonn sé seo an doras d’ionstraimiú eBPF, anailís feidhmíochta, agus go leor cásanna úsáide eile i gcomhthéacs fochóras eithne eile. Anois tá an cód eBPF suite ina chonair féin: eithne/bpf.
  • Stórais sonraí domhanda ar a dtugtar Maps. Is stórtha bunluacha iad léarscáileanna a sholáthraíonn malartú sonraí idir spás úsáideora agus spás eithne. Soláthraíonn eBPF roinnt cineálacha cártaí.
  • Feidhmeanna tánaisteacha. Go háirithe, chun pacáiste a fhorscríobh, seiceála a ríomh, nó pacáiste a chlónáil. Ritheann na feidhmeanna seo laistigh den eithne agus ní bhaineann siad le cláir spáis úsáideora. Ina theannta sin, is féidir glaonna córais a dhéanamh ó chláir eBPF.
  • Cuir deireadh le glaonna. Tá méid an chláir in EBPF teoranta do 4096 beart. Ligeann gné an ghlao deiridh do chlár eBPF rialú a aistriú chuig clár nua eBPF agus mar sin an teorannú seo a sheachaint (is féidir suas le 32 clár a shlabhraiú ar an mbealach seo).

sampla eBPF

Tá roinnt samplaí ann do eBPF sna foinsí eithne Linux. Tá siad ar fáil ag samplaí/bpf/. Chun na samplaí seo a thiomsú, níl le déanamh ach clóscríobh:

$ sudo make samples/bpf/

Ní scríobhfaidh mé sampla nua do eBPF mé féin, ach úsáidfidh mé ceann de na samplaí atá ar fáil i samplaí/bpf/. Breathnóidh mé ar roinnt codanna den chód agus míneoidh mé conas a oibríonn sé. Mar shampla, roghnaigh mé an clár tracex4.

Go ginearálta, tá dhá chomhad i ngach ceann de na samplaí i samplaí/bpf/. Sa chás seo:

  • tracex4_kern.c, ina bhfuil cód foinse atá le feidhmiú san eithne mar bytecode eBPF.
  • tracex4_user.c, tá clár ó spás úsáideora.

Sa chás seo, ní mór dúinn a thiomsú tracex4_kern.c chuig bytecode eBPF. I láthair na huaire i gcc níl aon chuid freastalaí ann do EBPF. Ar ámharaí an tsaoil, clang is féidir leis bytecode eBPF a tháirgeadh. Makefile úsáidí clang a thiomsú tracex4_kern.c chuig an gcomhad réad.

Luaigh mé thuas gurb é ceann de na gnéithe is suimiúla de eBPF ná léarscáileanna. Sainmhíníonn tracex4_kern léarscáil amháin:

struct pair {
    u64 val;
    u64 ip;
};  

struct bpf_map_def SEC("maps") my_map = {
    .type = BPF_MAP_TYPE_HASH,
    .key_size = sizeof(long),
    .value_size = sizeof(struct pair),
    .max_entries = 1000000,
};

BPF_MAP_TYPE_HASH ar cheann den iliomad cineálacha cártaí a thairgeann eBPF. Sa chás seo, tá sé ach hash. Seans gur thug tú an fógra faoi deara freisin SEC("maps"). Is macra é CSS a úsáidtear chun cuid nua de chomhad dénártha a chruthú. I ndáiríre, sa sampla tracex4_kern sainítear dhá chuid eile:

SEC("kprobe/kmem_cache_free")
int bpf_prog1(struct pt_regs *ctx)
{   
    long ptr = PT_REGS_PARM2(ctx);

    bpf_map_delete_elem(&my_map, &ptr); 
    return 0;
}
    
SEC("kretprobe/kmem_cache_alloc_node") 
int bpf_prog2(struct pt_regs *ctx)
{
    long ptr = PT_REGS_RC(ctx);
    long ip = 0;

    // получаем ip-адрес вызывающей стороны kmem_cache_alloc_node() 
    BPF_KRETPROBE_READ_RET_IP(ip, ctx);

    struct pair v = {
        .val = bpf_ktime_get_ns(),
        .ip = ip,
    };
    
    bpf_map_update_elem(&my_map, &ptr, &v, BPF_ANY);
    return 0;
}   

Ligeann an dá fheidhm seo duit iontráil a bhaint den léarscáil (kprobe/kmem_cache_free) agus cuir iontráil nua leis an léarscáil (kretprobe/kmem_cache_alloc_node). Freagraíonn gach ainm feidhme atá scríofa i gceannlitreacha do mhacraí atá sainmhínithe i bpf_helpers.h.

Má dhumpáilim na hailt den chomhad oibiachta, ba cheart dom a fheiceáil go bhfuil na hailt nua seo sainmhínithe cheana féin:

$ objdump -h tracex4_kern.o

tracex4_kern.o: file format elf64-little

Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000000 0000000000000000 0000000000000000 00000040 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 kprobe/kmem_cache_free 00000048 0000000000000000 0000000000000000 00000040 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
2 kretprobe/kmem_cache_alloc_node 000000c0 0000000000000000 0000000000000000 00000088 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
3 maps 0000001c 0000000000000000 0000000000000000 00000148 2**2
CONTENTS, ALLOC, LOAD, DATA
4 license 00000004 0000000000000000 0000000000000000 00000164 2**0
CONTENTS, ALLOC, LOAD, DATA
5 version 00000004 0000000000000000 0000000000000000 00000168 2**2
CONTENTS, ALLOC, LOAD, DATA
6 .eh_frame 00000050 0000000000000000 0000000000000000 00000170 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

Tá freisin tracex4_user.c, príomhchlár. Go bunúsach, éisteann an clár seo le haghaidh imeachtaí kmem_cache_alloc_node. Nuair a tharlaíonn teagmhas den sórt sin, déantar an cód eBPF comhfhreagrach a fhorghníomhú. Sábhálann an cód tréith IP an ruda ar léarscáil, agus ansin lúbtar an réad tríd an bpríomhchlár. Sampla:

$ sudo ./tracex4
obj 0xffff8d6430f60a00 is 2sec old was allocated at ip ffffffff9891ad90
obj 0xffff8d6062ca5e00 is 23sec old was allocated at ip ffffffff98090e8f
obj 0xffff8d5f80161780 is 6sec old was allocated at ip ffffffff98090e8f

Cén bhaint atá idir an clár spáis úsáideora agus an clár eBPF? Ag túsú tracex4_user.c luchtaíonn comhad réad tracex4_kern.o ag baint úsáide as an fheidhm load_bpf_file.

int main(int ac, char **argv)
{
    struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};
    char filename[256];
    int i;

    snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);

    if (setrlimit(RLIMIT_MEMLOCK, &r)) {
        perror("setrlimit(RLIMIT_MEMLOCK, RLIM_INFINITY)");
        return 1;
    }

    if (load_bpf_file(filename)) {
        printf("%s", bpf_log_buf);
        return 1;
    }

    for (i = 0; ; i++) {
        print_old_objects(map_fd[1]);
        sleep(1);
    }

    return 0;
}

Agus tú ag déanamh load_bpf_file cuirtear leis na taiscéalaithe atá sainithe sa chomhad eBPF /sys/kernel/debug/tracing/kprobe_events. Anois éisteann muid le haghaidh na n-imeachtaí seo agus is féidir lenár gclár rud éigin a dhéanamh nuair a tharlaíonn siad.

$ sudo cat /sys/kernel/debug/tracing/kprobe_events
p:kprobes/kmem_cache_free kmem_cache_free
r:kprobes/kmem_cache_alloc_node kmem_cache_alloc_node

Tá gach clár eile i sampla/bpf/ struchtúrtha mar an gcéanna. Bíonn dhá chomhad iontu i gcónaí:

  • XXX_kern.c: clár eBPF.
  • XXX_user.c: príomhchlár.

Sainmhíníonn clár eBPF na léarscáileanna agus na feidhmeanna a bhaineann le rannóg. Nuair a astaíonn an eithne imeacht de chineál áirithe (mar shampla, tracepoint), déantar na feidhmeanna faoi cheangal a fhorghníomhú. Soláthraíonn léarscáileanna cumarsáid idir clár eithne agus clár spáis úsáideora.

Conclúid

San Airteagal seo, pléadh BPF agus eBPF i dtéarmaí ginearálta. Tá a fhios agam go bhfuil go leor faisnéise agus acmhainní ar fáil faoi eBPF inniu, mar sin molfaidh mé cúpla ábhar eile le haghaidh tuilleadh staidéir.

Molaim léamh:

Foinse: will.com

Add a comment