eBPF/BCC рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЙрдЪреНрдЪ Ceph рд▓реЗрдЯрдиреНрд╕реА рджреЗрдЦрд┐ рдХрд░реНрдиреЗрд▓ рдкреНрдпрд╛рдЪ рд╕рдореНрдо

eBPF/BCC рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЙрдЪреНрдЪ Ceph рд▓реЗрдЯрдиреНрд╕реА рджреЗрдЦрд┐ рдХрд░реНрдиреЗрд▓ рдкреНрдпрд╛рдЪ рд╕рдореНрдо

рд▓рд┐рдирдХреНрд╕рд╕рдБрдЧ рдХрд░реНрдиреЗрд▓ рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдбрд┐рдмрдЧ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛рдорд╛ рдЙрдкрдХрд░рдгрд╣рд░реВ рдЫрдиреНред рддрд┐рдиреАрд╣рд░реВрдордзреНрдпреЗ рдзреЗрд░реИрд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреНрд░рджрд░реНрд╢рдирдорд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡ рдкрд╛рд░реНрдЫ рд░ рдЙрддреНрдкрд╛рджрдирдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдБрджреИрдиред

рдХреЗрд╣реА рд╡рд░реНрд╖ рдкрд╣рд┐рд▓реЗ рддреНрдпрд╣рд╛рдБ рдерд┐рдпреЛ рдЕрд░реНрдХреЛ рдЙрдкрдХрд░рдг рд╡рд┐рдХрд╛рд╕ рдЧрд░рд┐рдПрдХреЛ рдЫ - eBPFред рдпрд╕рд▓реЗ рдХрд░реНрдиреЗрд▓ рд░ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрд▓рд╛рдИ рдХрдо рдУрднрд░рд╣реЗрдбрдХреЛ рд╕рд╛рде рд░ рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВ рдкреБрди: рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд░ рдХрд░реНрдиреЗрд▓рдорд╛ рддреЗрд╕реНрд░реЛ-рдкрдХреНрд╖ рдореЛрдбреНрдпреБрд▓рд╣рд░реВ рд▓реЛрдб рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдмрд┐рдирд╛ рдЯреНрд░реЗрд╕ рдЧрд░реНрди рд╕рдореНрднрд╡ рдмрдирд╛рдЙрдБрдЫред

рддреНрдпрд╣рд╛рдБ рдкрд╣рд┐рд▓реЗ рдиреИ рдзреЗрд░реИ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╣рд░реВ рдЫрдиреН рдЬреБрди eBPF рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ, рд░ рдпрд╕ рд▓реЗрдЦрдорд╛ рд╣рд╛рдореА рдкреБрд╕реНрддрдХрд╛рд▓рдпрдорд╛ рдЖрдзрд╛рд░рд┐рдд рддрдкрд╛рдЗрдБрдХреЛ рдЖрдлреНрдиреИ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдЩ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╕рд░реА рд▓реЗрдЦреНрдиреЗ рднрдиреЗрд░ рд╣реЗрд░реНрдиреЗрдЫреМрдВред PythonBCCред рд▓реЗрдЦ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдШрдЯрдирд╛рдорд╛ рдЖрдзрд╛рд░рд┐рдд рдЫред рдЕрд╡рд╕реНрдерд┐рдд рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╣рд░реВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рд╣рд░реВрдорд╛ рдХрд╕рд░реА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рднрдиреЗрд░ рджреЗрдЦрд╛рдЙрди рд╣рд╛рдореА рд╕рдорд╕реНрдпрд╛рдмрд╛рдЯ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рдЬрд╛рдиреНрдЫреМрдВред

Ceph рдврд┐рд▓реЛ рдЫ

Ceph рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдирдпрд╛рдБ рд╣реЛрд╕реНрдЯ рдердкрд┐рдПрдХреЛ рдЫред рдпрд╕рдорд╛ рдХреЗрд╣реА рдбрд╛рдЯрд╛ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдЧрд░реЗрдкрдЫрд┐, рд╣рд╛рдореАрд▓реЗ рдпреЛ рджреНрд╡рд╛рд░рд╛ рд▓реЗрдЦрд┐рдПрдХрд╛ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрдиреЗ рдЧрддрд┐ рдЕрдиреНрдп рд╕рд░реНрднрд░рд╣рд░реВрдХреЛ рддреБрд▓рдирд╛рдорд╛ рдзреЗрд░реИ рдХрдо рднрдПрдХреЛ рджреЗрдЦреНрдпреМрдВред

