ค้นหาเว็บไซต์

BCC - เครื่องมือติดตามแบบไดนามิกสำหรับการตรวจสอบประสิทธิภาพ Linux ระบบเครือข่าย และอื่นๆ


BCC (BPF Compiler Collection) เป็นชุดเครื่องมือที่เหมาะสมและไฟล์ตัวอย่างที่มีประสิทธิภาพสำหรับการสร้างโปรแกรมติดตามเคอร์เนลและจัดการเคอร์เนลที่เชี่ยวชาญ ใช้ส่วนขยาย BPF (Berkeley Packet Filters) ซึ่งเดิมเรียกว่า eBPF ซึ่งเป็นหนึ่งในคุณลักษณะใหม่ใน Linux 3.15 แข็งแกร่ง>.

ในทางปฏิบัติแล้ว ส่วนประกอบส่วนใหญ่ที่ BCC ใช้ต้องใช้ Linux 4.1 หรือสูงกว่า และคุณลักษณะเด่นๆ ได้แก่:

  1. ไม่ต้องใช้โมดูลเคอร์เนลของบริษัทอื่น เนื่องจากเครื่องมือทั้งหมดทำงานโดยใช้ BPF ซึ่งติดตั้งอยู่ในเคอร์เนล และ BCC ใช้คุณสมบัติที่เพิ่มเข้ามาในซีรีส์ Linux 4.x
  2. เปิดใช้งานการสังเกตการทำงานของซอฟต์แวร์
  3. ประกอบด้วยเครื่องมือวิเคราะห์ประสิทธิภาพหลายอย่างพร้อมไฟล์ตัวอย่างและหน้าคู่มือ

การอ่านที่แนะนำ: เครื่องมือบรรทัดคำสั่ง 20 รายการเพื่อตรวจสอบประสิทธิภาพของ Linux

เหมาะที่สุดสำหรับผู้ใช้ Linux ขั้นสูง BCC ทำให้ง่ายต่อการเขียนโปรแกรม BPF โดยใช้เครื่องมือเคอร์เนลใน C และส่วนหน้าใน หลามและหลัว นอกจากนี้ยังสนับสนุนงานหลายอย่าง เช่น การวิเคราะห์ประสิทธิภาพ การตรวจสอบ การควบคุมการรับส่งข้อมูลเครือข่าย และอื่นๆ อีกมากมาย

วิธีการติดตั้ง BCC ในระบบ Linux

โปรดจำไว้ว่า BCC ใช้คุณลักษณะที่เพิ่มในเคอร์เนล Linux เวอร์ชัน 4.1 หรือสูงกว่า และตามข้อกำหนด เคอร์เนลควรได้รับการคอมไพล์ด้วยแฟล็กที่ตั้งไว้ด้านล่าง:

CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
[optional, for tc filters]
CONFIG_NET_CLS_BPF=m
[optional, for tc actions]
CONFIG_NET_ACT_BPF=m
CONFIG_BPF_JIT=y
CONFIG_HAVE_BPF_JIT=y
[optional, for kprobes]
CONFIG_BPF_EVENTS=y

หากต้องการตรวจสอบแฟล็กเคอร์เนลของคุณ ให้ดูไฟล์ /proc/config.gz หรือเรียกใช้คำสั่งตามตัวอย่างด้านล่าง:

tecmint@TecMint ~ $ grep CONFIG_BPF= /boot/config-`uname -r`
CONFIG_BPF=y
tecmint@TecMint ~ $ grep CONFIG_BPF_SYSCALL= /boot/config-`uname -r`
CONFIG_BPF_SYSCALL=y
tecmint@TecMint ~ $ grep CONFIG_NET_CLS_BPF= /boot/config-`uname -r`
CONFIG_NET_CLS_BPF=m
tecmint@TecMint ~ $ grep CONFIG_NET_ACT_BPF= /boot/config-`uname -r`
CONFIG_NET_ACT_BPF=m
tecmint@TecMint ~ $ grep CONFIG_BPF_JIT= /boot/config-`uname -r`
CONFIG_BPF_JIT=y
tecmint@TecMint ~ $ grep CONFIG_HAVE_BPF_JIT= /boot/config-`uname -r`
CONFIG_HAVE_BPF_JIT=y
tecmint@TecMint ~ $ grep CONFIG_BPF_EVENTS= /boot/config-`uname -r`
CONFIG_BPF_EVENTS=y

