ืืืื ืืงืก ืืฉ ืืกืคืจ ืจื ืฉื ืืืื ืื ืืคืื ืืืืื ืืงืจื ื ืืืืคืืืงืฆืืืช. ืืจืืื ืืฉ ืืฉืคืขื ืฉืืืืืช ืขื ืืืฆืืขื ืืืคืืืงืฆืื ืืื ื ืืชื ืืืฉืชืืฉ ืืื ืืืืฆืืจ.
ืืคื ื ืฉื ืชืืื ืืื
ืืฉ ืืืจ ืืจืื ืืื ืขืืจ ืืืคืืืงืฆืืืช ืฉืืฉืชืืฉืืช ื-eBPF, ืืืืืืจ ืื ื ืืื ืืืฆื ืืืชืื ืืช ืืื ืืคืจืืคืื ืฉืื ืขื ืกืื ืืกืคืจืืื
Ceph ืืื ืืืื
ืืืจื ืืืฉ ื ืืกืฃ ืืืฉืืื Ceph. ืืืืจ ืืขืืจืช ืืืง ืืื ืชืื ืื ืืืื, ืฉืื ื ืื ืฉืืืืจืืช ืขืืืื ืืงืฉืืช ืืืชืืื ืขื ืืื ื ืืืื ืืืจืื ืืืฉืจ ืืฉืจืชืื ืืืจืื.
ืื ืืืื ืืคืืืคืืจืืืช ืืืจืืช, ืืืจื ืื ืืฉืชืืฉ ื-bcache ืืืงืจื ื ืืืืฉ ืฉื ืืื ืืงืก 4.15. ืื ืืืืชื ืืคืขื ืืจืืฉืื ื ืฉืื ื ืขืฉื ืฉืืืืฉ ืืืืจื ืฉื ืชืฆืืจื ืื. ืืืืืชื ืจืืข ืืื ืืจืืจ ืฉืฉืืจืฉ ืืืขืื ืืืื ืืืืืช ืชืืืืจืืืช ืื ืืืจ.
ืืืงืจืช ืืช ืืืืจื
ื ืชืืื ืืืกืชืืืืช ืขื ืื ืฉืงืืจื ืืชืื ืชืืืื ื-ceph-osd. ืืฉื ืื ื ืฉืชืืฉ
ืืชืืื ื ืืืืจืช ืื ื ืฉืืคืื ืงืฆืื fdatasync() ืืฉืงืืข ืืื ืจื ืืฉืืืืช ืืงืฉื ืืคืื ืงืฆืืืช generic_make_request(). ืื ืืืืจ ืฉืืื ืื ืจืื ืืกืืื ืืืขืืืช ืืื ืืืคืฉืื ืืืืฅ ืืืืื ื-OSD ืขืฆืื. ืื ืืืื ืืืืืช ืืงืจื ื ืื ืืืืกืงืื. ืคืื ื-iostat ืืจืื ืืืืื ืืืื ืืขืืืื ืืงืฉืืช ืขื ืืื ืืืกืงื bcache.
ืืฉืืืงื ื ืืช ืืืืจื, ืืืืื ื ืฉืืืืื systemd-udevd ืฆืืจื ืืืืช ืืืืื ืฉื ืืื CPU - ื-20% ืืืกืคืจ ืืืืืช. ืื ืืชื ืืืืช ืืืืจื, ืื ืืชื ืฆืจืื ืืืจืจ ืืื. ืืื Systemd-udevd ืขืืื ืขื uevents, ืืืืื ื ืืืกืชืื ืขืืืื ืฆื udevadm. ืืกืชืืจ ืฉื ืืฆืจื ืืกืคืจ ืจื ืฉื ืืืจืืขื ืฉืื ืื ืขืืืจ ืื ืืชืงื ืืืืง ืืืขืจืืช. ืื ืื ืืจืื, ืื ื ืฆืืจื ืืืกืชืื ืื ืืืืื ืืช ืื ืืืืจืืขืื ืืืื.
ืฉืืืืฉ ืืขืจืืช ืืืืื ืฉื BCC
ืืคื ืฉืืืจ ืืืืื ื, ืืงืจื ื (ืืืืืื ื-ceph ืืงืจืืืช ืืืขืจืืช) ืืืื ืืื ืจื ื generic_make_request(). ืืืื ื ื ืกื ืืืืื ืืช ืืืืืจืืช ืฉื ืคืื ืงืฆืื ืื. IN
ืชืืื ื ืื ืคืืขืืช ืืืจื ืืื ืืืืืจืืช. ืื ืื ืฉืืื ืขืืฉื ืืื ืืืขืืืจ ืืช ืืืงืฉื ืืชืืจ ืื ืื ืืืชืงื.
Bcache ืืื ืืืฉืืจ ืืืจืื ืืืืจืื ืืืขืฉื ืืฉืืืฉื ืืืกืงืื:
- ืืชืงื ืืืืื (ืืืกืง ืฉืืืจ), ืืืงืจื ืื ืืืืืจ ื-HDD ืืืื;
- ืืชืงื ืืืืื (ืืืกืง ืืืืื), ืืื ืืืื ืืืืฆื ืืืช ืฉื ืืชืงื NVMe;
- ืืืืฉืืจ ืืืืจืืืืื bcache ืฉืืืชื ืืืคืืืงืฆืื ืคืืขืืช.
ืื ืื ื ืืืืขืื ืฉืืขืืจืช ืืืงืฉืืช ืืืืืช, ืืื ืขืืืจ ืืืื ืืืืืฉืืจืื ืืืื? ื ืขืกืืง ืืื ืงืฆืช ืืืืืจ ืืืชืจ.
ืืขืช ืื ื ืืืืขืื ืฉืืืจืืขืื ืขืฉืืืื ืืืจืื ืืืขืืืช. ืืืฆืื ืื ืืืืืง ืืืจื ืืืืจ ืฉืืื ืื ืื ืื ืงื. ืืืื ื ื ืื ืฉืืืืืจ ืืชืืื ื ืืืฉืื ืฉืืืฉืงืช ืืื ืคืขื. ืืื ื ืจืื ืืืื ืกืื ืฉื ืชืืื ื ืคืืขืืช ืขื ืืืขืจืืช ืืืืฆืขืืช ืกืงืจืืคื execsnoop ืืืืชื ืืืจ
ืืืฉื ืืื:
/usr/share/bcc/tools/execsnoop | tee ./execdump
ืื ื ืฆืื ืืื ืืช ืืคืื ืืืื ืฉื execsnoop, ืืื ืฉืืจื ืืืช ืฉืืขื ืืื ืช ืืืชื ื ื ืจืืชื ืื:
sh 1764905 5802 0 sudo arcconf getconfig 1 AD | grep Temperature | awk -F '[:/]' '{print $2}' | sed 's/^ ([0-9]*) C.*/1/'
ืืขืืืื ืืฉืืืฉืืช ืืื ื-PPID (PID ืืื) ืฉื ืืชืืืื. ืืชืืืื ืขื PID 5802 ืืชืืจืจ ืืืื ืืืืืืื ืฉื ืืขืจืืช ืื ืืืืจ ืฉืื ื. ืืขืช ืืืืงืช ืืชืฆืืจื ืฉื ืืขืจืืช ืื ืืืืจ, ื ืืฆืื ืคืจืืืจืื ืฉืืืืื. ืืืืคืจืืืจื ืฉื ืืชืื HBA ื ืืงืื ืื 30 ืฉื ืืืช, ืืื ืืจืื ืืืชืจ ืืื ืืจืฉ. ืืืืจ ืฉืื ืื ืืจืืื ืืืืืงื ืืืืื ืืจืื ืืืชืจ, ืืืืื ื ืฉืืื ืขืืืื ืืืงืฉืืช ืืืืจื ืื ืืืจ ืื ืืื ืืืฉืืืื ืืืืจืืื ืืืจืื.
ืืื ืขืืืื ืื ืืจืืจ ืืืืข ืืืฉืืจ ื-bcache ืืื ืื ืื ืืืื. ืืื ื ืคืืืคืืจืืช ืืืืงื ืขื ืชืฆืืจื ืืื ืื ืืกืื ื ืืฉืืืจ ืืช ืืืขืื ืขื ืืื ืืคืขืืช fio ืขื bcache, ืืคืขืืช udevadm ืืจืืืจ ืืขืช ืืขืช ืืืฆืืจืช uevents.
ืืชืืืช ืืืื ืืืืกืกื BCC
ืืืื ื ื ืกื ืืืชืื ืืื ืขืืจ ืคืฉืื ืืืขืงื ืืืฆืื ืฉื ืืฉืืืืช ืืืืืืืช ืืืืชืจ generic_make_request(). ืื ื ืืชืขื ืืื ืื ืื ืืฉื ืืืื ื ืฉืขืืืจื ื ืงืจืื ืคืื ืงืฆืื ืื.
ืืชืืื ืืช ืคืฉืืื:
- ืืืจืฉื kprobe ืขื generic_make_request():
- ืื ื ืฉืืืจืื ืืช ืฉื ืืืืกืง ืืืืืจืื, ื ืืืฉ ืืจื ืืจืืืื ื ืืคืื ืงืฆืื;
- ืื ืื ื ืฉืืืจืื ืืช ืืืชืืช ืืืื.
- ืืืจืฉื kretprobe ืืืืืจื ื generic_make_request():
- ืื ื ืืงืืืื ืืช ืืืชืืช ืืืื ืื ืืืืืช;
- ืื ื ืืืคืฉืื ืืช ืืืชืืช ืืืื ืืฉืืืจื ืืืฉืืืื ืืืชื ืืื ืื ืืืืืช;
- ืื ืืชืืฆืื ืืืืื ืืืชืืฆืื ืฉืฆืืื ื, ืื ื ืืืฆืืื ืืช ืฉื ืืืืกืง ืืฉืืืจ ืืืฆืืืื ืืืชื ืืืกืืฃ.
Kprobes ะธ kretprobes ืืฉืชืืฉ ืืื ืื ืื ื ืงืืืช ืฉืืืจื ืืื ืืฉื ืืช ืืช ืงืื ืืคืื ืงืฆืื ืชืื ืืื ืชื ืืขื. ืืชื ืืืื ืืงืจืื
ืืงืกื eBPF ืืชืื ืกืงืจืืคื python ื ืจืื ืื:
bpf_text = โโโ # Here will be the bpf program code โโโ
ืืื ืืืืืืฃ ื ืชืื ืื ืืื ืคืื ืงืฆืืืช, ืชืืื ืืืช eBPF ืืฉืชืืฉืืช
struct data_t {
u64 pid;
u64 ts;
char comm[TASK_COMM_LEN];
u64 lat;
char disk[DISK_NAME_LEN];
};
BPF_HASH(p, u64, struct data_t);
BPF_PERF_OUTPUT(events);
ืืื ืื ื ืจืืฉืืื ืืืืช ืืืืื ืืฉื p, ืขื ืกืื ืืคืชื u64 ืืขืจื ืฉื ืกืื struct data_t. ืืืืื ืชืืื ืืืื ื ืืืงืฉืจ ืฉื ืชืืื ืืช ื-BPF ืฉืื ื. ืืืืงืจื BPF_PERF_OUTPUT ืจืืฉื ืืืื ื ืืกืคืช ืฉื ืงืจืืช ืืืจืืขืื, ืืฉืจ ืืฉืืฉ ืขืืืจ
ืืืฉืจ ืืืืืื ืขืืืืืื ืืื ืงืจืืื ืืคืื ืงืฆืื ืืืืจื ืืื ื, ืื ืืื ืงืจืืืืช ืืคืื ืงืฆืืืช ืฉืื ืืช, ืฆืจืื ืืงืืช ืืืฉืืื ืฉืื ืชืื ืื ืืืชืงืืืื ืืืืืื ืืืืืช ืฉืืืืื ืืืืชื ืืงืฉืจ. ืืืืืื ืืืจืืช, ืขืืื ืืืืืจ ืืช ืืืฉืงื ืืืงืืืื ืืืคืฉืจืืช ืฉื ืคืื ืงืฆืืืช. ืืฉ ืื ื ืืช ืืืืืืช ืืืืื ืืช ืืืฉืืื ืืื ืงืจืืื ืืคืื ืงืฆืื ืืืงืฉืจ ืฉื ืชืืืื ืืื ืืืื ืืืจื ืืืืชื ืคืื ืงืฆืื ืืืงืฉืจ ืฉื ืชืืืื ืืืจ, ืืื ืื ืื ืจืื ืืกืจ ืชืืขืืช. ืืืืื ืืืื ืืื ืชืืื
ืืืืจ ืืื, ืขืืื ื ืืืชืื ืืช ืืงืื ืฉืืคืขื ืืืฉืจ ืืคืื ืงืฆืื ืื ืืงืจืช ื ืงืจืืช:
void start(struct pt_regs *ctx, struct bio *bio) {
u64 pid = bpf_get_current_pid_tgid();
struct data_t data = {};
u64 ts = bpf_ktime_get_ns();
data.pid = pid;
data.ts = ts;
bpf_probe_read_str(&data.disk, sizeof(data.disk), (void*)bio->bi_disk->disk_name);
p.update(&pid, &data);
}
ืืื ืืืจืืืื ื ืืจืืฉืื ืฉื ืืคืื ืงืฆืื ืื ืงืจืืช ืืืืืฃ ืืืจืืืื ื ืืฉื ื
ืืคืื ืงืฆืื ืืืื ืชืืงืจื ืืืืจื ื generic_make_request():
void stop(struct pt_regs *ctx) {
u64 pid = bpf_get_current_pid_tgid();
u64 ts = bpf_ktime_get_ns();
struct data_t* data = p.lookup(&pid);
if (data != 0 && data->ts > 0) {
bpf_get_current_comm(&data->comm, sizeof(data->comm));
data->lat = (ts - data->ts)/1000;
if (data->lat > MIN_US) {
FACTOR
data->pid >>= 32;
events.perf_submit(ctx, data, sizeof(struct data_t));
}
p.delete(&pid);
}
}
ืคืื ืงืฆืื ืื ืืืื ืืงืืืืชื: ืื ื ืืืืื ืืช ื-PID ืฉื ืืชืืืื ืืืช ืืืชืืช ืืืื, ืื ืื ืืงืฆืื ืืืืจืื ืืืื ื ืื ืชืื ืื ืืืืฉ. ืืืงืื ืืืช, ืื ื ืืืคืฉืื ืืืืืช ื-hash ืืื ื ืฉืืืจ ืงืืื ืืืืฆืขืืช ืืืคืชื == PID ืื ืืืื. ืื ืืืื ื ื ืืฆื, ืื ื ืืืืื ืืช ืฉื ืืชืืืื ืืคืืขื ืืืืกืืคืื ืืืชื ืืืื.
ืืืขืืจื ืืืื ืืจืืช ืฉืื ืื ื ืืฉืชืืฉืื ืืื ื ืืืฆื ืืื ืืงืื ืืช ื-GID ืฉื ืืฉืจืฉืืจ. ืึธืึตื. PID ืฉื ืืชืืืื ืืจืืฉื ืฉืืชืืื ืืช ืืฉืจืฉืืจ ืืืงืฉืจ ืืืื ืื ื ืขืืืืื. ืืคืื ืงืฆืื ืฉืื ื ืงืืจืืื ืื
ืืฉืืืฆืืื ืืืจืืื ื, ืื ืื ื ืื ืืขืื ืืื ืื ืืจืืข ืืืจื, ืืื ืื ืื ื ืืขืื ืืื ืื ืืชืืืื ืืจืืฉื. ืืืืจ ืืฉืืืืช ืืขืืืื ืฉื ืืฆืจ ืขื ืกืฃ ื ืชืื, ืื ื ืขืืืจืื ืืช ืืืื ื ืฉืื ื ื ืชืื ืื ืืชืื ืฉืื ืืืฉืชืืฉ ืืืืฆืขืืช ืืืื ืืืจืืขืื, ืืืืืจ ืืื ืื ื ืืืืงืื ืืช ืืขืจื ื p.
ืืกืงืจืืคื python ืฉืืืขื ืืช ืืงืื ืืื, ืขืืื ื ืืืืืืฃ ืืช MIN_US ืืืช FACTOR ืืกืคื ืืืฉืืื ืืืืืืืช ืืืื, ืืืชื ื ืขืืืจ ืืจื ืืืจืืืื ืืื:
bpf_text = bpf_text.replace('MIN_US',str(min_usec))
if args.milliseconds:
bpf_text = bpf_text.replace('FACTOR','data->lat /= 1000;')
label = "msec"
else:
bpf_text = bpf_text.replace('FACTOR','')
label = "usec"
ืืขืช ืขืืื ื ืืืืื ืืช ืชืืื ืืช BPF ืืืืฆืขืืช
b = BPF(text=bpf_text)
b.attach_kprobe(event="generic_make_request",fn_name="start")
b.attach_kretprobe(event="generic_make_request",fn_name="stop")
ื ืฆืืจื ืื ืืงืืืข struct data_t ืืชืกืจืื ืฉืื ื, ืืืจืช ืื ื ืืื ืืงืจืื ืืืื:
TASK_COMM_LEN = 16 # linux/sched.h
DISK_NAME_LEN = 32 # linux/genhd.h
class Data(ct.Structure):
_fields_ = [("pid", ct.c_ulonglong),
("ts", ct.c_ulonglong),
("comm", ct.c_char * TASK_COMM_LEN),
("lat", ct.c_ulonglong),
("disk",ct.c_char * DISK_NAME_LEN)]
ืืฉืื ืืืืจืื ืืื ืคืื ื ืชืื ืื ืืืกืืฃ:
def print_event(cpu, data, size):
global start
event = ct.cast(data, ct.POINTER(Data)).contents
if start == 0:
start = event.ts
time_s = (float(event.ts - start)) / 1000000000
print("%-18.9f %-16s %-6d %-1s %s %s" % (time_s, event.comm, event.pid, event.lat, label, event.disk))
b["events"].open_perf_buffer(print_event)
# format output
start = 0
while 1:
try:
b.perf_buffer_poll()
except KeyboardInterrupt:
exit()
ืืชืกืจืื ืขืฆืื ืืืื ื
ืกืืฃ ืื ืกืืฃ! ืืขืช ืื ื ืจืืืื ืฉืื ืฉื ืจืื ืืื ืืืฉืืจ bcache ื ืชืงืข ืืื ืืืขืฉื ืฉืืืช ื ืชืงืข generic_make_request() ืขืืืจ ืืืกืง ืฉืืืจ.
ืืคืจื ืืชืื ืืืจืขืื
ืื ืืืืืง ืืื ืืืืื ืฉืืืืจ ืืืงืฉื? ืื ื ืจืืืื ืฉืืขืืืื ืืชืจืืฉ ืขืื ืืคื ื ืชืืืืช ืืฉืืื ืืืช ืืืงืฉื, ืืืืืจ. ืขืืืื ืื ืืื ื ืืืื ืืฉืืื ืืืช ืฉื ืืงืฉื ืกืคืฆืืคืืช ืืคืื ื ืืกืฃ ืฉื ืกืืืืกืืืงืืช ืขืืื (/proc/diskstats ืื iostat). ื ืืชื ืืืืช ืืืช ืืงืืืช ืขื ืืื ืืคืขืืช iostat ืชืื ืืื ืฉืืืืจ ืืืขืื, ืื
ืื ื ืกืชืื ืขื ืืคืื ืงืฆืื generic_make_request(), ืื ื ืจืื ืฉืืคื ื ืชืืืืช ื ืืืื ืืืงืฉืืช, ื ืงืจืืืช ืฉืชื ืคืื ืงืฆืืืช ื ืืกืคืืช. ืจืืฉืื - generic_make_request_checks(), ืืืฆืข ืืืืงืืช ืฉื ืืืงืืืช ืืืงืฉื ืืืื ืืืืจืืช ืืืืกืง. ืฉื ืืช -
ret = wait_event_interruptible(q->mq_freeze_wq,
(atomic_read(&q->mq_freeze_depth) == 0 &&
(preempt || !blk_queue_preempt_only(q))) ||
blk_queue_dying(q));
ืื, ืืงืจื ื ืืืชืื ืืคืชืืืช ืืชืืจ. ืืืื ื ืืืื ืืช ืืืฉืืื blk_queue_enter():
~# /usr/share/bcc/tools/funclatency blk_queue_enter -i 1 -m
Tracing 1 functions for "blk_queue_enter"... Hit Ctrl-C to end.
msecs : count distribution
0 -> 1 : 341 |****************************************|
msecs : count distribution
0 -> 1 : 316 |****************************************|
msecs : count distribution
0 -> 1 : 255 |****************************************|
2 -> 3 : 0 | |
4 -> 7 : 0 | |
8 -> 15 : 1 | |
ื ืจืื ืฉืื ืื ื ืงืจืืืื ืืคืชืจืื. ืืคืื ืงืฆืืืช ืืืฉืืฉืืช ืืืงืคืื/ืืืืื ืืงืคืืช ืชืืจ ืื
ืืืื ืฉืืืงื ืื ืงืืช ืชืืจ ืื ืฉืืื ืขืจื ืืืฉืืืื ืืืืกืง ืืืืืื ืฉืืงืจื ื ืืืชืื ืืกืืื ืื ืืคืขืืืืช ืืชืืจ. ืืจืืข ืฉืืชืืจ ืจืืง, ืืฉืื ืืืื ืืืืืจืืช ืืืืื. ืืืจืื ืื ื ืงืจื
ืขืืฉืื ืื ืื ื ืืืืขืื ืืกืคืืง ืืื ืืชืงื ืืช ืืืฆื. ืืคืงืืื udevadm trigger ืืืจืืช ืืืืืช ืืืืืจืืช ืฉื ืืชืงื ืืืกืืื. ืืืืจืืช ืืื ืืชืืืจืืช ืืืืื udev. ืื ื ืืืืืื ืืืฆืื ืืืื ืืืืจืืช ืืงืคืืืืช ืืช ืืชืืจ ืขื ืืื ื ืืกืืื ืืฉื ืืช ืืืชื ืืืืฆืขืืช sysfs ืื ืขื ืืื ืืกืชืืืืช ืืงืื ืืืงืืจ ืฉื ืืืืื. ืื ืื ื ืืืืืื ืื ืื ืกืืช ืืช ืืื ืืฉืืจืืช BCC
~# /usr/share/bcc/tools/trace blk_freeze_queue -K -U
PID TID COMM FUNC
3809642 3809642 systemd-udevd blk_freeze_queue
blk_freeze_queue+0x1 [kernel]
elevator_switch+0x29 [kernel]
elv_iosched_store+0x197 [kernel]
queue_attr_store+0x5c [kernel]
sysfs_kf_write+0x3c [kernel]
kernfs_fop_write+0x125 [kernel]
__vfs_write+0x1b [kernel]
vfs_write+0xb8 [kernel]
sys_write+0x55 [kernel]
do_syscall_64+0x73 [kernel]
entry_SYSCALL_64_after_hwframe+0x3d [kernel]
__write_nocancel+0x7 [libc-2.23.so]
[unknown]
3809631 3809631 systemd-udevd blk_freeze_queue
blk_freeze_queue+0x1 [kernel]
queue_requests_store+0xb6 [kernel]
queue_attr_store+0x5c [kernel]
sysfs_kf_write+0x3c [kernel]
kernfs_fop_write+0x125 [kernel]
__vfs_write+0x1b [kernel]
vfs_write+0xb8 [kernel]
sys_write+0x55 [kernel]
do_syscall_64+0x73 [kernel]
entry_SYSCALL_64_after_hwframe+0x3d [kernel]
__write_nocancel+0x7 [libc-2.23.so]
[unknown]
ืืืงื Udev ืืฉืชื ืื ืืขืืชืื ืจืืืงืืช ืืืืจื ืืื ืื ืงืืจื ืืฆืืจื ืืืืงืจืช. ืื ืื ืื ื ืจืืืื ืฉืืคืืื ืืืฉืื ืืขืจืืื ืฉืืืจ ืืืืืจืื ืืืจื ืืขืืืื ืืขืืืื ืืืขืืจืช ืืืงืฉื ืืืืคืืืงืฆืื ืืืืกืง. ืืืืื, ืืฆืืจืช ืืืจืืขื udev ืืืฉืจ ืืื ืฉืื ืืืื ืืชืฆืืจืช ืืืืกืง (ืืืืืื, ืืืชืงื ืืื ื ืืืชืงื/ืื ืืชืง) ืืื ื ื ืืื ืืื. ืขื ืืืช, ืื ื ืืืืืื ืืขืืืจ ืืงืจื ื ืื ืืขืฉืืช ืขืืืื ืืืืชืจืช ืืืืงืคืื ืืช ืชืืจ ืืืงืฉืืช ืื ืืื ืฆืืจื ืืื.
ืกืืืื
eBPF ืืื ืืื ืืืื ืืืืฉ ืืืืง. ืืืืืจ ืืกืชืืื ื ืขื ืืงืจื ืืขืฉื ืืื ืืืืืื ื ืืืง ืงืื ืืื ืฉื ืืชื ืืขืฉืืช. ืื ืืชื ืืขืื ืืื ืืคืืชืื ืืื BCC, ืฉืืื ืืืกืชืื ืขืืืื
ืืฉื ื ืืื ื ืืคืื ืืืืื ืืคืจืืคืืืื ืืขื ืืื ืื ื ืืกืคืื ืืืืืกืกืื ืขื eBPF. ืืื ืืื -
ืืงืืจ: www.habr.com