eBPF/BCC рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЙрдЪреНрдЪ Ceph рд▓реЗрдЯрдиреНрд╕реА рджреЗрдЦрд┐ рдХрд░реНрдиреЗрд▓ рдкреНрдпрд╛рдЪ рд╕рдореНрдо
рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд░реНрдорд╣рд░реВрдХреЛ рд╡рд┐рдкрд░реАрдд, рдпреЛ рд╣реЛрд╕реНрдЯрд▓реЗ bcache рд░ рдирдпрд╛рдБ рд▓рд┐рдирдХреНрд╕ 4.15 рдХрд░реНрдиреЗрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдпреЛред рдпреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рд╣реЛрд╕реНрдЯ рдпрд╣рд╛рдБ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХреЛ рдпреЛ рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ рдерд┐рдпреЛред рд░ рддреНрдпрд╕ рдХреНрд╖рдгрдорд╛ рдпреЛ рд╕реНрдкрд╖реНрдЯ рдерд┐рдпреЛ рдХрд┐ рд╕рдорд╕реНрдпрд╛рдХреЛ рдЬрд░рд╛ рд╕реИрджреНрдзрд╛рдиреНрддрд┐рдХ рд░реВрдкрдорд╛ рдХреЗрд╣рд┐ рдкрдирд┐ рд╣реБрди рд╕рдХреНрдЫред

рдЖрдпреЛрдЬрдХрдХреЛ рдЦреЛрдЬреА рдЧрд░реНрджреИ

ceph-osd рдкреНрд░рдХреНрд░рд┐рдпрд╛ рднрд┐рддреНрд░ рдХреЗ рд╣реБрдиреНрдЫ рд╣реЗрд░реЗрд░ рд╕реБрд░реБ рдЧрд░реМрдВред рдпрд╕рдХрд╛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ perf ╨╕ рдлреНрд▓реЗрдорд╕реНрдХреЛрдк (рдЬрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рддрдкрд╛рдИрд▓реЗ рдкрдвреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдпрд╣рд╛рдБ):

eBPF/BCC рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЙрдЪреНрдЪ Ceph рд▓реЗрдЯрдиреНрд╕реА рджреЗрдЦрд┐ рдХрд░реНрдиреЗрд▓ рдкреНрдпрд╛рдЪ рд╕рдореНрдо
рддрд╕реНрд╡рд┐рд░рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдмрддрд╛рдЙрдБрдЫ рдХрд┐ рдХрд╛рд░реНрдп fdatasync() рдХрд╛рд░реНрдпрд╣рд░реВрдорд╛ рдЕрдиреБрд░реЛрдз рдкрдард╛рдЙрди рдзреЗрд░реИ рд╕рдордп рдЦрд░реНрдЪ рднрдпреЛ generic_make_request()ред рдпрд╕рдХреЛ рдорддрд▓рдм рдпреЛ рд╣реЛ рдХрд┐ рд╕рдореНрднрд╡рддрдГ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрд╛рд░рдг рдХрддреИ osd рдбреЗрдорди рдмрд╛рд╣рд┐рд░ рдиреИ рдЫред рдпреЛ рдпрд╛ рдд рдХрд░реНрдиреЗрд▓ рд╡рд╛ рдбрд┐рд╕реНрдХ рд╣реБрди рд╕рдХреНрдЫред iostat рдЖрдЙрдЯрдкреБрдЯрд▓реЗ bcache рдбрд┐рд╕реНрдХрд╣рд░реВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╢реЛрдзрди рдЕрдиреБрд░реЛрдзрд╣рд░реВрдорд╛ рдЙрдЪреНрдЪ рд╡рд┐рд▓рдореНрдмрддрд╛ рджреЗрдЦрд╛рдпреЛред

рд╣реЛрд╕реНрдЯ рдЬрд╛рдБрдЪ рдЧрд░реНрджрд╛, рд╣рд╛рдореАрд▓реЗ рдкрддреНрддрд╛ рд▓рдЧрд╛рдпреМрдВ рдХрд┐ systemd-udevd рдбреЗрдордирд▓реЗ CPU рд╕рдордпрдХреЛ рдареВрд▓реЛ рдорд╛рддреНрд░рд╛ рдЦрдкрдд рдЧрд░реНрдЫ - рдзреЗрд░реИ рдХреЛрд░рд╣рд░реВрдорд╛ рд▓рдЧрднрдЧ 20%ред рдпреЛ рдЕрдиреМрдареЛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛ, рддреНрдпрд╕реИрд▓реЗ рддрдкрд╛рдИрдВрд▓реЗ рдХрд┐рди рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫред Systemd-udevd рд▓реЗ uevents рд╕рдВрдЧ рдХрд╛рдо рдЧрд░реЗрдХреЛ рд╣реБрдирд╛рд▓реЗ, рд╣рд╛рдореАрд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╣реЗрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдпреМрдВ udevadm рдордирд┐рдЯрд░ред рдпреЛ рдмрд╛рд╣рд┐рд░ рдЬрд╛рдиреНрдЫ рдХрд┐ рдкреНрд░рдгрд╛рд▓реАрдорд╛ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓рдХ рдЙрдкрдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдШрдЯрдирд╛рд╣рд░реВрдХреЛ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рднрдПрдХреЛ рдерд┐рдпреЛред рдпреЛ рдПрдХрджрдо рдЕрд╕рд╛рдорд╛рдиреНрдп рдЫ, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореАрд▓реЗ рдпреА рд╕рдмреИ рдШрдЯрдирд╛рд╣рд░реВ рдХреЗ рдЙрддреНрдкрдиреНрди рдЧрд░реНрдЫ рднрдиреЗрд░ рд╣реЗрд░реНрдиреБ рдкрд░реНрдЫред