หลังจากตรวจสอบแฟล็กเคอร์เนลแล้ว ก็ถึงเวลาติดตั้งเครื่องมือ BCC ในระบบ Linux

บนอูบุนตู 16.04

เฉพาะแพ็คเกจกลางคืนเท่านั้นที่สร้างขึ้นสำหรับ Ubuntu 16.04 แต่คำแนะนำในการติดตั้งนั้นตรงไปตรงมามาก ไม่จำเป็นต้องอัพเกรดเคอร์เนลหรือคอมไพล์จากแหล่งที่มา

echo "deb [trusted=yes] https://repo.iovisor.org/apt/xenial xenial-nightly main" | sudo tee /etc/apt/sources.list.d/iovisor.list
sudo apt-get update
sudo apt-get install bcc-tools

บนอูบุนตู 14.04

เริ่มต้นด้วยการติดตั้งเคอร์เนล Linux 4.3+ จาก http://kernel.ubuntu.com/~kernel-ppa/mainline

ตามตัวอย่าง ให้เขียนเชลล์สคริปต์ขนาดเล็ก “bcc-install.sh” โดยมีเนื้อหาด้านล่าง

หมายเหตุ: อัปเดตค่า PREFIX เป็นวันที่ล่าสุด และเรียกดูไฟล์ใน PREFIX url ที่ให้ไว้ด้วย รับค่า REL จริง แทนที่ค่าเหล่านั้นในเชลล์สคริปต์

#!/bin/bash
VER=4.5.1-040501
PREFIX=http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.5.1-wily/
REL=201604121331
wget ${PREFIX}/linux-headers-${VER}-generic_${VER}.${REL}_amd64.deb
wget ${PREFIX}/linux-headers-${VER}_${VER}.${REL}_all.deb
wget ${PREFIX}/linux-image-${VER}-generic_${VER}.${REL}_amd64.deb
sudo dpkg -i linux-*${VER}.${REL}*.deb

บันทึกไฟล์และออก ทำให้สามารถเรียกใช้งานได้ จากนั้นรันตามที่แสดง:

chmod +x bcc-install.sh
sh bcc-install.sh

หลังจากนั้นให้รีบูทระบบของคุณ

reboot

จากนั้น เรียกใช้คำสั่งด้านล่างเพื่อติดตั้งแพ็คเกจ BCC ที่ลงนามแล้ว:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys D4284CDD
echo "deb https://repo.iovisor.org/apt trusty main" | sudo tee /etc/apt/sources.list.d/iovisor.list
sudo apt-get update
sudo apt-get install binutils bcc bcc-tools libbcc-examples python-bcc

ใน Fedora 24-23

ติดตั้งเคอร์เนล 4.2+ จาก http://alt.fedoraproject.org/pub/alt/rawhide-kernel-nodebug หากระบบของคุณมีเวอร์ชันต่ำกว่าที่จำเป็น ด้านล่างนี้เป็นตัวอย่างวิธีการดำเนินการดังกล่าว:

sudo dnf config-manager --add-repo=http://alt.fedoraproject.org/pub/alt/rawhide-kernel-nodebug/fedora-rawhide-kernel-nodebug.repo
sudo dnf update
reboot

หลังจากนั้น เพิ่มพื้นที่เก็บข้อมูลเครื่องมือ BBC อัปเดตระบบของคุณ และติดตั้งเครื่องมือโดยดำเนินการชุดคำสั่งถัดไป:

