4 minute read

BPF Nedir?

BPF’nin açılımı Berkeley Packet Filter’dır. 1992 yılında ilk olarak network paketlerini yakalama aracı olarak özellikle firewall uygulamalarında kullanılmak için ortaya çıkmış olmasına rağmen 2014 Yılında Linux Çekirdeğine eklenmesiyle BPF genel amaçlı bir çalıştırma motoruna evrilmiştir ve bir çok şey için kullanıma müsait hale gelmiştir, bunların arasında gelişmiş performans analizi araçlarının yaratılması da sayılabilir.

Bpf çok fazla şey yapabildiği için açıklamak güç olsa da çekirdek ve uygulamaların çalışırken mini programlar çalıştırmak gibi düşünülebilir. Bu noktada Javascript örneğini verebiliriz Javascriptin web tarayıcılarda mini programlar çalıştırarak web tabanlı uygulamalara izin vermesi gibi BPF de çekirdeğin sistem üzerinde mini programlar çalıştırmasına izin verir. Bu da çekirdeği çekirdek geliştiricisi olmayan kişiler için tamamen programlanabilir yapar bu sayede geliştiriciler gerçek dünyadaki problemleri çözmek için Linux sistemlerini kişiselleştirebilirler ve daha iyi kontrol edebilirler.

BPF komut seti, depolama objeleri ve yardımcı fonksiyonlardan oluşan esnek ve etkili bir teknolojidir. BPF’in sanal komut seti özelliğinden dolayı ona bir sanal makine desek yanlış olmaz. Bu komutlar Linu çekirdek BPF runtime’ıyla çalışır, bunun içinde bir yorumlayıcı (Interpreter) ve JIT compiler bulunur ve BPF komutlarını çalıştırılabilir native komutlara çevirir.

Güvenlik için BPF komutları ilk olarak bir doğrulayıcıdan geçmelidir, bu sayede BPF programının Linux çekirdeğini çökertmeyeceğinden veya bozmayacağından emin olunur.

BPF’nin üç ana kullanım amacı ağ yapıları, gözlemleme(takip) ve güvenliktir.

BPF emirlerini direk olarak kodlamak çok sıkıcı ve zor bir işlem o yüzden daha üst seviye programlama dilleriyle programlamamıza olanak sağlayan frontend araçları geliştirilmiştir. Bunlardan En bilinenleri BCC ve bpftrace’dir.

BCC (BPF Compiler Collection)

BPF için ilk geliştirilen üst seviye tracing çerçevesidir, Çekirdek BPF kodu için C programlama ortamı, kullanıcı seviyesi arayüz geliştirmesi için ise Python,Lua ve C++ dillerine destek verir. BCC deposu performans analizi ve problem çözmek için kullanılabilecek 70 adet BPF aracı içerir. Sisteminize BCC yükleyerek bu araçları kod yazmadan kullanabilirsiniz.

Bpftrace

Bpftrace ise özel bir amaca hizmet eden yeni bir front end aracıdır, bcc’de olduğu gibi araçlarla birlikte gelir. BCC ve bpftrace birbirinin yerine kullanılabilir ancak bpftrace daha çok tek satırda işi halleden kısa scriptler için kullanılırken BCC daha karmaşık scriptler ve daemonlar hazırlamak için daha uygundur ve diğer kütüphaneleri de kullanabilir. Örnek olarak bir çok Python BCC aracı Python’un argparse kütüphanesini komut satırından kontrol edilebilmesi amacıyla kullanmaktadır.

iki proje de Linux Vakfının IO Visor adlı projesinin github sayfasında barındırılmaktadır şu linklerden ulaşılabilir:

https://github.com/iovisor/bcc

https://github.com/iovisor/bpftrace

Debian 10’a BCC Ve Bpftrace Yüklenmesi

BCC ve Bpftrace debian depolarında bulunmaktadır apt paket yöneticisiyle yüklenebilirler.

Bcc için :

sudo apt-get install bpfcc-tools linux-headers-$(uname -r)

Bpftrace için:

apt install bpftrace

Bazı Gözlemleme Araçları

BCC Araçları

Tüm araçları sonuna ‘-bpfcc’ ekleyip root kullanıcısı olarak çalıştırabilirsiniz. örnek : biosnoop-bpfcc

biosnoop

Disk girdi-çıktılarını takip ederek satır satır sürelerini ve gecikmelerini verir disklerle ilgili takip yapmak gerektiğinde yararlı olabilecek bir araç.

biosnoop-bpfcc