BCC Toolkit рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ

рд╣рд╛рдореАрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рдкрддреНрддрд╛ рд▓рдЧрд╛рдПрдХрд╛ рдЫреМрдВ, рдХрд░реНрдиреЗрд▓ (рд░ рдкреНрд░рдгрд╛рд▓реА рдХрд▓рдорд╛ рд╕реЗрдл рдбреЗрдорди) рдзреЗрд░реИ рд╕рдордп рдЦрд░реНрдЪ рдЧрд░реНрджрдЫред generic_make_request()ред рдпрд╕ рдкреНрд░рдХрд╛рд░реНрдпрдХреЛ рдЧрддрд┐ рдирд╛рдкреНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВред IN рдмреАрд╕реАрд╕реА рддреНрдпрд╣рд╛рдБ рдкрд╣рд┐рд▓реЗ рдиреИ рдПрдХ рдЕрджреНрднреБрдд рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЫ - funclatencyред рд╣рд╛рдореА рдбреЗрдореЛрдирд▓рд╛рдИ рдпрд╕рдХреЛ PID рджреНрд╡рд╛рд░рд╛ рдЖрдЙрдЯрдкреБрдЯрд╣рд░реВ рдмреАрдЪрдХреЛ 1 рд╕реЗрдХреЗрдиреНрдб рдЕрдиреНрддрд░рд╛рд▓рдорд╛ рдЯреНрд░реЗрд╕ рдЧрд░реНрдиреЗрдЫреМрдВ рд░ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд┐рд╕реЗрдХреЗрдиреНрдбрдорд╛ рдЖрдЙрдЯрдкреБрдЯ рдЧрд░реНрдиреЗрдЫреМрдВред

eBPF/BCC рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЙрдЪреНрдЪ Ceph рд▓реЗрдЯрдиреНрд╕реА рджреЗрдЦрд┐ рдХрд░реНрдиреЗрд▓ рдкреНрдпрд╛рдЪ рд╕рдореНрдо
рдпреЛ рд╕реБрд╡рд┐рдзрд╛ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдЫрд┐рдЯреЛ рдХрд╛рдо рдЧрд░реНрджрдЫред рд╕рдмреИ рдпреЛ рдЧрд░реНрдЫ рдХрд┐ рдпрдиреНрддреНрд░ рдЪрд╛рд▓рдХ рд▓рд╛рдордорд╛ рдЕрдиреБрд░реЛрдз рдкрд╛рд╕ рдЧрд░реНрджрдЫред

Bcache рдПрдХ рдЬрдЯрд┐рд▓ рдЙрдкрдХрд░рдг рд╣реЛ рдЬреБрди рд╡рд╛рд╕реНрддрд╡рдорд╛ рддреАрди рдбрд┐рд╕реНрдХрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ:

  • рдмреНрдпрд╛рдХрд┐рдЩ рдЙрдкрдХрд░рдг (рдХреНрдпрд╛рд╕ рдбрд┐рд╕реНрдХ), рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдпреЛ рдПрдХ рдврд┐рд▓реЛ HDD рд╣реЛ;
  • рдХреНрдпрд╛рд╕рд┐рдЩ рдпрдиреНрддреНрд░ (рдХреНрдпрд╛рд╕рд┐рдЩ рдбрд┐рд╕реНрдХ), рдпрд╣рд╛рдБ рдпреЛ NVMe рдпрдиреНрддреНрд░рдХреЛ рдПрдЙрдЯрд╛ рд╡рд┐рднрд╛рдЬрди рд╣реЛ;
  • bcache рднрд░реНрдЪреБрдЕрд▓ рдЙрдкрдХрд░рдг рдЬрд╕рдХреЛ рд╕рд╛рде рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЪрд▓реНрдЫред

рд╣рд╛рдореАрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ рдХрд┐ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рд╛рд░рдг рдврд┐рд▓реЛ рдЫ, рддрд░ рдпреА рдордзреНрдпреЗ рдХреБрди рдЙрдкрдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐? рд╣рд╛рдореА рдпреЛ рдХреЗрд╣рд┐ рдкрдЫрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдЧрд░реНрдиреЗрдЫреМрдВред