echo -e '[iovisor]\nbaseurl=https://repo.iovisor.org/yum/nightly/f23/$basearch\nenabled=1\ngpgcheck=0' | sudo tee /etc/yum.repos.d/iovisor.repo
sudo dnf update
sudo dnf install bcc-tools

บน Arch Linux – AUR

คุณควรเริ่มต้นด้วยการอัพเกรดเคอร์เนลของคุณเป็นเวอร์ชันอย่างน้อย 4.3.1-1 จากนั้นจึงติดตั้งแพ็คเกจด้านล่างโดยใช้ตัวจัดการแพ็คเกจ Arch เช่น pacaur, yaourt<, กลัว ฯลฯ

bcc bcc-tools python-bcc python2-bcc

วิธีใช้เครื่องมือ BCC ในระบบ Linux

เครื่องมือ BCC ทั้งหมดได้รับการติดตั้งภายใต้ไดเรกทอรี /usr/share/bcc/tools อย่างไรก็ตาม คุณสามารถเรียกใช้งานได้จากพื้นที่เก็บข้อมูล BCC Github ภายใต้ /tools โดยที่ลงท้ายด้วยส่วนขยาย .py

$ ls /usr/share/bcc/tools 

argdist       capable     filetop         offwaketime  stackcount  vfscount
bashreadline  cpudist     funccount       old          stacksnoop  vfsstat
biolatency    dcsnoop     funclatency     oomkill      statsnoop   wakeuptime
biosnoop      dcstat      gethostlatency  opensnoop    syncsnoop   xfsdist
biotop        doc         hardirqs        pidpersec    tcpaccept   xfsslower
bitesize      execsnoop   killsnoop       profile      tcpconnect  zfsdist
btrfsdist     ext4dist    mdflush         runqlat      tcpconnlat  zfsslower
btrfsslower   ext4slower  memleak         softirqs     tcpretrans
cachestat     filelife    mysqld_qslower  solisten     tplist
cachetop      fileslower  offcputime      sslsniff     trace

เราจะกล่าวถึงตัวอย่างบางส่วนภายใต้ – การตรวจสอบประสิทธิภาพระบบ Linux ทั่วไปและเครือข่าย

ติดตาม open() syscalls

เริ่มต้นด้วยการติดตาม syscalls ของ open() ทั้งหมดโดยใช้ opensnoop สิ่งนี้ช่วยให้เราบอกเราว่าแอปพลิเคชันต่างๆ ทำงานอย่างไรโดยระบุไฟล์ข้อมูล ไฟล์กำหนดค่า และอื่นๆ อีกมากมาย:

$ cd /usr/share/bcc/tools 
$ sudo ./opensnoop

