ááááľ á¨áááá áĽá á áááŹá˝áá˝á ááá¨á áĽá ááłáŞáŤáá˝ á ááľá˘ á áĽááááš á áá°áá áŞáŤ á áááá áá á ááłá á°á
áĽá á áá¸á áĽá á áááľ ááľáĽ áĽá
á áá ááá á áá˝áá.
á¨áĽááľ á ááłáľ á ááľ áá á
eBPF á á¨áá áá áĽá á¨áá°áá áŞáŤ áááááŤáá˝ á á ᣠáĽá á áá
á˝áá ááľáĽ á á¤á°-áá˝áááľ áá á áááľá¨áľ á¨áŤáľáá á¨ááá፠áááá፠áĽáá´áľ áĽáá°áá˝á áĽáááá¨áłáá
á´á áááá ááá˘
á á˛áľ á áľá°ááá áá° á´á áááľá°á áłáááᢠá ááłááľ áá¨ááá˝á áá° áĽáą á¨á°áááá á ááᣠá áą á¨áá°á¨á á¨á˝áá áĽáŤááá˝á á¨áááááľ ááĽááľ á¨ááá˝ á ááááŽá˝ á áŁá áŤáá° áááá á áľá°ááááá˘
á¨ááá˝ á¨ááŁáŞáŤ áľáááśá˝ á á°áᨠáá
á áľá°ááá
bcache áĽá á á˛áąá ááááľ 4.15 á¨ááá á°á á
ááᢠá¨áá
áá
á á áľá°ááá
áĽáá
áĽá
á áá á˛áá áá
á¨ááááŞáŤá ááᢠáĽáá á ááŤá áá á¨á˝áአáááľá¤ á ááľá ááłáĽ ááááá ááá áĽáá°áá˝á ááá˝ áá á.
á áľá°áááá ááááá
á ceph-osd áá°áľ ááľáĽ áá áĽáá°ááá á á áááá¨áľ áĽááááᢠááá
áĽáá áááá
áľáá á°ááŁáŠá áááá¨áá fdatasync() áá° á°ááŁáŤáľ áĽáŤá á ááá áĽá áá á áłáááá á á ááá_á¨áĽáŤá_áĽáŤá(). áá
áááľ á¨á˝ááŽáš áááľá¤ ááááŁáľ á¨áŤáą osd á´áá á᪠á¨áá áŚáł ááᢠáá
á¨ááá ááá á˛áľáŽá˝ ááá áá˝áá. á¨iostat áá
ááľ á bcache á˛áľáŽá˝ áĽáŤááá˝á á ááľá°áááľ á¨ááľ á¨áá°á áááá¨áľ á áłááˇáá˘
á áľá°áááá áľáááľá˝ á˛áľá°ááľ-áĄáľáŞáľ á´áá á¨áá°á áá á áŤáá á˛áአáá áĽáá°áááľáľ á°áá°áá áłá - 20% áá°á á á ááŤáł áŽáŽá˝á˘ áá áĽáááł áŁá ᪠áá, áľááá ááá áĽáá°áá ááá áŤáľáááááłá. Systemd-udevd ᨠuevents áá áľááá°áŤáŁ áĽááąá ááá¨áľ áá°ááᢠudevadm ááłáŤ. á áľáááą ááľáĽ ááá áĽáŤááłááą á¨ááá ááłáŞáŤ áĽá ááĽá áŤáá¸á á¨ááἠááľá°áśá˝ ááá áŠá áááá á°á˝ááᢠáá á áŁá áŤáá°ááá° ááᣠáľááá áĽááá á áá ááľá°áśá˝ á¨ááŤááá¨áá ááá áá¨áľ á ááĽáá˘
BCC Toolkit á áá áá
á áľááľáá áĽááłáá
áá á¨ááá (áĽá á á˛áľá°á áĽáŞ ááľáĽ áŤáá á´á á´áá) áĽá áá áŤáłáááᢠá á ááá_á¨áĽáŤá_áĽáŤá(). á¨áá
á á°ááŁá ááĽááľ ááááŤáľ áĽáááá. ááľáĽ
áá
áŁá
᪠á á áĽááá á ááĽááľ áá°áŤá. á¨ááŤá°ááá áĽáŤááá áá° ááłáŞáŤá ážáá áá¨á ááá áĽáť ááá˘
Bcache áśáľáľ á˛áľáŽá˝á áŤáá ááľáĽáľáĽ ááŁáŞáŤ áá-
- á¨áá áŁá á፠ááłáŞáŤ (á¨á°á¸áá á˛áľá), á áá á ááŁá áááá HDD áá;
- áá¸á፠ááłáŞáŤ (áá¸á፠á˛áľá), áĽáá áá ᨠNVMe ááŁáŞáŤ á ááľ ááá áá;
- á áááŹá˝á á¨áá°áŤá áľ bcache áááŁá ááłáŞáŤá˘
á¨áĽáŤá áľáááą áááá áááá áĽáááááᣠáá á¨áĽááá ááłáŞáŤáá˝ ááľáĽ á¨áľáá áá? áá áá áľáá˝ ááá°á áĽááľá°áááłááá˘
á áá á¨áá¨á°áą ááľá°áśá˝ á˝áá áááĽáŠ áĽáá°áá˝á áĽáááááᢠá áľááá á¨áľáááłá¸á áááľá¤ áá áĽáá°áá áááá á áŁá ááá á áá°áá. áá
á á¨ááá á¨áááá áśááľáá áá áĽáá áĽááľáĽá˘ áľááŞááľ á áá áá á áľáááą áá áá á áááľ áśááľáá áĽáá°áá°áŤ áĽáá á¤áá°áá á¨á°ááłáłá
áááłá áĽáá°áá áĄ-
/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/'
áŚáľá°áá áááľ á¨áá°áą ááá áᲠ(á¨ááá PID) ááᢠᨠPID 5802 áá°áľ á¨ááľáľá áľáááłá˝á ááľáĽ á ááą áá á°áááˇáᢠá¨ááľáľá áľáááąá áá á á˛ááľáš á¨á°áłáłáą áááŞáŤáá˝ á°ááá°áá. ᨠHBA á áľááá áááľ á ᨠ30 á°á¨ááľ á°ááľáˇá, áá á á¨ááŤáľáááá á áá áĽá áá áá. á¨áá°áť ááá°áąá áá° á¨áá áŤá áá á¨áá¨áá á ááᣠá áá á áľá°ááá áá áŤáá á¨áĽáŤá áá°áľ áááá¨áľ á¨ááá˝ á áľá°áááá˝ áá á˛ááłá°á áááś á¨áᣠáá á ááá°ááá˘
ááá áá ᨠbcache ááłáŞáŤá ááá á áŁá áááá áĽáá°áá ᨠá ááá ááá˝ á áá°áá. á°ááłáłá áá á áŤáá á¨áá¨áŤ ááľá¨á á áááá áĽá á bcache áá fio á á ááľáŹáľáŁ á áá á áá udevadm ááľá á´á á ááá á á˝ááŠá áááŁááľ ááá¨ááá˘
BCC áá á¨á°áá°á¨áą ááŁáŞáŤáá˝á ááťá
á áŁá áááá áĽáŞáá˝á ááááá áĽá áááłá¨áľ ááá áááá፠áááťá áĽáááá á á ááá_á¨áĽáŤá_áĽáŤá(). áĽáá˛áá áá á°ááŁá á¨á°á áŤá áľá áľáŤáá áľá áĽááááááá˘
áĽá áą ááá áááĄ-
- ááááᥠkprobe áá á á ááá_á¨áĽáŤá_áĽáŤá():
- á¨á˛áľáá áľá áá° áá á°á¨ áľááľáł áĽááľááá ááá, á á°ááŁáŤá áááá á áŠá á°á°áŤá˝;
- á¨áá áá á°áá áĽááľáááŁáá.
- ááááᥠkretprobe ᨠáááááľ á á ááá_á¨áĽáŤá_áĽáŤá():
- á¨á ááá á¨áá áá á°á áĽááááá;
- á¨á°ááá á¨áá áá á°á áĽáááááá áĽá á áá áŤáá áá áĽáááá áŤáá;
- áá¤áą á¨á°á áá°á á áá á¨áá, á¨ááŤá á¨á°ááá áá á¨á˛áľá áľá áĽááááá áĽá á á°áááá áá áĽááłáŤáá.
Kprobes и kretprobes á á á¨áŤ áá á¨á°ááŁá áŽáľ áááá¨á á¨áááť ááĽáĽ áá´á áá ááᢠááá ἠáľá˝ááá
á python áľááŞááľ ááľáĽ áŤáá á¨á˘á˘áá¤á á˝áá áá á áááľáááĄ-
bpf_text = âââ # Here will be the bpf program code âââ
á á°ááŁáŽá˝ ááŤá¨á ááἠáááááἠá¨á˘á˘áá¤á ááŽááŤáá˝ áá ááá
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 áĽá á áááľ áá ááá
á áááĽ_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);
}
áĽáá
á¨á°á áŤá á°ááŁá á¨ááááŞáŤ áá᪠áĽá´áľ áĽáá° ááá°áá áááá áá°áŤá
á¨áá¨á°áá á°ááŁá á¨á°ááá° á áá áá áŤá á á ááá_á¨áĽáŤá_áĽáŤá():
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 áĽá á¨áá áá á°áá áĽááááá ᣠáá áá á˛áą á¨ááἠááá á áá á°á¨ áľááľáłá á áááľáĄá˘ á ááľáŠáŁ á áá áŤááá ááá == á¨á ááá 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")
ááá°áá á ááĽá ááá á áááĽ_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 ááŁáŞáŤ á¨áááľáá á¨áááá áĽáŞ áááá á áá°áá á á ááá_á¨áĽáŤá_áĽáŤá() áá°á¸áá á˛áľá.
áá° á¨ááá áááŠ
áĽáŤá á áá°áááá áľ áá á áľááá áá áĽá¨áááá áá? áááá¨áą á¨áĽáŤá ááłáĽ á¨áááአá ááľ áĽááłá á˛á¨á°áľ áĽááŤááᣠáááľá. á áĽáą áá (/proc/diskstats ááá iostat) áá áá°á¨á᪠áá
ááľ á¨á ááľ á¨á°áá°á áĽáŤá á¨ááłáĽ á áŤáŤá áá á áá°ááá¨áᢠáá
á ááá á˝ááŠá á ááŁáá áľ áá iostat á á ááľáŹáľ ááá
á°ááŁáŠá á¨á°ááá¨áľá á á ááá_á¨áĽáŤá_áĽáŤá(), á¨ááŤá áĽáŤáá á¨ááłáĽ á áŤáŤá á¨áááአá ááľ áááľ á°á¨á᪠á°ááŁáŤáľ áĽáá°áá አáĽááŤáá. á áá°á - á á ááá_á¨áĽáŤá_áźáŽá˝(), á¨á˛áľá á
áá
áśá˝á á á°ááá¨á° á¨áĽáŤááá áľááááááľ áŤá¨áááŁá. ááá°á -
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_á áľááŁ():
~# /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 ááľá
á´ áľááá á¨ááá ááłáŞáŤá áĽáá˛á°áá á áŤá°áááá. áĽááá
á
ááĽáŽá˝ á udev á°ááŚá˝ ááľáĽ á°ááá¸áá. á sysfs á áŠá ááááἠá ááá¨á ááá á¨á¨ááá ááá áŽáľá á áááá¨áľ á¨áľááš ááźáśá˝ áá¨ááá áĽá¨áááá áĽááłá ááááľ áĽáá˝áááᢠáĽáá˛áá á¨á˘á˛á˛ á áááááľá ááá¨á áĽáá˝ááá
~# /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 ááľá°áśá˝á áááá¨áľ (áááłá, ááłáŞáŤá á áá°á°áŤá / á ááá¨áĽá) áĽáŠ ááááľ á áá°áá. ááá áá á áľáłá á ááľááá áľáŤ áĽááłáá°áŤ áĽá á áľááá áŤááá á¨áĽáŤááá áá¨á áĽáá˛áá ááľá¨á áĽáá˝áááá˘
áá°áá°ááŤ
eBPF á áŁá á°áááá áĽá áááá ááłáŞáŤ áá. á á áááš ááľáĽ á ááľ á°ááŁáŤá ááłá á°áááá°áá áĽá áá ááľá¨á áĽáá°ááťá áľáá˝ ááá á áłáá°áá. á¨BCC áááááŤáá˝á áááłá á ááááľ áŤáá
áááá¨áľ á°áᢠááá˘
á eBPF áá á¨á°áá°á¨áą ááá˝ á áľá°áłá˝ á¨áá¨á áĽá á¨ááá፠ááłáŞáŤáá˝ á áᢠá¨áĽáááą ááŤá¨á á ááą -
ááá: hab.com