рд╣рд╛рдореАрд▓рд╛рдИ рдЕрдм рдерд╛рд╣рд╛ рдЫ рдХрд┐ uevents рд▓реЗ рд╕рдорд╕реНрдпрд╛ рдирд┐рдореНрддреНрдпрд╛рдЙрди рд╕рдХреНрдЫред рддрд┐рдиреАрд╣рд░реВрдХреЛ рдкреБрд╕реНрддрд╛рдХреЛ рдХрд╛рд░рдг рдХреЗ рд╣реЛ рднрдиреЗрд░ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрди рддреНрдпрддрд┐ рд╕рдЬрд┐рд▓реЛ рдЫреИрдиред рдорд╛рдиреМрдВ рдХрд┐ рдпреЛ рдХреЗрд╣рд┐ рдкреНрд░рдХрд╛рд░рдХреЛ рд╕рдлреНрдЯрд╡реЗрдпрд░ рд╣реЛ рдЬреБрди рдЖрд╡рдзрд┐рдХ рд░реВрдкрдорд╛ рд╕реБрд░реБ рд╣реБрдиреНрдЫред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреНрд░рдгрд╛рд▓реАрдорд╛ рдХрд╕реНрддреЛ рдкреНрд░рдХрд╛рд░рдХреЛ рд╕рдлреНрдЯрд╡реЗрдпрд░ рдЪрд▓реНрдЫ рд╣реЗрд░реМрдВ execsnoop рдЙрд╣реА рдмрд╛рдЯ BCC рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд┐рдЯред рдпрд╕рд▓рд╛рдИ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН рд░ рдлрд╛рдЗрд▓рдорд╛ рдЖрдЙрдЯрдкреБрдЯ рдкрдард╛рдЙрдиреБрд╣реЛрд╕реНред

рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА рдпреЛ рдЬрд╕реНрддреИ:

/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 рдЙрдкрдХрд░рдг рдпрддрд┐ рдврд┐рд▓реЛ рдерд┐рдпреЛред рд╣рд╛рдореАрд▓реЗ рдПрдЙрдЯреИ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдкреНрд▓реЗрдЯрдлрд░реНрдо рддрдпрд╛рд░ рдЧрд░реНрдпреМрдВ рд░ bcache рдорд╛ fio рдЪрд▓рд╛рдПрд░ рд╕рдорд╕реНрдпрд╛ рдкреБрди: рдЙрддреНрдкрд╛рджрди рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдпреМрдВ, рдЖрд╡рдзрд┐рдХ рд░реВрдкрдорд╛ uevadm рдЯреНрд░рд┐рдЧрд░ рдЪрд▓рд╛рдПрд░ uevents рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиред

BCC-рдЖрдзрд╛рд░рд┐рдд рдЙрдкрдХрд░рдгрд╣рд░реВ рд▓реЗрдЦрди

рд╕рдмреИрднрдиреНрджрд╛ рдврд┐рд▓реЛ рдХрд▓рд╣рд░реВ рдЯреНрд░реЗрд╕ рдЧрд░реНрди рд░ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд▓реЗрдЦреНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ generic_make_request()ред рд╣рд╛рдореА рдбреНрд░рд╛рдЗрднрдХреЛ рдирд╛рдордорд╛ рдкрдирд┐ рд░реБрдЪрд┐ рд░рд╛рдЦреНрдЫреМрдВ рдЬрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдпреЛ рдкреНрд░рдХрд╛рд░реНрдп рдмреЛрд▓рд╛рдЗрдПрдХреЛ рдерд┐рдпреЛред

рдпреЛрдЬрдирд╛ рд╕рд░рд▓ рдЫ:

  • рджрд░реНрддрд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН kprobe рдорд╛ generic_make_request():
    • рд╣рд╛рдореА рдбрд┐рд╕реНрдХ рдирд╛рдо рдореЗрдореЛрд░реАрдорд╛ рдмрдЪрдд рдЧрд░реНрдЫреМрдВ, рдкреНрд░рдХрд╛рд░реНрдп рддрд░реНрдХ рдорд╛рд░реНрдлрдд рдкрд╣реБрдБрдЪрдпреЛрдЧреНрдп;
    • рд╣рд╛рдореА рдЯрд╛рдЗрдорд╕реНрдЯреНрдпрд╛рдореНрдк рдмрдЪрдд рдЧрд░реНрдЫреМрдВред

  • рджрд░реНрддрд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН kretprobe рдмрд╛рдЯ рдлрд┐рд░реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ generic_make_request():
    • рд╣рд╛рдореАрд▓реЗ рд╣рд╛рд▓рдХреЛ рдЯрд╛рдЗрдорд╕реНрдЯреНрдпрд╛рдореНрдк рдкрд╛рдЙрдБрдЫреМрдВ;
    • рд╣рд╛рдореА рдмрдЪрдд рдЧрд░рд┐рдПрдХреЛ рдЯрд╛рдЗрдорд╕реНрдЯреНрдпрд╛рдореНрдк рдЦреЛрдЬреНрдЫреМрдВ рд░ рдпрд╕рд▓рд╛рдИ рд╣рд╛рд▓рдХреЛрд╕рдБрдЧ рддреБрд▓рдирд╛ рдЧрд░реНрдЫреМрдВ;
    • рдпрджрд┐ рдирддрд┐рдЬрд╛ рддреЛрдХрд┐рдПрдХреЛ рднрдиреНрджрд╛ рдареВрд▓реЛ рдЫ рднрдиреЗ, рд╣рд╛рдореА рд╕реБрд░рдХреНрд╖рд┐рдд рдбрд┐рд╕реНрдХ рдирд╛рдо рдлреЗрд▓рд╛ рдкрд╛рд░реНрдЫреМрдВ рд░ рдпрд╕рд▓рд╛рдИ рдЯрд░реНрдорд┐рдирд▓рдорд╛ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдЫреМрдВред

Kprobes ╨╕ kretprobes рдлреНрд▓рд╛рдИрдорд╛ рдкреНрд░рдХрд╛рд░реНрдп рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдмреНрд░реЗрдХрдкреЛрдЗрдиреНрдЯ рдореЗрдХрд╛рдирд┐рдЬрдо рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдкрдвреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдХрд╛рдЧрдЬрд╛рдд ╨╕ рд░рд╛рдореНрд░реЛ рдпрд╕ рд╡рд┐рд╖рдпрдорд╛ рд▓реЗрдЦред рдпрджрд┐ рддрдкрд╛рдЗрдБ рдорд╛ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╣рд░реВрдХреЛ рдХреЛрдб рд╣реЗрд░реНрдиреБрд╣реБрдиреНрдЫ рдмреАрд╕реАрд╕реА, рддреНрдпрд╕рдкрдЫрд┐ рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдХрд┐ рддрд┐рдиреАрд╣рд░реВрд╕рдБрдЧ рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ рдЫред рддреНрдпрд╕реЛрднрдП рдпрд╕ рд▓реЗрдЦрдорд╛ рд╣рд╛рдореА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддрд░реНрдХрд╣рд░реВ рдкрд╛рд░реНрд╕ рдЧрд░реНрди рдЫреЛрдбреНрдиреЗрдЫреМрдВ рд░ BPF рдХрд╛рд░реНрдпрдХреНрд░рдордорд╛ рдЬрд╛рдиреНрдЫреМрдВред

рдкрд╛рдЗрдерди рд▓рд┐рдкрд┐ рднрд┐рддреНрд░рдХреЛ eBPF рдкрд╛рда рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

bpf_text = тАЬтАЭтАЭ # Here will be the bpf program code тАЬтАЭтАЭ

рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рдмреАрдЪ рдбрд╛рдЯрд╛ рдЖрджрд╛рди рдкреНрд░рджрд╛рди рдЧрд░реНрди, eBPF рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВред рд╣рд╛рдореА рдкрдирд┐ рддреНрдпрд╕реНрддреИ рдЧрд░реНрдиреЗрдЫреМрдВред рд╣рд╛рдореА рдкреНрд░рдХреНрд░рд┐рдпрд╛ PID рдХреБрдЮреНрдЬреАрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ, рд░ рд╕рдВрд░рдЪрдирд╛рд▓рд╛рдИ рдорд╛рдирдХреЛ рд░реВрдкрдорд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрдиреЗрдЫреМрдВ:

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);
}

рдпрд╣рд╛рдБ рднрдирд┐рдПрдХреЛ рдкреНрд░рдХрд╛рд░реНрдпрдХреЛ рдкрд╣рд┐рд▓реЛ рдЖрд░реНрдЧреБрдореЗрдиреНрдЯрд▓рд╛рдИ рджреЛрд╕реНрд░реЛ рдЖрд░реНрдЧреБрдореЗрдиреНрдЯрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдЧрд░рд┐рдиреЗрдЫ generic_make_request()ред рдпрд╕ рдкрдЫрд┐, рд╣рд╛рдореАрд▓реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ PID рдкрд╛рдЙрдБрдЫреМрдВ рдЬрд╕рдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛ рд╣рд╛рдореАрд▓реЗ рдХрд╛рдо рдЧрд░рд┐рд░рд╣реЗрдХрд╛ рдЫреМрдВ, рд░ рдиреНрдпрд╛рдиреЛрд╕реЗрдХреЗрдиреНрдбрдорд╛ рд╣рд╛рд▓рдХреЛ рдЯрд╛рдЗрдорд╕реНрдЯреНрдпрд╛рдореНрдкред рд╣рд╛рдореА рдпреЛ рд╕рдмреИ рддрд╛рдЬрд╛ рдЪрдпрдирдорд╛ рд▓реЗрдЦреНрдЫреМрдВ struct data_t рдбрд╛рдЯрд╛ред рд╣рд╛рдореАрд▓реЗ рд╕рдВрд░рдЪрдирд╛рдмрд╛рдЯ рдбрд┐рд╕реНрдХ рдирд╛рдо рдкрд╛рдЙрдБрдЫреМрдВ рдЬреИрд╡, рдЬреБрди рдХрд▓ рдЧрд░реНрджрд╛ рдкрд╛рд╕ рд╣реБрдиреНрдЫ generic_make_request(), рд░ рдпрд╕рд▓рд╛рдИ рдПрдЙрдЯреИ рд╕рдВрд░рдЪрдирд╛рдорд╛ рдмрдЪрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН рдбрд╛рдЯрд╛ред рдЕрдиреНрддрд┐рдо рдЪрд░рдг рднрдиреЗрдХреЛ рдкрд╣рд┐рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдЧрд░рд┐рдПрдХреЛ рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдердкреНрдиреБ рд╣реЛред

рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рдлрд┐рд░реНрддрд╛ рдЧрд░реНрджрд╛ рдмреЛрд▓рд╛рдЗрдиреЗрдЫ 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 рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкрд╣рд┐рд▓реЗ рдиреИ рдЕрд╡рд╕реНрдерд┐рдд рд╕рдВрд░рдЪрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛ рдЦреЛрдЬреНрдЫреМрдВред рдпрджрд┐ рд╕рдВрд░рдЪрдирд╛ рдлреЗрд▓рд╛ рдкрд░реНрдпреЛ рднрдиреЗ, рд╣рд╛рдореА рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдирд╛рдо рдлреЗрд▓рд╛ рдкрд╛рд░реНрдЫреМрдВ рд░ рдпрд╕рд▓рд╛рдИ рдердкреНрдЫреМрдВред

рд╣рд╛рдореАрд▓реЗ рдпрд╣рд╛рдБ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдмрд╛рдЗрдирд░реА рд╢рд┐рдлреНрдЯ рдереНрд░реЗрдб GID рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рддреАред рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ PID рдЬреБрди рдереНрд░реЗрдбрдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛ рд╣рд╛рдореАрд▓реЗ рдХрд╛рдо рдЧрд░рд┐рд░рд╣реЗрдХрд╛ рдЫреМрдВред рд╣рд╛рдореАрд▓реЗ рдХрд▓ рдЧрд░реНрдиреЗ рдкреНрд░рдХрд╛рд░реНрдп bpf_get_current_pid_tgid() рдПрдХрд▓ 64-рдмрд┐рдЯ рдорд╛рдирдорд╛ рдереНрд░реЗрдбрдХреЛ GID рд░ PID рджреБрд╡реИ рдлрд░реНрдХрд╛рдЙрдБрдЫред

рдЯрд░реНрдорд┐рдирд▓рдорд╛ рдЖрдЙрдЯрдкреБрдЯ рдЧрд░реНрджрд╛, рд╣рд╛рдореА рд╣рд╛рд▓ рдереНрд░реЗрдбрдорд╛ рд░реБрдЪрд┐ рд░рд╛рдЦреНрджреИрдиреМрдВ, рддрд░ рд╣рд╛рдореА рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдорд╛ рд░реБрдЪрд┐ рд░рд╛рдЦреНрдЫреМрдВред рджрд┐рдЗрдПрдХреЛ рдереНрд░реЗрд╕рд╣реЛрд▓реНрдбрд╕рдБрдЧ рдирддрд┐рдЬрд╛ рдврд┐рд▓рд╛рдЗ рддреБрд▓рдирд╛ рдЧрд░реЗрдкрдЫрд┐, рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ рд╕рдВрд░рдЪрдирд╛ рдкрд╛рд╕ рдЧрд░реНрдЫреМрдВ рдбрд╛рдЯрд╛ рддрд╛рд▓рд┐рдХрд╛ рдорд╛рд░реНрдлрдд рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдард╛рдЙрдБрдорд╛ рдШрдЯрдирд╛рд╣рд░реВ, рдЬрд╕ рдкрдЫрд┐ рд╣рд╛рдореА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдореЗрдЯрд╛рдЙрдБрдЫреМрдВ p.

рдпреЛ рдХреЛрдб рд▓реЛрдб рдЧрд░реНрдиреЗ рдкрд╛рдЗрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯрдорд╛, рд╣рд╛рдореАрд▓реЗ 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 рдХрд╛рд░реНрдпрдХреНрд░рдо рдорд╛рд░реНрдлрдд рддрдпрд╛рд░ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ 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()

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдлреИ рдЙрдкрд▓рдмреНрдз рдЫ GITHubред рдпрд╕рд▓рд╛рдИ рдкрд░реАрдХреНрд╖рдг рдкреНрд▓реЗрдЯрдлрд░реНрдордорд╛ рдЪрд▓рд╛рдЙрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ рдЬрд╣рд╛рдБ fio рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЫ, bcache рдорд╛ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН, рд░ udevadm рдордирд┐рдЯрд░ рдХрд▓ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

eBPF/BCC рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЙрдЪреНрдЪ Ceph рд▓реЗрдЯрдиреНрд╕реА рджреЗрдЦрд┐ рдХрд░реНрдиреЗрд▓ рдкреНрдпрд╛рдЪ рд╕рдореНрдо
рдЕрдиреНрддрдорд╛! рдЕрдм рд╣рд╛рдореА рджреЗрдЦреНрдЫреМрдВ рдХрд┐ рд╕реНрдЯрд▓рд┐рдЩ bcache рдпрдиреНрддреНрд░ рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреЗ рдХреБрд░рд╛ рд╡рд╛рд╕реНрддрд╡рдорд╛ рд╕реНрдЯрд▓рд┐рдЩ рдХрд▓ рд╣реЛ generic_make_request() рдХреНрдпрд╛рд╕ рдбрд┐рд╕реНрдХ рдХреЛ рд▓рд╛рдЧреАред