PID    COMM               FD ERR PATH
1      systemd            35   0 /proc/self/mountinfo
2797   udisksd            13   0 /proc/self/mountinfo
1      systemd            35   0 /sys/devices/pci0000:00/0000:00:0d.0/ata3/host2/target2:0:0/2:0:0:0/block/sda/sda1/uevent
1      systemd            35   0 /run/udev/data/b8:1
1      systemd            -1   2 /etc/systemd/system/sys-kernel-debug-tracing.mount
1      systemd            -1   2 /run/systemd/system/sys-kernel-debug-tracing.mount
1      systemd            -1   2 /run/systemd/generator/sys-kernel-debug-tracing.mount
1      systemd            -1   2 /usr/local/lib/systemd/system/sys-kernel-debug-tracing.mount
2247   systemd            15   0 /proc/self/mountinfo
1      systemd            -1   2 /lib/systemd/system/sys-kernel-debug-tracing.mount
1      systemd            -1   2 /usr/lib/systemd/system/sys-kernel-debug-tracing.mount
1      systemd            -1   2 /run/systemd/generator.late/sys-kernel-debug-tracing.mount
1      systemd            -1   2 /etc/systemd/system/sys-kernel-debug-tracing.mount.wants
1      systemd            -1   2 /etc/systemd/system/sys-kernel-debug-tracing.mount.requires
1      systemd            -1   2 /run/systemd/system/sys-kernel-debug-tracing.mount.wants
1      systemd            -1   2 /run/systemd/system/sys-kernel-debug-tracing.mount.requires
1      systemd            -1   2 /run/systemd/generator/sys-kernel-debug-tracing.mount.wants
1      systemd            -1   2 /run/systemd/generator/sys-kernel-debug-tracing.mount.requires
1      systemd            -1   2 /usr/local/lib/systemd/system/sys-kernel-debug-tracing.mount.wants
1      systemd            -1   2 /usr/local/lib/systemd/system/sys-kernel-debug-tracing.mount.requires
1      systemd            -1   2 /lib/systemd/system/sys-kernel-debug-tracing.mount.wants
1      systemd            -1   2 /lib/systemd/system/sys-kernel-debug-tracing.mount.requires
1      systemd            -1   2 /usr/lib/systemd/system/sys-kernel-debug-tracing.mount.wants
1      systemd            -1   2 /usr/lib/systemd/system/sys-kernel-debug-tracing.mount.requires
1      systemd            -1   2 /run/systemd/generator.late/sys-kernel-debug-tracing.mount.wants
1      systemd            -1   2 /run/systemd/generator.late/sys-kernel-debug-tracing.mount.requires
1      systemd            -1   2 /etc/systemd/system/sys-kernel-debug-tracing.mount.d
1      systemd            -1   2 /run/systemd/system/sys-kernel-debug-tracing.mount.d
1      systemd            -1   2 /run/systemd/generator/sys-kernel-debug-tracing.mount.d
....

สรุปเวลาแฝง I/O ของอุปกรณ์บล็อก

ในตัวอย่างนี้ แสดงการกระจายแบบสรุปของเวลาแฝงของ I/O ของดิสก์โดยใช้ biolatecency หลังจากดำเนินการคำสั่ง ให้รอสักครู่แล้วกด Ctrl-C เพื่อสิ้นสุดและดูผลลัพธ์

$ sudo ./biolatecncy

Tracing block device I/O... Hit Ctrl-C to end.
^C
     usecs               : count     distribution
         0 -> 1          : 0        |                                        |
         2 -> 3          : 0        |                                        |
         4 -> 7          : 0        |                                        |
         8 -> 15         : 0        |                                        |
        16 -> 31         : 0        |                                        |
        32 -> 63         : 0        |                                        |
        64 -> 127        : 0        |                                        |
       128 -> 255        : 3        |****************************************|
       256 -> 511        : 3        |****************************************|
       512 -> 1023       : 1        |*************                           |

ติดตามกระบวนการใหม่ผ่าน exec() Syscalls

ในส่วนนี้ เราจะย้ายไปยังการติดตามกระบวนการใหม่ในการดำเนินการโดยใช้เครื่องมือ execsnoop แต่ละครั้งที่กระบวนการถูกแยกโดย fork() และ exec() syscalls กระบวนการนั้นจะแสดงอยู่ในเอาต์พุต อย่างไรก็ตาม กระบวนการทั้งหมดไม่ได้ถูกบันทึก

$ sudo ./execsnoop

