Linux ááœáẠkernel ááŸáá·áº á¡ááá®áá±ážááŸááºážáá»á¬ážááᯠá¡ááŸá¬ážááŸá¬ááẠáááááá¬áá»á¬ážá
áœá¬ááŸááááºá áááºážááá¯á·áá²á០á¡áá»á¬ážá
á¯ááẠá¡ááºááá®áá±ážááŸááºážá
áœááºážáá±á¬ááºáááºá¡áá±á«áº á¡áá»ááºááá±á¬áá±á¬ááºáá±á¬ áááºáá±á¬ááºááŸá¯ááŸáááŒá®áž áá¯ááºáá¯ááºáá±ážááœáẠá¡áá¯á¶ážáááŒá¯ááá¯ááºáá«á
ááœááºáá²á·áá²á· ááŸá
áºááŸá
áºáá±á¬ááºá ááŸááá²á·áááºá
eBPF ááá¯á¡áá¯á¶ážááŒá¯ááá·áº á¡áá¯á¶ážáá»ááá®áá±ážááŸááºážáá»á¬ážá
áœá¬ááŸááá±ááŒá®ááŒá
áºááŒá®ážá á€áá±á¬ááºážáá«ážááœáẠá
á¬ááŒáá·áºááá¯ááºááá¯á¡ááŒá±áá¶á áááºáááá¯ááºááá¯áẠprofileing utility ááá¯áááºááá¯á·áá±ážáá¬ážááááºááá¯ááŒáá·áºááŸá¯áá«áááºá
Ceph ááŸá±ážáááºá
áááºáá¶áá°á¡áá áºááᯠCeph á¡á á¯á¡áá±ážááá¯á· áá±á«ááºážááá·áºáá¬ážáááºá áá±áá¬á¡áá»áá¯á·ááᯠáááºážáᶠááŒá±á¬ááºážááœáŸá±á·ááŒá®ážáá±á¬ááºá áááºážá០áá±ážáá¬ážáá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºááŒááºážáá¡ááŒááºááŸá¯ááºážááẠá¡ááŒá¬ážáá¬áá¬áá»á¬ážááẠáá»á¬ážá áœá¬áááá·áºáá»áááºááᯠáááááŒá¯áááá«áááºá
á¡ááŒá¬ážááááºáá±á¬ááºážáá»á¬ážááŸáá·áºááá°áá²á á€á¡áááºááŸááºááẠbcache ááŸáá·áº linux 4.15 kernel á¡áá
áºááᯠá¡áá¯á¶ážááŒá¯áá²á·áááºá á€ááœá²á·á
ááºážáá¯á¶ááᯠá€áá±áá¬ááœáẠááááá¯á¶ážá¡ááŒááẠá¡áá¯á¶ážááŒá¯ááŒááºážááŒá
áºáááºá ááá¯á¡áá»áááºááœáẠááŒá¿áá¬á á¡áááºážááŒá
áºááẠáá®á¡áá¯áá®á¡á áááºááá·áºá¡áá¬áááᯠááŒá
áºááá¯ááºááŒá±á¬ááºáž áááºááŸá¬ážáá«áááºá
á¡áááºááŸááºááᯠá á¯á¶á ááºážá á áºáá±ážááŒááºážá
ceph-osd áá¯ááºáááºážá
ááºá¡ááœááºáž áá¬ááœá±ááŒá
áºááá²ááá¯áá¬ááᯠááŒáá·áºááŒáá¡á±á¬ááºá áá®á¡ááœáẠáá»áœááºáá±á¬áºááá¯á· áá¯á¶ážáááºá
áá¯á¶á function ááá¯ááŒá±á¬ááŒáááºá fdatasync() áá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážááá¯á· áá±á¬ááºážááá¯áá»ááºáá
áºáá¯áá±ážááá¯á·ááẠá¡áá»áááºáá»á¬ážá
áœá¬ áá¯ááºáá¯á¶ážáá²á·áááºá generic_make_request(). ááá¯ááá¯áááºááŸá¬ ááŒá¿áá¬áá»á¬ážá á¡ááŒá±á¬ááºážáááºážááŸá¬ osd daemon ááá¯ááºááá¯ááºá á¡ááŒááºáááºáá
áºáá±áá¬ááœáẠááŸááá±áááºáᯠááá¯ááá¯áááºá áááºážááẠkernel ááá¯á·ááá¯áẠdisk áá»á¬ážááŒá
áºááá¯ááºáááºá iostat output ááẠbcache disks áá»á¬ážá០áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºáá¬ááœáẠááŒá¬ááŒáá·áºáá»áááºááᯠááŒááá²á·áááºá
host ááá¯á á áºáá±ážáá±á¬á¡áá«á systemd-udevd daemon ááẠcores á¡áá»á¬ážá¡ááŒá¬ážááœáẠ20% ááá·áº CPU time á¡áá»á¬ážá¡ááŒá¬ážá á¬ážáá¯á¶ážáááºááá¯ááœá±á·ááŸáááááºá áá«á áá°ážáááºážáá²á· á¡ááŒá¯á¡áá°ááŒá áºááá¯á· áá¬ááŒá±á¬áá·áºáá²ááá¯áᬠááááá¯á· ááá¯áá«áááºá Systemd-udevd ááẠuevents áá»á¬ážááŸáá·áºá¡áá¯ááºáá¯ááºáá±á¬ááŒá±á¬áá·áºá áááºážááá¯á·ááá¯ááŒáá·áºááŸá¯áááºáá¯á¶ážááŒááºáá²á·áááºá udevadm áá±á¬áºáá®áá¬. á áá áºááŸá ááá±á¬ááºáááááá¬áá áºáá¯á á®á¡ááœáẠááŒá±á¬ááºážáá²ááŸá¯ááŒá áºáááºáá»á¬ážá áœá¬ááᯠáá¯ááºáá±ážáá²á·ááŒá±á¬ááºáž ááœá±á·ááŸáááá«áááºá áá«áᬠá¡áá±á¬áºáá±ážááᯠáááºážááŒááºáá²á·á¡ááœáẠáá®ááŒá áºáááºááœá±á¡á¬ážáá¯á¶ážááᯠááŒá áºáá±á«áºá á±áá²á· á¡áá¬ááœá±ááᯠááŒáá·áºááá«áááá·áºáááºá
BCC Toolkit ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážá
áá»áœááºá¯ááºááá¯á·ááááŸááá¬ážááŒá®ážááŒá
áºááá·áºá¡ááá¯ááºážá kernel (á
áá
áºáá±á«áºááá¯ááŸá¯ááœáẠceph daemon) ááẠá¡áá»áááºáá»á¬ážá
áœá¬áá¯ááºáá¯á¶ážáááºá generic_make_request(). áá®áá¯ááºáá±á¬ááºáá»ááºáá²á· á¡ááŒááºááŸá¯ááºážááᯠááá¯ááºážáá¬ááŒáá·áºáá¡á±á¬ááºá IN
á€á¡ááºá¹áá«áááºááẠá¡áá»á¬ážá¡á¬ážááŒáá·áº áá»ááºááŒááºá
áœá¬ á¡áá¯ááºáá¯ááºáá«áááºá áááºážá¡áá¬á¡á¬ážáá¯á¶ážááẠá
ááºáá
á¹á
ááºážáááá¯ááºáá¬áááºážá
á®ááá¯á· áá±á¬ááºážááá¯áá»ááºááᯠáá±ážááá¯á·ááŒááºážááŒá
áºáááºá
Bcache á¡ááŸááºááááºáá±á¬á· disk áá¯á¶ážáá¯áá«áááºáá²á· ááŸá¯ááºááœá±ážáá²á·áááááá¬áá áºáá¯ááŒá áºáá«áááºá
- áá»á±á¬áá±á¬ááºáá±á¬ááºáá¶áááááᬠ(cached disk) á€ááá á¹á ááœááºáááºážáááºááŸá±ážááœá±ážáá±á¬ HDD ááŒá áºáááºá
- caching device (caching disk)á á€ááœááºáááºážááẠNVMe áááááá¬áá¡ááá¯ááºážáá áºáá¯ááŒá áºáááºá
- á¡ááá®áá±ážááŸááºážáááºáááºááá·áº bcache virtual áááááá¬á
áá±á¬ááºážááá¯áá»áẠáá±ážááá¯á·ááŸá¯ ááŸá±ážááœá±ážááŒá±á¬ááºáž áá»áœááºá¯ááºááá¯á· áááá¬ážáá±á¬áºáááºáž á€á ááºáá á¹á ááºážáá»á¬ážáá²á០áááºááá·áºá¡ááœááºááŒá±á¬áá·áºáá²á áá«ááᯠáá«ááá¯á· áááºážáááºážááŒá¬á០ááŒá±ááŸááºážáááºá
á¡ááŒá
áºá¡áá»ááºáá»á¬ážááẠááŒá¿áá¬áá»á¬ážááŒá
áºá
á±ááá¯ááºááœááºááŸáááŒá±á¬ááºáž ááᯠáá»áœááºá¯ááºááá¯á·áááá«áááºá áá°ááá¯á·áá²á· áá»áá¯ážáááºááœá±ááᯠá¡ááá¡áá» ááŸá¬ááœá±á·ááá¯á·á ááááºáááœááºáá«áá°ážá áááºážááẠá¡áá«á¡á¬ážáá»á±á¬áºá
áœá¬ ááœááºááŸáááá·áº áá±á¬á·ááºáá²ááºáá
áºáá»áá¯ážááŒá
áºáááºáᯠáá°áááŒáá«á
áá¯á·á script ááá¯á¡áá¯á¶ážááŒá¯á system áá±á«áºááœááºáááºááá·áºáá±á¬á·ááºáá²ááá¯áá¯ááºáá±á¬ááºáááºááá¯ááŒáá·áºááŒáá«á
áá¯á· 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 adapter á á¡áá°áá»áááºááᯠá áá¹ááá·áº 30 ááá¯ááºážááá¯ááºážáááºá áááºážááẠááá¯á¡ááºáááºááẠáááŒá¬áá ááá¯áá«áááºá á á áºáá±ážááŸá¯ááŒá¬ážáá¬áááᯠááá¯ááŸááºááá·áºáá áºáá¯ááá¯á· ááŒá±á¬ááºážááŒá®ážáá±á¬ááºá ဠhost ááœáẠáá±á¬ááºážááá¯áá»ááºáá¯ááºáá±á¬ááºááŒááºáž á¡áá»áááºááŒá¬áá»áááºááẠá¡ááŒá¬áž host áá»á¬ážááŸáá·áº ááŸáá¯ááºážááŸááºáá«á áá°ážááŒá¬ážááŒá±á¬ááºáž ááœá±á·ááŸáááá«áááºá
ááá¯á·áá±á¬áº bcache á ááºáá á¹á ááºážááẠá¡áááºááŒá±á¬áá·áº á€áá»áŸááŸá±ážááœá±ážáááºááᯠáááááá±ážáá«á áá»áœááºá¯ááºááá¯á·ááẠáááºáá°áá¯á¶á á¶ááœá²á·á ááºážááŸá¯áá áºáá¯ááŒáá·áº á ááºážáááºááááºáá±á¬ááºážáá áºáá¯ááᯠááŒááºáááºáá²á·ááŒá®áž uevents áá»á¬ážáá¯ááºáá¯ááºáááºá¡ááœáẠá¡áá«á¡á¬ážáá»á±á¬áºá áœá¬ fio bcache ááá¯ááœáá·áºáᬠudevadm trigger ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº ááŒá¿áá¬ááá¯ááŒááºáááºáá¯ááºáá¯ááºáááºááŒáá¯ážá á¬ážáá²á·áááºá
BCC-Based Tools áá»á¬ážáá±ážáá¬ážááŒááºážá
á¡ááŸá±ážáá¯á¶ážáá±á«áºááá¯ááŸá¯áá»á¬ážááᯠááŒá±áá¬áá¶áááºááŸáá·áº á¡ááŸá±ážáá¯á¶ážáá±á«áºááá¯ááŸá¯áá»á¬ážááᯠááŒáááẠááá¯ážááŸááºážáá±á¬ utility áá áºáá¯ááᯠáá±ážááŒáá·áºááŒáá«á áá¯á· generic_make_request(). á€áá¯ááºáá±á¬ááºáá»ááºááᯠáá±á«áºááá·áº drive á¡áááºááá¯áááºáž áá»áœááºá¯ááºááá¯á· á áááºáááºá á¬ážáá«áááºá
á¡á á®á¡á ááºááẠááá¯ážááŸááºážáááº-
- ááŸááºáá¯á¶áááºáá«á kprobe á¡áá±á«áº generic_make_request():
- áá»áœááºá¯ááºááá¯á·ááẠfunction argument ááŸáááá·áºáááºáá±á¬ááºááá¯ááºáá±á¬ disk á¡áááºááᯠmemory ááœááºááááºážáááºážáá«áááºá
- áá»áœááºá¯ááºááá¯á·ááẠá¡áá»áááºáá¶ááááºááᯠááááºážáááºážáá«áááºá
- ááŸááºáá¯á¶áááºáá«á kretprobe ááŸááŒááºáá¬ááá¯á· generic_make_request():
- áá»áœááºá¯ááºááá¯á·ááẠáááºááŸáá¡áá»áááºáá¶ááááºááᯠáááŸááá«áááºá
- áá»áœááºá¯ááºááá¯á·ááẠááááºážáááºážáá¬ážáá±á¬ á¡áá»áááºáá¶ááááºááᯠááŸá¬ááœá±ááŒá®áž áááºážááᯠáááºááŸáá¡áá»áááºááŸáá·áº ááŸáá¯ááºážááŸááºáá«á
- ááááºááẠáááºááŸááºáá¬ážáá±á¬ áá áºáá¯ááẠááŒá®ážáá«áá ááááºážáááºážáá¬ážáá±á¬ áá áºááºá¡áááºááᯠááœá±á·ááŸáááŒá®áž áááºážááᯠterminal ááœáẠááŒááááºááŒá áºáááºá
Kprobes О kretprobes áá¯ááºáá±á¬ááºáá»ááºáá¯ááºááᯠá¡ááŒááºááŒá±á¬ááºážááẠbreakpoint ááá¹ááá¬ážááᯠá¡áá¯á¶ážááŒá¯áá«á áááºááá¯á·ááááºá
python script á¡ááœááºážááŸá eBPF á á¬áá¬ážááẠá€áá²á·ááá¯á· ááŒá áºáááº-
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 table ááá¯á
á¬áááºážááœááºážáá«á páá±á¬á·á¡áá»áá¯ážá¡á
á¬ážááŒáá·áºá u64 á¡áá»áá¯ážá¡á
á¬ážááááºááá¯áž struct data_t. áá»áœááºá¯ááºááá¯á·á BPF áááá¯ááááºá á¡ááŒá±á¡áá±ááœáẠááá¬ážááᯠáááŸáááá¯ááºáá«áááºá BPF_PERF_OUTPUT áááºáááá¯ááẠáá±á«áºáá±á¬ á¡ááŒá¬ážááá¬ážááᯠááŸááºáá¯á¶áááºáááºá ááŒá
áºáááºáá»á¬áž, áá»á¬ážá¡ááœááºá¡áá¯á¶ážááŒá¯áááºá
áá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯áá±á«áºááá¯ááŒááºážááŸáá·áº áááºážááŸááŒááºáá¬ááŒááºážááŒá¬áž ááŸá±á¬áá·áºááŸá±ážááŸá¯ááᯠááá¯ááºážáá¬ááá·áºá¡áá« ááá¯á·ááá¯áẠááá°áá®áá±á¬áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááá¯á· áá±á«áºááá¯ááŸá¯áá»á¬ážááŒá¬ážááœááºá áááºáá¶áááŸáááá·áºáá±áá¬ááẠáá°áá®áá±á¬á¡ááŒá±á¬ááºážá¡áá¬ááŸáá·áºáááºááá¯ááºááŒá±á¬ááºáž ááá·áºááœááºážá
ááºážá
á¬ážááẠááá¯á¡ááºáá«áááºá áá
áºáááºážááá¯ááá±á¬áºá ááŒá
áºááá¯ááºáá»á±ááŸááá±á¬ á¡ááŒáá¯ááºáá¯ááºáá±á¬ááºááŸá¯áá»á¬ážá áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠááŸááºáá¬ážáá¬ážááẠááá¯á¡ááºáááºá áá¯ááºáááºážá
ááºáá
áºáá¯áá¡ááŒá±á¡áá±ááœáẠáá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯á¡á¬áž áá±á«áºááá¯ááŒááºážááŸáá·áº á¡ááŒá¬ážáá¯ááºáááºážá
ááºáá
áºáá¯áá¡ááŒá±á¡áá±ááœáẠááá¯áá¯ááºáá±á¬ááºáá»ááºá០ááŒááºáá¬ááŒááºážá¡ááŒá¬áž latency ááᯠááá¯ááºážáá¬ááá¯ááºáá±á¬áºáááºáž áááºážááẠá¡áá¯á¶ážááááºááœááºááŸááááºá á€áá±áá¬ááœáẠá¥ááá¬áá±á¬ááºážáá
áºáᯠááŒá
áºáááá·áºáááºá
ááá¯á·áá±á¬ááºá áá±á·áá¬ááŸá¯á¡á±á¬ááºááŸá function ááá¯áá±á«áºáá±á¬á¡áá«ááœááºáááºáááºááá·áºáá¯ááºááá¯áá±ážáááºááá¯á¡ááºáááº-
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);
}
á€áá±áá¬ááœáẠáá±á«áºáá¬ážáá±á¬ function á áááá¡ááŒááºážá¡áá¯á¶ááᯠáá¯áááá¡ááŒááºážá¡áá¯á¶á¡ááŒá
Ạá¡á
á¬ážááá¯ážáááºááŒá
áºáááºá
á¡á±á¬ááºáá« function ááᯠreturn from áá¯áá±á«áºáá«áááºá 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 ááŸáá·áº á¡áá»áááºáá¶ááááºááᯠááŸá¬ááœá±áá±á¬áºáááºáž áá±áá¬ááœá²á·á ááºážáá¯á¶á¡áá áºá¡ááœáẠááŸááºáá¬ááºááᯠááœá²áá±ááá¬ážáá«á áááºážá¡á á¬ážá áá»áœááºá¯ááºááá¯á·ááẠáá±á¬á· == áááºááŸá PID ááᯠá¡áá¯á¶ážááŒá¯á ááŸáááŸáá·áºááŒá®ážáá¬áž ááœá²á·á ááºážáá¯á¶á¡ááœáẠhash table ááᯠááŸá¬ááœá±áááºá ááœá²á·á ááºážáááºáá±á¬ááºáá¯á¶ááᯠááœá±á·ááŸááá«áá áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºáá±á¬ááºáá±ááá·áº áá¯ááºáááºážá ááºá¡áááºááᯠááŸá¬ááœá±ááŒá®áž áááºážááœáẠááá·áºááœááºážáá«á
thread GID ááá¯ááá°ááẠá€áá±áá¬ááœáẠáá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯ááá·áº binary shift ááẠááá¯á¡ááºáá«áááºá á¡á²áá«ááœá± áá»áœááºá¯ááºááá¯á·áá¯ááºáá±á¬ááºáá±ááá·áºá¡ááŒá±á¬ááºážá¡áá¬ááœáẠthread ááá¯á
áááºááá·áº á¡ááááá¯ááºáááºážá
ááºá PIDá Function ááá¯á·áá±á«áºáááºá
terminal ááá¯á· áá¯ááºáá±ážááá·áºá¡áá«á áá»áœááºá¯ááºááá¯á·ááẠáá±á¬áá±á¬áááºááœáẠthread ááᯠá áááºááááºá á¬ážáá±á¬áºáááºáž áááºááá¯ááºáááºážá ááºááᯠá áááºáááºá á¬ážáá«áááºá áá±ážáá¬ážáá±á¬ á¡ááá·áºáá áºáá¯ááŸáá·áº ááááºááŸá±á¬áá·áºááŸá±ážááŸá¯ááᯠááŸáá¯ááºážááŸááºááŒá®ážáá±á¬ááºá áá»áœááºá¯ááºááá¯á·á ááœá²á·á ááºážáá¯á¶ááᯠáá»á±á¬áºááœá¬ážáá«áááºá áá±áᬠááá¬ážááŸáááá·áº user space áá²ááá¯á· ááŒá áºáááºáá»á¬ážááá¯á·áá±á¬áẠáá»áœááºá¯ááºááá¯á·ááẠáááºááœáá·áºááᯠáá»ááºááá¯ááºáá«áááºá p.
á€áá¯ááºááá¯ááœáá·áºááá·áº python script ááœááºá áá»áœááºá¯ááºááá¯á·ááẠ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)]
áá±á¬ááºáá¯á¶ážá¡ááá·áºááŸá¬ terminal ááá¯á· data áá¯ááºáá±ážáááºááŒá áºáááº
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() áááºááŸáºáá
áºáá
áºáá¯á¡ááœááºá
Kernel ááá¯áá°ážáá«á
áá±á¬ááºážááá¯áá»áẠáá±ážááá¯á·ááŸá¯ááœáẠá¡ááá¡áá» á¡áááºá¡áᬠááŸá±ážááœá±ážáá±ááááºážá áá±á¬ááºážááá¯ááŸá¯á
á¬áááºážááŒá¯á
á¯ááŒááºážáá
áááºáá®ááœááºááẠááŒáá·áºááŒá¬ááŸá¯ááŒá
áºáá±á«áºáááºááᯠáá»áœááºá¯ááºááá¯á·ááŒááºááááºá ááá¯ááá¯áááºááŸá¬á áááºážááœáẠá
á¬áááºážááá¬ážáá»á¬ážá áá±á¬ááºáááºááœááºááŸáááŸá¯á¡ááœáẠáá®ážááŒá¬ážáá±á¬ááºážááá¯áá»áẠ(/proc/diskstats ááá¯á·ááá¯áẠiostat) ááᯠá
á¬áááºážááŒá¯á
á¯ááŒááºážááŸá¬ áá
áááºáá±ážáá«á ááŒá¿áá¬ááᯠááŒááºáááºáá¯ááºáá¯ááºáá±á
ááºááœáẠiostat ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº áááºážááᯠá¡ááœááºááá°á¡áááºááŒá¯ááá¯ááºáááºá
function ááá¯ááŒáá·áºáááºááá¯ááẠ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));
áááºážááœááºá kernel ááẠáááºážá á®ááŒááºážááᯠáááºááá·áºááẠá á±á¬áá·áºáá±áááºá ááŸá±á¬áá·áºááŸá±ážááŸá¯ááᯠááá¯ááºážáá¬ááŒáá«á áá¯á· 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 | |
áá»áœááºá¯ááºááá¯á·ááẠá¡ááŒá±áá
áºáá¯ááŸáá·áºáá®ážá
ááºáá±áá¯á¶ááááºá áááºážá
á®áá
áºáá¯ááᯠá¡á±ážáá²/ááŒááºááœáá·áºááẠá¡áá¯á¶ážááŒá¯ááá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááŸá¬
kernel ááẠáááºážá
á®áá¬ážáá±á¬ áá¯ááºáá±á¬ááºááŸá¯áá»á¬áž á¡á¬ážáá¯á¶ážááŒá®ážááŒá±á¬ááºááẠá
á±á¬áá·áºááá¯ááºážáá±áá±á¬ááŒá±á¬áá·áº á€áááºážá
á®á¡á¬áž ááŸááºážáááºážááẠááá¯á¡ááºááá·áºá¡áá»áááºááẠdisk latency ááŸáá·áº áá®áá»áŸáááºá áááºážá
á®ááŒááºáž ááœááºááœá¬ážáááºááŸáá·áºá áááºáááºáá»á¬áž ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá ááŒá®ážá០áá±á«áºáááºá
á¡áá¯áá±á¬á· á¡ááŒá±á¡áá±ááᯠááŒááºááá¯á· áá¯á¶áá±á¬ááºáá±áá«ááŒá®á udevadm trigger command ááẠblock device á¡ááœáẠáááºáááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá
á±áááºá á€áááºáááºáá»á¬ážááᯠudev á
ááºážáá»ááºážáá»á¬ážááœáẠáá±á¬áºááŒáá¬ážáááºá sysfs ááŸáááá·áº ááá¯á·ááá¯áẠkernel á¡áááºážá¡ááŒá
áºáá¯ááºááá¯ááŒáá·áºááŸá¯ááŒááºážááŒáá·áº áááºážááá¯á·ááᯠááŒá±á¬ááºážáá²áááºááŒáá¯ážá
á¬ážááŒááºážááŒáá·áº áááºááá·áºáááºáááºáá»á¬ážááᯠáááºážá
á®áááºá
á±áááºááᯠáá»áœááºá¯ááºááá¯á· ááŸá¬ááœá±ááá¯ááºáááºá BCC utility ááá¯áááºáž á
ááºážááŒáá·áºááá¯ááºáá«áááºá
~# /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 á
ááºážáá»ááºážáá»á¬ážááẠááŒá±á¬ááºážáá²áá²ááŒá®áž áá»á¬ážáá±á¬á¡á¬ážááŒáá·áº ááááºážáá»á¯ááºáá¬ážááá·áºáá¯á¶á
á¶ááŒáá·áº ááŒá
áºáááºáá«áááºá ááá¯á·ááŒá±á¬áá·áº áááºááŸááºááŒá®ážáá¬ážáááºááá¯ážáá»á¬ážááᯠá¡áá¯á¶ážáá»ááŒááºážáááºááẠá¡ááá®áá±ážááŸááºážá០áá±á¬ááºážááá¯áá»ááºááᯠáá
áºááá¯á· ááœáŸá²ááŒá±á¬ááºážáá¬ááœáẠááŸá±á¬áá·áºááŸá±ážááŸá¯ááᯠááŒá
áºá
á±áááºááᯠáá»áœááºá¯ááºááá¯á· ááŒááºáá«áááºá ááŸááºáá«áááºá disk configuration ááœááºááŒá±á¬ááºážáá²ááŸá¯áááŸááá±á¬á¡áá« (á¥ááá¬á á
ááºááá¯áááºáááºáá¬ážááŒááºáž/á¡áááºááŒááºááŒááºážááá¯ááº) ááẠáá±á¬ááºážááœááºáá±á¬á¡áá±á·á¡áá»áá·áºáá
áºáá¯ááá¯ááºáá«á ááá¯á·áá±á¬áºá áááá¯á¡ááºáá±á¬á¡áá¯ááºááá¯ááºáááºááŸáá·áº áááá¯á¡ááºáá«á kernel ááẠáá±á¬ááºážááá¯ááŸá¯áááºážá
á®ááᯠá¡á±ážáá²á
á±ááá¯ááºáááºá
áá±á¬ááºáá»ááº
eBPF ááẠá¡ááœááºááŒá±á¬ááºážááœááºááŒááºááœááºááŸáá·áº á¡á
áœááºážáááºáá±á¬áááááá¬áá
áºáá¯ááŒá
áºáááºá áá±á¬ááºážáá«ážááœáẠáá»áœááºá¯ááºááá¯á·ááẠáááºááœá±á·áá»áá±á¬ááá
á¹á
áááºáá
áºáá¯ááᯠááŒáá·áºááŸá¯ááŒá®áž áá¯ááºáá±á¬ááºááá¯ááºááá·áºá¡áá¬á áá±ážáááºáá±á¬á¡ááá¯ááºážááᯠááá¯ááºááŒáá²á·áááºá á¡áááºá áááºááẠBCC utilities áá»á¬ážááá¯áá®ááœááºáááºá
áááºáááºá
á¬ážáá«áá áááºážááá¯ááŒáá·áºááŸá¯áááºááá·áºáááºá
eBPF ááá¯á¡ááŒá±áá¶á á¡ááŒá¬ážá
áááºáááºá
á¬ážááœááºáá±á¬ááºážáá±á¬á¡ááŸá¬ážááŒááºáááºááŒááºážááŸáá·áº áááá¯ááá¯ááºááŒá¯áá¯ááºááŒááºážáááááá¬áá»á¬áž ááŸááá«áááºá á¡á²áá®áá²á áá
áºáá±á¬ááºá -
source: www.habr.com