рдХрд░реНрдиреЗрд▓рдорд╛ рдЦрдиреНрдиреБрд╣реЛрд╕реН

рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рд╛рд░рдгрдХреЛ рд╕рдордпрдорд╛ рд╡рд╛рд╕реНрддрд╡рдорд╛ рдХреЗ рдврд┐рд▓реЛ рднрдЗрд░рд╣реЗрдХреЛ рдЫ? рд╣рд╛рдореА рджреЗрдЦреНрдЫреМрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз рд▓реЗрдЦрд╛ рд╕реБрд░реБ рд╣реБрдиреБ рдЕрдШрд┐ рдиреИ рдврд┐рд▓рд╛рдЗ рд╣реБрдиреНрдЫ, рдЕрд░реНрдерд╛рддреНред рдпрд╕рдорд╛ (/proc/diskstats рд╡рд╛ iostat) рддрдереНрдпрд╛рдЩреНрдХрдХреЛ рдердк рдЖрдЙрдЯрдкреБрдЯрдХреЛ рд▓рд╛рдЧрд┐ рд╡рд┐рд╢реЗрд╖ рдЕрдиреБрд░реЛрдзрдХреЛ рд▓реЗрдЦрд╛рдЩреНрдХрди рдЕрдЭреИ рд╕реБрд░реБ рднрдПрдХреЛ рдЫреИрдиред рдпреЛ рд╕рдорд╕реНрдпрд╛ рдкреБрди: рдЙрддреНрдкрд╛рджрди рдЧрд░реНрджрд╛ iostat рдЪрд▓рд╛рдПрд░ рд╕рдЬрд┐рд▓реИ рдкреНрд░рдорд╛рдгрд┐рдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рд╡рд╛ BCC рд▓рд┐рдкрд┐ рдмрд╛рдпреЛрд▓реЗрдЯреЗрдВрд╕реА, рдЬреБрди рдЕрдиреБрд░реЛрдз рд▓реЗрдЦрд╛рдХреЛ рд╕реБрд░реБрд╡рд╛рдд рд░ рдЕрдиреНрддреНрдпрдорд╛ рдЖрдзрд╛рд░рд┐рдд рдЫред рдпреА рдХреБрдиреИ рдкрдирд┐ рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╣рд░реВрд▓реЗ рдХреНрдпрд╛рд╕ рдбрд┐рд╕реНрдХрдорд╛ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рджреЗрдЦрд╛рдЙрдБрджреИрдиред

рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдХрд╛рд░реНрдпрд▓рд╛рдИ рд╣реЗрд░реНрдЫреМрдВ generic_make_request(), рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рджреЗрдЦреНрдиреЗрдЫреМрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз рд▓реЗрдЦрд╛ рд╕реБрд░реБ рд╣реБрдиреБ рдЕрдШрд┐, рджреБрдИ рдердк рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рдмреЛрд▓рд╛рдЗрдиреНрдЫред рдкрд╣рд┐рд▓реЛ - generic_make_request_checks(), рдбрд┐рд╕реНрдХ рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛ рдЕрдиреБрд░реЛрдзрдХреЛ рд╡реИрдзрддрд╛рдорд╛ рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫред рджреЛрд╕реНрд░реЛ - blk_queue_enter(), рдЬрд╕рдорд╛ рд░реЛрдЪрдХ рдЪреБрдиреМрддреА рдЫ рдкреНрд░рддреАрдХреНрд╖рд╛_рдШрдЯрдирд╛_рдЕрд╡рд░реЛрдзреАрдп():

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    	|                                    	|

рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ рдХрд┐ рд╣рд╛рдореА рд╕рдорд╛рдзрд╛рдирдХреЛ рдирдЬрд┐рдХ рдЫреМрдВред рд▓рд╛рдо рдлреНрд░рд┐рдЬ/рдЕрдирдлреНрд░рд┐рдЬ рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреЗ рдХрд╛рд░реНрдпрд╣рд░реВ рд╣реБрдиреН blk_mq_freeze_queue ╨╕ blk_mq_unfreeze_queueред рддрд┐рдиреАрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ рдЬрдм рдпреЛ рдЕрдиреБрд░реЛрдз рд▓рд╛рдо рд╕реЗрдЯрд┐рдЩрд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреНрдЫ, рдЬреБрди рдпреЛ рд▓рд╛рдордорд╛ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдореНрднрд╛рд╡рд┐рдд рд░реВрдкрдорд╛ рдЦрддрд░рдирд╛рдХ рд╣реБрдиреНрдЫред рдлреЛрди рдЧрд░реНрджрд╛ blk_mq_freeze_queue() рд╕рдорд╛рд░реЛрд╣ blk_freeze_queue_start() рдХрд╛рдЙрдиреНрдЯрд░ рдмрдвреЗрдХреЛ рдЫ q->mq_freeze_depthред рдпрд╕ рдкрдЫрд┐, рдХрд░реНрдиреЗрд▓рд▓реЗ рд▓рд╛рдо рдЦрд╛рд▓реА рд╣реБрдирдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрдиреНрдЫ blk_mq_freeze_queue_wait().