PCOMM            PID    PPID   RET ARGS
gnome-screensho  14882  14881    0 /usr/bin/gnome-screenshot --gapplication-service
systemd-hostnam  14892  1        0 /lib/systemd/systemd-hostnamed
nautilus         14897  2767    -2 /home/tecmint/bin/net usershare info
nautilus         14897  2767    -2 /home/tecmint/.local/bin/net usershare info
nautilus         14897  2767    -2 /usr/local/sbin/net usershare info
nautilus         14897  2767    -2 /usr/local/bin/net usershare info
nautilus         14897  2767    -2 /usr/sbin/net usershare info
nautilus         14897  2767    -2 /usr/bin/net usershare info
nautilus         14897  2767    -2 /sbin/net usershare info
nautilus         14897  2767    -2 /bin/net usershare info
nautilus         14897  2767    -2 /usr/games/net usershare info
nautilus         14897  2767    -2 /usr/local/games/net usershare info
nautilus         14897  2767    -2 /snap/bin/net usershare info
compiz           14899  14898   -2 /home/tecmint/bin/libreoffice --calc
compiz           14899  14898   -2 /home/tecmint/.local/bin/libreoffice --calc
compiz           14899  14898   -2 /usr/local/sbin/libreoffice --calc
compiz           14899  14898   -2 /usr/local/bin/libreoffice --calc
compiz           14899  14898   -2 /usr/sbin/libreoffice --calc
libreoffice      14899  2252     0 /usr/bin/libreoffice --calc
dirname          14902  14899    0 /usr/bin/dirname /usr/bin/libreoffice
basename         14903  14899    0 /usr/bin/basename /usr/bin/libreoffice
...

ติดตามการดำเนินการ ext4 ที่ช้า

การใช้ ext4slower เพื่อติดตามการดำเนินการทั่วไปของระบบไฟล์ ext4 ที่ช้ากว่า 10ms เพื่อช่วยเราระบุ I/O ของดิสก์ที่ช้าอย่างเป็นอิสระผ่านไฟล์ ระบบ.

การอ่านที่แนะนำ: 13 เครื่องมือตรวจสอบประสิทธิภาพของ Linux

ส่งออกเฉพาะการดำเนินการที่เกินขีดจำกัดเท่านั้น:

$ sudo ./execslower

Tracing ext4 operations slower than 10 ms
TIME     COMM           PID    T BYTES   OFF_KB   LAT(ms) FILENAME
11:59:13 upstart        2252   W 48      1          10.76 dbus.log
11:59:13 gnome-screensh 14993  R 144     0          10.96 settings.ini
11:59:13 gnome-screensh 14993  R 28      0          16.02 gtk.css
11:59:13 gnome-screensh 14993  R 3389    0          18.32 gtk-main.css
11:59:25 rs:main Q:Reg  1826   W 156     60         31.85 syslog
11:59:25 pool           15002  R 208     0          14.98 .xsession-errors
11:59:25 pool           15002  R 644     0          12.28 .ICEauthority
11:59:25 pool           15002  R 220     0          13.38 .bash_logout
11:59:27 dconf-service  2599   S 0       0          22.75 user.BHDKOY
11:59:33 compiz         2548   R 4096    0          19.03 firefox.desktop
11:59:34 compiz         15008  R 128     0          27.52 firefox.sh
11:59:34 firefox        15008  R 128     0          36.48 firefox
11:59:34 zeitgeist-daem 2988   S 0       0          62.23 activity.sqlite-wal
11:59:34 zeitgeist-fts  2996   R 8192    40         15.67 postlist.DB
11:59:34 firefox        15008  R 140     0          18.05 dependentlibs.list
11:59:34 zeitgeist-fts  2996   S 0       0          25.96 position.tmp
11:59:34 firefox        15008  R 4096    0          10.67 libplc4.so
11:59:34 zeitgeist-fts  2996   S 0       0          11.29 termlist.tmp
...

ติดตามบล็อกอุปกรณ์ I/O พร้อม PID และเวลาแฝง

ต่อไป เรามาเจาะลึกในการพิมพ์บรรทัดต่อดิสก์ I/O ในแต่ละวินาที โดยมีรายละเอียดต่างๆ เช่น ID กระบวนการ เซกเตอร์ ไบต์ เวลาแฝง และอื่นๆ โดยใช้ biosnoop:

$ sudo ./biosnoop

