eBPF/BCC рд╡рд╛рдкрд░реВрди рдЙрдЪреНрдЪ Ceph рд▓реЗрдЯрдиреНрд╕реА рдкрд╛рд╕реВрди рдХрд░реНрдирд▓ рдкреЕрдЪ рдкрд░реНрдпрдВрдд

eBPF/BCC рд╡рд╛рдкрд░реВрди рдЙрдЪреНрдЪ Ceph рд▓реЗрдЯрдиреНрд╕реА рдкрд╛рд╕реВрди рдХрд░реНрдирд▓ рдкреЕрдЪ рдкрд░реНрдпрдВрдд

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

рдПрдХ рджреЛрди рд╡рд░реНрд╖рд╛рдВрдкреВрд░реНрд╡реА рд╣реЛрддреЗ рджреБрд╕рд░реЗ рд╕рд╛рдзрди рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗ - eBPF. рд╣реЗ рдХрдореА рдУрд╡реНрд╣рд░рд╣реЗрдбрд╕рд╣ рдХрд░реНрдирд▓ рдЖрдгрд┐ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╢реЛрдзрдгреЗ рд╢рдХреНрдп рдХрд░рддреЗ рдЖрдгрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕рдЪреА рдкреБрдирд░реНрдмрд╛рдВрдзрдгреА рдЖрдгрд┐ рдХрд░реНрдирд▓рдордзреНрдпреЗ рддреГрддреАрдп-рдкрдХреНрд╖ рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рдареЗрд╡рддрд╛.

рдИрдмреАрдкреАрдПрдл рд╡рд╛рдкрд░рдгрд╛рд░реНтАНрдпрд╛ рдЕрдиреЗрдХ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдпреБрдЯрд┐рд▓рд┐рдЯреАрдЬ рдЖрдзреАрдЪ рдЖрд╣реЗрдд рдЖрдгрд┐ рдпрд╛ рд▓реЗрдЦрд╛рдд рдЖрдореНрд╣реА рд▓рд╛рдпрдмреНрд░рд░реАрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рддреБрдордЪреА рд╕реНрд╡рддрдГрдЪреА рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдпреБрдЯрд┐рд▓рд┐рдЯреА рдХрд╢реА рд▓рд┐рд╣рд╛рдпрдЪреА рддреЗ рдкрд╛рд╣реВ. PythonBCC. рд▓реЗрдЦ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдШрдЯрдирд╛рдВрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЖрд╣реЗ. рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рд╕реНрдерд┐рддреАрдВрдордзреНрдпреЗ рд╡рд┐рджреНрдпрдорд╛рди рдЙрдкрдпреБрдХреНрддрддрд╛ рдХрд╢рд╛ рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрддрд╛рдд рд╣реЗ рджрд╛рдЦрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рд╕рдорд╕реНрдпреЗрдкрд╛рд╕реВрди рдирд┐рд░рд╛рдХрд░рдгрд╛рдХрдбреЗ рдЬрд╛рдК.

рд╕реЗрдл рдордВрдж рдЖрд╣реЗ

Ceph рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рдПрдХ рдирд╡реАрди рд╣реЛрд╕реНрдЯ рдЬреЛрдбрд▓рд╛ рдЧреЗрд▓рд╛ рдЖрд╣реЗ. рддреНрдпрд╛рдд рдХрд╛рд╣реА рдбреЗрдЯрд╛ рд╕реНрдерд▓рд╛рдВрддрд░рд┐рдд рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЖрдордЪреНрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдЖрд▓реЗ рдХреА рддреНрдпрд╛рджреНрд╡рд╛рд░реЗ рд▓реЗрдЦрди рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреНрдпрд╛рдЪрд╛ рд╡реЗрдЧ рдЗрддрд░ рд╕рд░реНрд╡реНрд╣рд░рдЪреНрдпрд╛ рддреБрд▓рдиреЗрдд рдЦреВрдкрдЪ рдХрдореА рд╣реЛрддрд╛.

eBPF/BCC рд╡рд╛рдкрд░реВрди рдЙрдЪреНрдЪ Ceph рд▓реЗрдЯрдиреНрд╕реА рдкрд╛рд╕реВрди рдХрд░реНрдирд▓ рдкреЕрдЪ рдкрд░реНрдпрдВрдд
рдЗрддрд░ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдордЪреНрдпрд╛ рд╡рд┐рдкрд░реАрдд, рдпрд╛ рд╣реЛрд╕реНрдЯрдиреЗ bcache рдЖрдгрд┐ рдирд╡реАрди linux 4.15 рдХрд░реНрдирд▓ рд╡рд╛рдкрд░рд▓реЗ. рдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪрд╛ рдпрдЬрдорд╛рди рдпреЗрдереЗ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рд╣реА рдкрд╣рд┐рд▓реАрдЪ рд╡реЗрд│ рд╣реЛрддреА. рдЖрдгрд┐ рддреНрдпрд╛ рдХреНрд╖рдгреА рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдЭрд╛рд▓реЗ рдХреА рд╕рдорд╕реНрдпреЗрдЪреЗ рдореВрд│ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХрджреГрд╖реНрдЯреНрдпрд╛ рдХрд╛рд╣реАрд╣реА рдЕрд╕реВ рд╢рдХрддреЗ.