TIME(s)     COMM           PID    DISK    T SECTOR     BYTES   LAT(ms)
0.000004    supervise      1950   xvda1   W 13092560   4096       0.74
0.000178    supervise      1950   xvda1   W 13092432   4096       0.61
0.001469    supervise      1956   xvda1   W 13092440   4096       1.24
0.001588    supervise      1956   xvda1   W 13115128   4096       1.09
1.022346    supervise      1950   xvda1   W 13115272   4096       0.98
1.022568    supervise      1950   xvda1   W 13188496   4096       0.93
1.023534    supervise      1956   xvda1   W 13188520   4096       0.79
1.023585    supervise      1956   xvda1   W 13189512   4096       0.60
2.003920    xfsaild/md0    456    xvdc    W 62901512   8192       0.23
2.003931    xfsaild/md0    456    xvdb    W 62901513   512        0.25
2.004034    xfsaild/md0    456    xvdb    W 62901520   8192       0.35
2.004042    xfsaild/md0    456    xvdb    W 63542016   4096       0.36
2.004204    kworker/0:3    26040  xvdb    W 41950344   65536      0.34

ext4slower

Yavaş ext4 dosya sistemi işlemlerini takip ederek gecikmelerini, işlemi gerçekleştiren process’in ID’sini ve zamanını gösterir.

extslower-bpfcc


06:35:01 cron           16464  R 1249    0          16.05 common-auth
06:35:01 cron           16463  R 1249    0          16.04 common-auth
06:35:01 cron           16465  R 1249    0          16.03 common-auth
06:35:01 cron           16465  R 4096    0          10.62 login.defs

filelife

Yaratıldıktan sonra çok kısa bir süre içinde silinen dosyaları takip edip ekrana yazar.

filelife-bpfcc

TIME     PID    COMM             AGE(s)  FILE
05:57:59 8556   gcc              0.04    ccCB5EDe.s
05:57:59 8560   rm               0.02    .entry_64.o.d
05:57:59 8563   gcc              0.02    cc5UFHXf.s

dbslower

MySQL veya Postgresql serverımıza yapılan veritabanı sorgularının arasından 1 msden daha uzun sürenlerini ekrana yazdırır.

dbslower-bpfcc

TIME(s)        PID          MS QUERY
1.421264       25776  2002.183 call getproduct(97)
3.572617       25776  2001.381 call getproduct(97)
5.661411       25776  2001.867 call getproduct(97)
7.748296       25776  2001.329 call getproduct(97)

tcptop

O an yapılan tcp bağlantılarını kaynak ip ve hedef ip ve boyutuyla birlikte gösterir.

Kullanımı : tcptop-bpfcc -R

tcptop-bpfcc -R

PID    COMM         LADDR                 RADDR                  RX_KB  TX_KB
17287  17287        100.66.3.172:22       100.127.69.165:57585       3      1
17286  sshd         100.66.3.172:22       100.127.69.165:57585       0      1
14374  sshd         100.66.3.172:22       100.127.69.165:25219       0      0

daha fazlası :

https://github.com/iovisor/bcc


Bazı Örnek Bpftrace Araçları

Bitesize.bt

Sistemdeki disklerde gerçekleşen girdi çıktı boyutlarını processlere göre histogram biçiminde gösterir.

*bashreadline.bt

Sistem genelinde kullanıcı farketmeksizin bash’e girilen komutları canlı olarak saati/dakikasıyla ve PID ile birlikte görmemizi sağlar.

pidpersec.bt

Sistemde arkaplanda açılan yeni processlerin sayısını bize gösterir.

syscount.bt

Sisteme yapılan syscalls’ları sayar ve bu çağrıları en çok yapan 10 işlemi process id’leriyle birlikte ekrana basar.

Daha fazlası için : https://github.com/iovisor/bpftrace#tools


Tek Satırlık Bpftrace komutları

# Process'in açtığı dosyaları görmek
bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s %s\n", comm, str(args->filename)); }'

# Programa göre Syscall sayısını görmek
bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'

# Process'e göre byteları okumak
bpftrace -e 'tracepoint:syscalls:sys_exit_read /args->ret/ { @[comm] = sum(args->ret); }'

# Syscall oranlarını görmek
bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @ = count(); } interval:s:1 { print(@); clear(@); }'

# Process'e göre disk boyutunu izlemek
bpftrace -e 'tracepoint:block:block_rq_issue { printf("%d %s %d\n", pid, comm, args->bytes); }'

# Process'e göre page faultları görmek
bpftrace -e 'software:faults:1 { @[comm] = count(); }'

# Açık dosyalar root cgroup-v2 processlerine göre görmek
bpftrace -e 'tracepoint:syscalls:sys_enter_openat /cgroup == cgroupid("/sys/fs/cgroup/unified/mycg")/ { printf("%s\n", str(args->filename)); }'

Daha fazla tek satırlık bpftrace komutu için : https://github.com/iovisor/bpftrace/blob/master/docs/tutorial_one_liners.md

Kaynaklar

  • Gregg,Brendan “BPF Performance Tools” - Linux System and Application Observability (2005)
  • https://www.kernel.org/doc/html/latest/bpf/index.html
  • https://github.com/iovisor/bcc
  • https://github.com/iovisor/bpftrace

Categories:

Updated:

Leave a comment