TIME(s)        COMM           PID    DISK    T  SECTOR    BYTES   LAT(ms)
0.000000000    ?              0              R  -1        8          0.26
2.047897000    ?              0              R  -1        8          0.21
3.280028000    kworker/u4:0   14871  sda     W  30552896  4096       0.24
3.280271000    jbd2/sda1-8    545    sda     W  29757720  12288      0.40
3.298318000    jbd2/sda1-8    545    sda     W  29757744  4096       0.14
4.096084000    ?              0              R  -1        8          0.27
6.143977000    ?              0              R  -1        8          0.27
8.192006000    ?              0              R  -1        8          0.26
8.303938000    kworker/u4:2   15084  sda     W  12586584  4096       0.14
8.303965000    kworker/u4:2   15084  sda     W  25174736  4096       0.14
10.239961000   ?              0              R  -1        8          0.26
12.292057000   ?              0              R  -1        8          0.20
14.335990000   ?              0              R  -1        8          0.26
16.383798000   ?              0              R  -1        8          0.17
...

ติดตามอัตราส่วนการเข้าชม/พลาดแคชของเพจ

หลังจากนั้น เราจะใช้ cachestat เพื่อแสดงสถิติสรุปหนึ่งบรรทัดจากแคชของระบบทุกๆ วินาที ซึ่งเปิดใช้งานสำหรับการดำเนินการปรับแต่งระบบโดยชี้ให้เห็นอัตราส่วนการเข้าชมแคชต่ำและอัตราการพลาดสูง:

$ sudo ./cachestat

 HITS   MISSES  DIRTIES  READ_HIT% WRITE_HIT%   BUFFERS_MB  CACHED_MB
       0        0        0       0.0%       0.0%           19        544
       4        4        2      25.0%      25.0%           19        544
    1321       33        4      97.3%       2.3%           19        545
    7476        0        2     100.0%       0.0%           19        545
    6228       15        2      99.7%       0.2%           19        545
       0        0        0       0.0%       0.0%           19        545
    7391      253      108      95.3%       2.7%           19        545
   33608     5382       28      86.1%      13.8%           19        567
   25098       37       36      99.7%       0.0%           19        566
   17624      239      416      96.3%       0.5%           19        520
...

ติดตามการเชื่อมต่อ TCP ที่ใช้งานอยู่

ตรวจสอบการเชื่อมต่อ TCP ทุกวินาทีโดยใช้ tcpconnect ผลลัพธ์ประกอบด้วยที่อยู่ต้นทางและปลายทาง และหมายเลขพอร์ต เครื่องมือนี้มีประโยชน์สำหรับการติดตามการเชื่อมต่อ TCP ที่ไม่คาดคิด จึงช่วยให้เราระบุความไร้ประสิทธิภาพในการกำหนดค่าแอปพลิเคชันหรือผู้โจมตีได้

$ sudo ./tcpconnect

PID    COMM         IP SADDR            DADDR            DPORT
15272  Socket Threa 4  10.0.2.15        91.189.89.240    80  
15272  Socket Threa 4  10.0.2.15        216.58.199.142   443 
15272  Socket Threa 4  10.0.2.15        216.58.199.142   80  
15272  Socket Threa 4  10.0.2.15        216.58.199.174   443 
15272  Socket Threa 4  10.0.2.15        54.200.62.216    443 
15272  Socket Threa 4  10.0.2.15        54.200.62.216    443 
15272  Socket Threa 4  10.0.2.15        117.18.237.29    80  
15272  Socket Threa 4  10.0.2.15        216.58.199.142   80  
15272  Socket Threa 4  10.0.2.15        216.58.199.131   80  
15272  Socket Threa 4  10.0.2.15        216.58.199.131   443 
15272  Socket Threa 4  10.0.2.15        52.222.135.52    443 
15272  Socket Threa 4  10.0.2.15        216.58.199.131   443 
15272  Socket Threa 4  10.0.2.15        54.200.62.216    443 
15272  Socket Threa 4  10.0.2.15        54.200.62.216    443 
15272  Socket Threa 4  10.0.2.15        216.58.199.132   443 
15272  Socket Threa 4  10.0.2.15        216.58.199.131   443 
15272  Socket Threa 4  10.0.2.15        216.58.199.142   443 
15272  Socket Threa 4  10.0.2.15        54.69.17.198     443 
15272  Socket Threa 4  10.0.2.15        54.69.17.198     443 
...