рд╣реЛрд╕реНрдЯрдЪреА рдЪреМрдХрд╢реА рдХрд░рдд рдЖрд╣реЗ

рд╕реЗрдл-рдУрдПрд╕рдбреА рдкреНрд░рдХреНрд░рд┐рдпреЗрдордзреНрдпреЗ рдХрд╛рдп рд╣реЛрддреЗ рддреЗ рдмрдШреВрди рд╕реБрд░реБрд╡рд╛рдд рдХрд░реВрдпрд╛. рдпрд╛рд╕рд╛рдареА рдЖрдкрдг рд╡рд╛рдкрд░рдгрд╛рд░ рдЖрд╣реЛрдд рдкрд░рдл ╨╕ рдлреНрд▓реЗрдорд╕реНрдХреЛрдк (рдЬреНрдпрд╛рдмрджреНрджрд▓ рдЖрдкрдг рдЕрдзрд┐рдХ рд╡рд╛рдЪреВ рд╢рдХрддрд╛ рдпреЗрдереЗ):

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

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

BCC рдЯреВрд▓рдХрд┐рдЯ рд╡рд╛рдкрд░рдгреЗ

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

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 рдЪрд╛рд▓рд╡реВрди, uevents рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд┐рдпрдорд┐рддрдкрдгреЗ udevadm рдЯреНрд░рд┐рдЧрд░ рдЪрд╛рд▓рд╡реВрди рд╕рдорд╕реНрдпрд╛ рдкреБрдирд░реБрддреНрдкрд╛рджрд┐рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛.

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 рдЖрдгрд┐ рдкреНрд░рдХрд╛рд░рд╛рдЪреЗ рдореВрд▓реНрдп рд╕рдВрд░рдЪрдирд╛ рдбреЗрдЯрд╛_рдЯреА. рдЖрдордЪреНрдпрд╛ 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 рдЖрдгрд┐ рдЯрд╛рдЗрдорд╕реНрдЯреЕрдореНрдк рд╢реЛрдзрддреЛ, рдкрд░рдВрддреБ рдирд╡реАрди рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░рд╕рд╛рдареА рдореЗрдорд░реА рд╡рд╛рдЯрдк рдХрд░рдд рдирд╛рд╣реА. рддреНрдпрд╛рдРрд╡рдЬреА, рдХреА == рдЪрд╛рд▓реВ рдкреАрдЖрдпрдбреА рд╡рд╛рдкрд░реВрди рдЖрдзреАрдкрд╛рд╕реВрди рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░рд╕рд╛рдареА рд╣реЕрд╢ рдЯреЗрдмрд▓ рд╢реЛрдзрддреЛ. рдЬрд░ рд░рдЪрдирд╛ рд╕рд╛рдкрдбрд▓реА, рддрд░ рдЖрдкрдг рдЪрд╛рд▓реВ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреЗ рдирд╛рд╡ рд╢реЛрдзреВрди рддреНрдпрд╛рд╕ рдЬреЛрдбрддреЛ.

рдЖрдореНрд╣реА рдпреЗрдереЗ рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реЗрд▓реА рдмрд╛рдпрдирд░реА рд╢рд┐рдлреНрдЯ рдереНрд░реЗрдб GID рдорд┐рд│рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рддреНрдпрд╛ рдЖрдореНрд╣реА рдЬреНрдпрд╛ рд╕рдВрджрд░реНрднрд╛рдд рдХрд╛рдо рдХрд░рдд рдЖрд╣реЛрдд рддреНрдпрд╛ рд╕рдВрджрд░реНрднрд╛рдд рдзрд╛рдЧрд╛ рд╕реБрд░реВ рдХрд░рдгрд╛рд▒реНрдпрд╛ рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪрд╛ PID. рдЬреНрдпрд╛ рдлрдВрдХреНрд╢рдирд▓рд╛ рдЖрдкрдг рдХреЙрд▓ рдХрд░рддреЛ bpf_get_current_pid_tgid() рдереНрд░реЗрдбрдЪрд╛ GID рдЖрдгрд┐ PID рджреЛрдиреНрд╣реА рдПрдХрд╛рдЪ 64-рдмрд┐рдЯ рдореВрд▓реНрдпрд╛рдордзреНрдпреЗ рдкрд░рдд рдХрд░рддреЛ.

рдЯрд░реНрдорд┐рдирд▓рд╡рд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛рдирд╛, рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рдзреНрдпрд╛ рдереНрд░реЗрдбрдордзреНрдпреЗ рд╕реНрд╡рд╛рд░рд╕реНрдп рдирд╛рд╣реА, рдкрд░рдВрддреБ рдЖрдореНрд╣рд╛рд▓рд╛ рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпреЗрдордзреНрдпреЗ рд░рд╕ рдЖрд╣реЗ. рджрд┐рд▓реЗрд▓реНрдпрд╛ рдереНрд░реЗрд╢реЛрд▓реНрдбрд╕рд╣ рдкрд░рд┐рдгрд╛рдореА рд╡рд┐рд▓рдВрдмрд╛рдЪреА рддреБрд▓рдирд╛ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЖрдореНрд╣реА рдЖрдордЪреА рд░рдЪрдирд╛ рдкрд╛рд╕ рдХрд░рддреЛ рдбреЗрдЯрд╛ рдЯреЗрдмрд▓рджреНрд╡рд╛рд░реЗ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕рдордзреНрдпреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо, рдЬреНрдпрд╛рдирдВрддрд░ рдЖрдореНрд╣реА рдПрдВрдЯреНрд░реА рд╣рдЯрд╡рддреЛ 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 рдореЕрдХреНрд░реЛ рдЖрдгрд┐ рдирдореБрдиреЗ рдиреЛрдВрджрд╡рд╛:

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

рдЖрдореНрд╣рд╛рд▓рд╛рд╣реА рдард░рд╡рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ рд╕рдВрд░рдЪрдирд╛ рдбреЗрдЯрд╛_рдЯреА рдЖрдордЪреНрдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдордзреНрдпреЗ, рдЕрдиреНрдпрдерд╛ рдЖрдореНрд╣реА рдХрд╛рд╣реАрд╣реА рд╡рд╛рдЪреВ рд╢рдХрдгрд╛рд░ рдирд╛рд╣реА:

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(), рдХрд╛рдЙрдВрдЯрд░ рдХрдореА рдХрд░рдгреЗ freeze_depth.

рдЖрддрд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рдкрд░рд┐рд╕реНрдерд┐рддреА рд╕реБрдзрд╛рд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреБрд░реЗрд╕реЗ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ. 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 рдпреБрдЯрд┐рд▓рд┐рдЯреАрдЬ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдгреНрдпрд╛рдд рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реНрдпрд╛рд╕, рддреЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ рдЕрдзрд┐рдХреГрдд рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓, рдЬреЗ рдореВрд▓рднреВрдд рдЧреЛрд╖реНрдЯреАрдВрдЪреЗ рдЪрд╛рдВрдЧрд▓реЗ рд╡рд░реНрдгрди рдХрд░рддреЗ.

рдИрдмреАрдкреАрдПрдлрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЗрддрд░ рдордиреЛрд░рдВрдЬрдХ рдбреАрдмрдЧрд┐рдВрдЧ рдЖрдгрд┐ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рд╕рд╛рдзрдиреЗ рдЖрд╣реЗрдд. рддреНрдпрд╛рдВрдЪреНрдпрд╛рдкреИрдХреА рдПрдХ - bpftrace, рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ awk рд╕рд╛рд░рдЦреНрдпрд╛ рднрд╛рд╖реЗрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рди-рд▓рд╛рдЗрдирд░ рдЖрдгрд┐ рдЫреЛрдЯреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рд╣реВ рджреЗрддреЗ. рдЖрдгрдЦреА рдПрдХ - ebpf_exporter, рддреБрдореНрд╣рд╛рд▓рд╛ рдирдВрддрд░ рд╕реБрдВрджрд░ рд╡реНрд╣рд┐рдЬреНрдпреБрдЕрд▓рд╛рдпрдЭреЗрд╢рди рдЖрдгрд┐ рдЕрдЧрджреА рдЕрд▓рд░реНрдЯ рдорд┐рд│рд╡рдгреНрдпрд╛рдЪреНрдпрд╛ рдХреНрд╖рдорддреЗрд╕рд╣, рддреБрдордЪреНрдпрд╛ рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рд╕рд░реНрд╡реНрд╣рд░рдордзреНрдпреЗ рдереЗрдЯ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп, рдЙрдЪреНрдЪ-рд░рд┐рдЭреЛрд▓реНрдпреВрд╢рди рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