ααΈαα»α
ααΆαα§ααααααα½αα
ααα½ααααααααΆααααααΆααααα α»αααΊααα αα·ααααααα·ααΈα αα½αααΆααΆαα
αααΎαααΆααααααααΆααα’αα·αααααΆαααΎααΆαα’αα»αααααααααα·ααΈ αα·ααα·αα’αΆα
ααααΎααααΆαααααα»αααα·αααααααΆαααα
ααΈαααΈααααΆααα»αααΆα
ααΆαα§αααααααααΎααααΆαααααααα·ααΈααΆα
αααΎααα½α
α αΎααααααααΎ eBPF α αΎααα
αααα»αα’ααααααααααΎαααΉααα·αα·αααααΎααααααααααα§αααααααααΎααααΆααααααααααααΆαααααα½αααααα’ααααααααα’ααααΎαααααΆαααα
Ceph ααΊααΊα
αααΆαααΈαααααΈααααΌαααΆααααααααα αααα»α Ceph α αααααΆααααΈααααααα·αααααααα½αα ααα½ααα ααΆ ααΎαααααααααΎαααΆααααΏαααααααΎαααΆαααΆααααααααααΎαααααΆααΆαααΆααααΆαααΈαααααααααααα
αα·αααΌα
αααα·ααΆαααααααααα αααΆαααΈααααααΆαααααΎ bcache αα·αααΊααα linux 4.15 ααααΈα αααααΆααΎαααααΌαααααααΆαααΈαααααΆαααααααα
ααΆαααααααααααααααΌαααΆαααααΎαα
ααΈαααα α αΎααα
αααααα ααΆα
αααΆααααΆααααΆα«αααααααααα αΆα’αΆα
ααΆααααΉααααΈα
ααΆααααΎαα’αααααααα αΆαααααα
α
αΌαα
αΆααααααΎααααααΎαα’αααΈαααααΎαα‘αΎααα
αααα»αααααΎαααΆα ceph-osd α αααααΆααααΏααααααΎαααΉαααααΎ
ααΌαααΆαααααΆααααΎαααΆαα»αααΆα fdatasync() α
αααΆααααα
αααΎααααα»αααΆαααααΎααααΎαα
ααΆαααα»αααΆα generic_make_request(). αααααΆααααααΆααΆαα
αααΎαααααααΆααΌαα ααα»αααααα αΆααΊαα
ααααααααΆαα½ααα
ααΆααααα
osd daemon αααα½αααΆααααΆααα αααα’αΆα
ααΆααΊααα α¬ααΆαα αα·ααααα iostat ααΆααααα αΆαααΈααΆαααΊααααΆαααααααααα»αααααΎαααΆαααααΎαααααΆα bcache α
αα ααααα·αα·αααααΎααααΆαααΈαααΎαααΆαααααΎαααΆαααα·α systemd-udevd ααααΎααααΆαααααααααΆαααΈααΈααΌα αααΎα - αααα αα 20% αα ααΎααααΌαααΆα αααΎαα αααβααΆβα’αΆαααααα·αα·ααΆβα ααααα ααΌα ααααβα’αααβααααΌαβαααααβααβααΌαα ααα»α αααααΆα Systemd-udevd ααααΎααΆαααΆαα½α uevents ααΎαααΆααααααα α α·αααααΎααα½αααΆααΆαααα αααΌααΈααα udevadm. ααΆααααααΆαα½αα ααα½αααααααααΉαααα·ααΆαααααααΆααααααΌαααααΌαααΆααααααΎαα‘αΎααααααΆααα§ααααααααα»αααΈαα½αααα αααα»αααααααααα αααβααΊβααΆβααΏαβαα·αβααααααΆ ααΌα ααααβααΎαβααΉαβααααΌαβαα·αα·αααβααΎαβα’αααΈβαααβαααααΎαβααααΉαααα·ααΆαααβααΆααβα’ααβαααα
ααΆαααααΎααααΆαα BCC Toolkit
ααΌα
αααααΎαααΆαααααΎααα½α
α αΎα ααΊααα (αα·α ceph daemon αααα»αααΆαα α
αααααααα) α
αααΆααααα
αααΎααααα»α 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 trigger ααΆαααααΆααααΎααααΈαααααΎα uevents α
ααΆααααααα§αααααααα’ααααΎ BCC
αααααααΆααΆααααααα§αααααααααΎααααΆααααΆαααααα½αααΎααααΈααΆαααΆα αα·ααααα αΆαααΆαα α ααΌαααααααΊααααα»αα generic_make_request(). ααΎαααα αΆααα’αΆααααααααΎααααααααα drive ααααα»αααΆααααααααΌαααΆαααα α ααΆα
αααααΆαααΊααΆααααα
- α
α»αααααα 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);
αα
ααΈαααααΎαα
α»ααααααααΆααΆα hash αααα α
ααΆ pααΆαα½αααΉααααααααααααΉα u64 αα·αααααααααααααα αα
ααΆαααααααα 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")
ααΎαααααΉαααααΌαααααααααααα αα ααΆαααααααα 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 αααααΆαα±ααααΆαααααααααααΆααα§ααααααααααααΆααααααΌαααΆαα’αα»ααααα ααΆααααααααΆαααααααααΌαααΆααα·αααααΆαα
αααα»αα
αααΆαα 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