เครื่องมือทั้งหมดข้างต้นยังสามารถใช้กับตัวเลือกต่างๆ ได้ หากต้องการเปิดใช้งานหน้าความช่วยเหลือสำหรับเครื่องมือที่กำหนด ให้ใช้ตัวเลือก -h ตัวอย่างเช่น:

$ sudo ./tcpconnect -h

usage: tcpconnect [-h] [-t] [-p PID] [-P PORT]

Trace TCP connects

optional arguments:
  -h, --help            show this help message and exit
  -t, --timestamp       include timestamp on output
  -p PID, --pid PID     trace this PID only
  -P PORT, --port PORT  comma-separated list of destination ports to trace.

examples:
    ./tcpconnect           # trace all TCP connect()s
    ./tcpconnect -t        # include timestamps
    ./tcpconnect -p 181    # only trace PID 181
    ./tcpconnect -P 80     # only trace port 80
    ./tcpconnect -P 80,81  # only trace port 80 and 81

ติดตามล้มเหลว exec()s Syscalls

หากต้องการติดตาม syscalls ของ exec()s ที่ล้มเหลว ให้ใช้ตัวเลือก -x กับ opensnoop ดังต่อไปนี้:

$ sudo ./opensnoop -x

PID    COMM               FD ERR PATH
15414  pool               -1   2 /home/.hidden
15415  (ostnamed)         -1   2 /sys/fs/cgroup/cpu/system.slice/systemd-hostnamed.service/cgroup.procs
15415  (ostnamed)         -1   2 /sys/fs/cgroup/cpu/system.slice/cgroup.procs
15415  (ostnamed)         -1   2 /sys/fs/cgroup/cpuacct/system.slice/systemd-hostnamed.service/cgroup.procs
15415  (ostnamed)         -1   2 /sys/fs/cgroup/cpuacct/system.slice/cgroup.procs
15415  (ostnamed)         -1   2 /sys/fs/cgroup/blkio/system.slice/systemd-hostnamed.service/cgroup.procs
15415  (ostnamed)         -1   2 /sys/fs/cgroup/blkio/system.slice/cgroup.procs
15415  (ostnamed)         -1   2 /sys/fs/cgroup/memory/system.slice/systemd-hostnamed.service/cgroup.procs
15415  (ostnamed)         -1   2 /sys/fs/cgroup/memory/system.slice/cgroup.procs
15415  (ostnamed)         -1   2 /sys/fs/cgroup/pids/system.slice/systemd-hostnamed.service/cgroup.procs
2548   compiz             -1   2 
15416  systemd-cgroups    -1   2 /run/systemd/container
15416  systemd-cgroups    -1   2 /sys/fs/kdbus/0-system/bus
15415  systemd-hostnam    -1   2 /run/systemd/container
15415  systemd-hostnam    -1  13 /proc/1/environ
15415  systemd-hostnam    -1   2 /sys/fs/kdbus/0-system/bus
1695   dbus-daemon        -1   2 /run/systemd/users/0
15415  systemd-hostnam    -1   2 /etc/machine-info
15414  pool               -1   2 /home/tecmint/.hidden
15414  pool               -1   2 /home/tecmint/Binary/.hidden
2599   dconf-service      -1   2 /run/user/1000/dconf/user
...

ติดตามฟังก์ชันกระบวนการเฉพาะ

ตัวอย่างสุดท้ายด้านล่างสาธิตวิธีการดำเนินการติดตามแบบกำหนดเอง เรากำลังติดตามกระบวนการหนึ่งๆ โดยใช้ PID ของมัน

การอ่านที่แนะนำ: Netdata – เครื่องมือตรวจสอบประสิทธิภาพแบบเรียลไทม์สำหรับ Linux

ขั้นแรกให้กำหนด ID กระบวนการ:

$ pidof firefox

15437

หลังจากนั้น ให้เรียกใช้คำสั่ง trace ที่กำหนดเอง ในคำสั่งด้านล่าง: -p ระบุ ID กระบวนการ do_sys_open() คือฟังก์ชันเคอร์เนลที่มีการติดตามแบบไดนามิก รวมถึงอาร์กิวเมนต์ที่สองเป็นสตริง

$ sudo ./trace -p 4095 'do_sys_open "%s", arg2'

TIME     PID    COMM         FUNC             -
12:17:14 15437  firefox      do_sys_open      /run/user/1000/dconf/user
12:17:14 15437  firefox      do_sys_open      /home/tecmint/.config/dconf/user
12:18:07 15437  firefox      do_sys_open      /run/user/1000/dconf/user
12:18:07 15437  firefox      do_sys_open      /home/tecmint/.config/dconf/user
12:18:13 15437  firefox      do_sys_open      /sys/devices/system/cpu/present
12:18:13 15437  firefox      do_sys_open      /dev/urandom
12:18:13 15437  firefox      do_sys_open      /dev/urandom
12:18:14 15437  firefox      do_sys_open      /usr/share/fonts/truetype/liberation/LiberationSans-Italic.ttf
12:18:14 15437  firefox      do_sys_open      /usr/share/fonts/truetype/liberation/LiberationSans-Italic.ttf
12:18:14 15437  firefox      do_sys_open      /usr/share/fonts/truetype/liberation/LiberationSans-Italic.ttf
12:18:14 15437  firefox      do_sys_open      /sys/devices/system/cpu/present
12:18:14 15437  firefox      do_sys_open      /dev/urandom
12:18:14 15437  firefox      do_sys_open      /dev/urandom
12:18:14 15437  firefox      do_sys_open      /dev/urandom
12:18:14 15437  firefox      do_sys_open      /dev/urandom
12:18:15 15437  firefox      do_sys_open      /sys/devices/system/cpu/present
12:18:15 15437  firefox      do_sys_open      /dev/urandom
12:18:15 15437  firefox      do_sys_open      /dev/urandom
12:18:15 15437  firefox      do_sys_open      /sys/devices/system/cpu/present
12:18:15 15437  firefox      do_sys_open      /dev/urandom
12:18:15 15437  firefox      do_sys_open      /dev/urandom
....

สรุป

BCC เป็นชุดเครื่องมือที่ทรงพลังและใช้งานง่ายสำหรับงานการดูแลระบบต่างๆ เช่น การตรวจสอบประสิทธิภาพของระบบการติดตาม, I/O อุปกรณ์บล็อกการติดตาม, ฟังก์ชัน TCP, การทำงานของระบบไฟล์, syscalls, โพรบ Node.js และอีกมากมาย ที่สำคัญ มันมาพร้อมกับไฟล์ตัวอย่างและหน้าคู่มือหลายไฟล์สำหรับเครื่องมือที่จะแนะนำคุณ ทำให้ผู้ใช้เป็นมิตรและเชื่อถือได้

สุดท้ายแต่ไม่ท้ายสุด คุณสามารถกลับมาหาเราโดยแบ่งปันความคิดของคุณเกี่ยวกับหัวข้อนี้ ถามคำถาม ให้คำแนะนำที่เป็นประโยชน์ หรือข้อเสนอแนะที่สร้างสรรค์ผ่านทางส่วนความคิดเห็นด้านล่าง

สำหรับข้อมูลเพิ่มเติมและการเข้าชมการใช้งาน: https://iovisor.github.io/bcc/