рдпреЛ рд▓рд╛рдо рдЦрд╛рд▓реА рдЧрд░реНрди рд▓рд╛рдЧреНрдиреЗ рд╕рдордп рдбрд┐рд╕реНрдХ рд╡рд┐рд▓рдореНрдмрддрд╛рдХреЛ рдмрд░рд╛рдмрд░ рдЫ рдХрд┐рдирдХрд┐ рдХрд░реНрдиреЗрд▓рд▓реЗ рд╕рдмреИ рд▓рд╛рдордмрджреНрдз рдХрд╛рд░реНрдпрд╣рд░реВ рдкреВрд░рд╛ рд╣реБрдирдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрдиреНрдЫред рдПрдХ рдкрдЯрдХ рд▓рд╛рдо рдЦрд╛рд▓реА рднрдПрдкрдЫрд┐, рд╕реЗрдЯрд┐рдЩ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рд▓рд╛рдЧреВ рд╣реБрдиреНрдЫрдиреНред рдЬрд╕ рдкрдЫрд┐ рдпреЛ рднрдирд┐рдиреНрдЫ blk_mq_unfreeze_queue(), рдХрд╛рдЙрдиреНрдЯрд░ рдШрдЯрд╛рдЙрдБрджреИ рдлреНрд░рд┐рдЬ_рдЧрд╣рд┐рд░рд╛рдИ.

рдЕрдм рд╣рд╛рдореА рд╕реНрдерд┐рддрд┐ рд╕рдЪреНрдпрд╛рдЙрди рдкрд░реНрдпрд╛рдкреНрдд рдерд╛рд╣рд╛ рдЫред udevadm рдЯреНрд░рд┐рдЧрд░ рдЖрджреЗрд╢рд▓реЗ рдмреНрд▓рдХ рдпрдиреНрддреНрд░ рд▓рд╛рдЧреВ рдЧрд░реНрди рд╕реЗрдЯрд┐рдЩрд╣рд░реВ рдирд┐рдореНрддреНрдпрд╛рдЙрдБрдЫред рдпреА рд╕реЗрдЯрд┐рдЩрд╣рд░реВ udev рдирд┐рдпрдорд╣рд░реВрдорд╛ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫред рд╣рд╛рдореАрд▓реЗ sysfs рдорд╛рд░реНрдлрдд рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реЗрд░ рд╡рд╛ рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реЗрд░реЗрд░ рдХреБрди рд╕реЗрдЯрд┐рдЩрд╣рд░реВ рд▓рд╛рдо рдЬрдореНрдорд╛ рдЧрд░реНрджреИрдЫ рднрдиреЗрд░ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрди рд╕рдХреНрдЫреМрдВред рд╣рд╛рдореА BCC рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкрдирд┐ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ рдЯреНрд░реЗрд╕ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЬрд╕рд▓реЗ рдЯрд░реНрдорд┐рдирд▓рдорд╛ рдкреНрд░рддреНрдпреЗрдХ рдХрд▓рдХреЛ рд▓рд╛рдЧрд┐ рдХрд░реНрдиреЗрд▓ рд░ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╕реНрдкреЗрд╕ рд╕реНрдЯреНрдпрд╛рдХ рдЯреНрд░реЗрд╕рд╣рд░реВ рдЖрдЙрдЯрдкреБрдЯ рдЧрд░реНрдиреЗрдЫ blk_freeze_queue, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐:

~# /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 рдорд╛ рдЖрдзрд╛рд░рд┐рдд рдЕрдиреНрдп рд░реЛрдЪрдХ рдбрд┐рдмрдЧрд┐рдЩ рд░ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдЩ рдЙрдкрдХрд░рдгрд╣рд░реВ рдЫрдиреНред рддрд┐рдиреАрд╣рд░реБ рдордзреНрдпреЗ рдПрдЙрдЯрд╛ - bpftrace, рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдПрдХ-рд▓рд╛рдЗрдирд░ рд░ рд╕рд╛рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд╣рд░реВ awk-рдЬрд╕реНрддреЛ рднрд╛рд╖рд╛рдорд╛ рд▓реЗрдЦреНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рдЕрд░реНрдХреЛ - ebpf_exporter, рддрдкрд╛рдЗрдБрд▓рд╛рдИ рддрдкрд╛рдЗрдБрдХреЛ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕рд░реНрднрд░рдорд╛ рд╕реАрдзрд╛ рдХрдо-рд╕реНрддрд░, рдЙрдЪреНрдЪ-рд░рд┐рдЬреЛрд▓реНрдпреБрд╕рди рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ, рдкрдЫрд┐ рд╕реБрдиреНрджрд░ рджреГрд╢реНрдпрд╣рд░реВ рд░ рдЕрд▓рд░реНрдЯрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛рдХреЛ рд╕рд╛рдеред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди