рдИрдмреАрдкреАрдПрдл/рдмреАрд╕реАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд╛рдИ рд╕реЗрдл рд▓реЗрдЯреЗрдВрд╕реА рд╕реЗ рдХрд░реНрдиреЗрд▓ рдкреИрдЪ рддрдХ

рдИрдмреАрдкреАрдПрдл/рдмреАрд╕реАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд╛рдИ рд╕реЗрдл рд▓реЗрдЯреЗрдВрд╕реА рд╕реЗ рдХрд░реНрдиреЗрд▓ рдкреИрдЪ рддрдХ

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

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

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

рд╕реЗрдлрд╝ рдзреАрдорд╛ рд╣реИ

рд╕реЗрдл рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдПрдХ рдирдпрд╛ рд╣реЛрд╕реНрдЯ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЛ рдЗрд╕рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓реЗрдЦрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЧрддрд┐ рдЕрдиреНрдп рд╕рд░реНрд╡рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдереАред

рдИрдмреАрдкреАрдПрдл/рдмреАрд╕реАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд╛рдИ рд╕реЗрдл рд▓реЗрдЯреЗрдВрд╕реА рд╕реЗ рдХрд░реНрдиреЗрд▓ рдкреИрдЪ рддрдХ
рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрд╕ рд╣реЛрд╕реНрдЯ рдиреЗ bcache рдФрд░ рдирдП linux 4.15 рдХрд░реНрдиреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдерд╛ рдЬрдм рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рд╣реЛрд╕реНрдЯ рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдЙрд╕ рдХреНрд╖рдг рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдерд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреА рдЬрдбрд╝ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред

рдореЗрдЬрд╝рдмрд╛рди рдХреА рдЬрд╛рдБрдЪ

рдЖрдЗрдП рдпрд╣ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ рдХрд┐ рд╕реЗрдл-рдУрдПрд╕рдбреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдкрд░реНрдлрд╝ ╨╕ рдлреНрд▓реЗрдорд╕реНрдХреЛрдк (рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣рд╛рдВ):

рдИрдмреАрдкреАрдПрдл/рдмреАрд╕реАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд╛рдИ рд╕реЗрдл рд▓реЗрдЯреЗрдВрд╕реА рд╕реЗ рдХрд░реНрдиреЗрд▓ рдкреИрдЪ рддрдХ
рдЪрд┐рддреНрд░ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди fdatasync() рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд╡реНрдпрддреАрдд рд╣реБрдЖ рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХ_рдЕрдиреБрд░реЛрдз(). рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдУрдПрд╕рдбреА рдбреЗрдореЙрди рдХреЗ рдмрд╛рд╣рд░ рд╣реА рдХрд╣реАрдВ рд╣реИред рдпрд╣ рдпрд╛ рддреЛ рдХрд░реНрдиреЗрд▓ рдпрд╛ рдбрд┐рд╕реНрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред Iostat рдЖрдЙрдЯрдкреБрдЯ рдиреЗ bcache рдбрд┐рд╕реНрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдЙрдЪреНрдЪ рд╡рд┐рд▓рдВрдмрддрд╛ рджрд┐рдЦрд╛рдИред

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

рдмреАрд╕реАрд╕реА рдЯреВрд▓рдХрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдкрддрд╛ рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ, рдХрд░реНрдиреЗрд▓ (рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдореЗрдВ рд╕реЗрдлрд╝ рдбреЗрдореЙрди) рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рддрд╛ рд╣реИ рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХ_рдЕрдиреБрд░реЛрдз(). рдЖрдЗрдП рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЧрддрд┐ рдХреЛ рдорд╛рдкрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдореЗрдВ рдмреАрд╕реАрд╕реА рд╡рд╣рд╛рдБ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрджреНрднреБрдд рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдореМрдЬреВрдж рд╣реИ - funclatency. рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдмреАрдЪ 1 рд╕реЗрдХрдВрдб рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рде рдЙрд╕рдХреЗ рдкреАрдЖрдИрдбреА тАЛтАЛрджреНрд╡рд╛рд░рд╛ рдбреЗрдореЙрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдВрдЧреЗред

рдИрдмреАрдкреАрдПрдл/рдмреАрд╕реАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд╛рдИ рд╕реЗрдл рд▓реЗрдЯреЗрдВрд╕реА рд╕реЗ рдХрд░реНрдиреЗрд▓ рдкреИрдЪ рддрдХ
рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЖрдорддреМрд░ рдкрд░ рддреЗрдЬрд╝реА рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ. рдпрд╣ рдмрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдХрддрд╛рд░ рдореЗрдВ рднреЗрдЬ рджреЗрддрд╛ рд╣реИред

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

  • рдмреИрдХрд┐рдВрдЧ рдбрд┐рд╡рд╛рдЗрд╕ (рдХреИрд╢реНрдб рдбрд┐рд╕реНрдХ), рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдПрдХ рдзреАрдореА рдПрдЪрдбреАрдбреА рд╣реИ;
  • рдХреИрд╢рд┐рдВрдЧ рдбрд┐рд╡рд╛рдЗрд╕ (рдХреИрд╢рд┐рдВрдЧ рдбрд┐рд╕реНрдХ), рдпрд╣рд╛рдВ рдпрд╣ 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/'

рддреАрд╕рд░рд╛ рдХреЙрд▓рдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкреАрдкреАрдЖрдИрдбреА тАЛтАЛ(рдореВрд▓ рдкреАрдЖрдИрдбреА) рд╣реИред рдкреАрдЖрдИрдбреА тАЛтАЛ5802 рдХреЗ рд╕рд╛рде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣рдорд╛рд░реА рдирд┐рдЧрд░рд╛рдиреА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдзрд╛рдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрди рдЧрдИред рдирд┐рдЧрд░рд╛рдиреА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╕рдордп, рдЧрд▓рдд рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рдП рдЧрдПред рдПрдЪрдмреАрдП рдПрдбреЙрдкреНрдЯрд░ рдХрд╛ рддрд╛рдкрдорд╛рди рд╣рд░ 30 рд╕реЗрдХрдВрдб рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛, рдЬреЛ рдХрд┐ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╣реИред рдЪреЗрдХ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рд▓рдВрдмреЗ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдЗрд╕ рд╣реЛрд╕реНрдЯ рдкрд░ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рд▓рдВрдмрддрд╛ рдЕрдм рдЕрдиреНрдп рд╣реЛрд╕реНрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред

рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ bcache рдбрд┐рд╡рд╛рдЗрд╕ рдЗрддрдирд╛ рдзреАрдорд╛ рдХреНрдпреЛрдВ рдерд╛ред рд╣рдордиреЗ рдПрдХ рд╕рдорд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдФрд░ bcache рдкрд░ fio рдЪрд▓рд╛рдХрд░, рд╕рдордп-рд╕рдордп рдкрд░ uevents рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП udevadm рдЯреНрд░рд┐рдЧрд░ рдЪрд▓рд╛рдХрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред

рдмреАрд╕реАрд╕реА-рдЖрдзрд╛рд░рд┐рдд рдЙрдкрдХрд░рдг рд▓рд┐рдЦрдирд╛

рдЖрдЗрдП рд╕рдмрд╕реЗ рдзреАрдореА рдХреЙрд▓реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХ_рдЕрдиреБрд░реЛрдз(). рд╣рдореЗрдВ рдЙрд╕ рдбреНрд░рд╛рдЗрд╡ рдХреЗ рдирд╛рдо рдореЗрдВ рднреА рд░реБрдЪрд┐ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

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

  • рдкрдВрдЬреАрдХрд░рдг рдХрд░рд╡рд╛рдирд╛ kprobe рдкрд░ рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХ_рдЕрдиреБрд░реЛрдз():
    • рд╣рдо рдбрд┐рд╕реНрдХ рдирд╛рдо рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
    • рд╣рдо рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред

  • рдкрдВрдЬреАрдХрд░рдг рдХрд░рд╡рд╛рдирд╛ cretprobe рд╕реЗ рд╡рд╛рдкрд╕реА рдХреЗ рд▓рд┐рдП рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХ_рдЕрдиреБрд░реЛрдз():
    • рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдорд┐рд▓рддрд╛ рд╣реИ;
    • рд╣рдо рд╕рд╣реЗрдЬреЗ рдЧрдП рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рд╡рд░реНрддрдорд╛рди рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ;
    • рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд╣рдо рд╕рд╣реЗрдЬреЗ рдЧрдП рдбрд┐рд╕реНрдХ рдирд╛рдо рдХреЛ рдвреВрдВрдврддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

Kprobes ╨╕ cretprobes рддреБрд░рдВрдд рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рддреБрдо рдкрдврд╝ рд╕рдХрддреЗ рд╣реЛ рдкреНрд░рд▓реЗрдЦрди ╨╕ рдЕрдЪреНрдЫрд╛ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЖрд▓реЗрдЦ. рдпрджрд┐ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЗ рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдмреАрд╕реАрд╕реА, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХреА рд╕рдВрд░рдЪрдирд╛ рдПрдХ рд╕рдорд╛рди рд╣реИред рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ рдФрд░ рдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкрд░ рд╣реА рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред

рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдВрджрд░ 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);

рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ p, рдХреБрдВрдЬреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде u64 рдФрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдорд╛рди рд╕рдВрд░рдЪрдирд╛ рдбреЗрдЯрд╛_t. рддрд╛рд▓рд┐рдХрд╛ рд╣рдорд╛рд░реЗ рдмреАрдкреАрдПрдл рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧреАред BPF_PERF_OUTPUT рдореИрдХреНрд░реЛ рдПрдХ рдЕрдиреНрдп рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдШрдЯрдирд╛рдУрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ.

рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░ рдЙрд╕рд╕реЗ рд▓реМрдЯрдиреЗ рдХреЗ рдмреАрдЪ, рдпрд╛ рд╡рд┐рднрд┐рдиреНрди рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХреЙрд▓ рдХреЗ рдмреАрдЪ рджреЗрд░реА рдХреЛ рдорд╛рдкрддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдПрдХ рд╣реА рд╕рдВрджрд░реНрдн рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдирд╛рдВрддрд░ рд▓реЙрдиреНрдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрдиреЗ рдХреЗ рдмреАрдЪ рд╡рд┐рд▓рдВрдмрддрд╛ рдХреЛ рдорд╛рдкрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╡рддрдГ рдмреЗрдХрд╛рд░ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛ рдмрд╛рдпреЛрд▓реЗрдЯреЗрдВрд╕реА рдЙрдкрдпреЛрдЧрд┐рддрд╛, рдЬрд╣рд╛рдВ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХреБрдВрдЬреА рдХреЛ рдПрдХ рд╕реВрдЪрдХ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╕рдВрд░рдЪрдирд╛ рдЕрдиреБрд░реЛрдз, рдЬреЛ рдПрдХ рдбрд┐рд╕реНрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рд╡рд╣ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЕрдзреНрдпрдпрди рдХреЗ рддрд╣рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдЪрд▓реЗрдЧрд╛:

void start(struct pt_regs *ctx, struct bio *bio) {
	u64 pid = bpf_get_current_pid_tgid();
	struct data_t data = {};
	u64 ts = bpf_ktime_get_ns();
	data.pid = pid;
	data.ts = ts;
	bpf_probe_read_str(&data.disk, sizeof(data.disk), (void*)bio->bi_disk->disk_name);
	p.update(&pid, &data);
}

рдпрд╣рд╛рдВ рдХреЙрд▓ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХ_рдЕрдиреБрд░реЛрдз(). рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЬрд┐рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕рдХреА рдкреАрдЖрдИрдбреА тАЛтАЛрдФрд░ рдиреИрдиреЛрд╕реЗрдХрдВрдб рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдпрд╣ рд╕рдм рдирдП рд╕рд┐рд░реЗ рд╕реЗ рдЪрдпрдирд┐рдд рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рд╕рдВрд░рдЪрдирд╛ рдбреЗрдЯрд╛_рдЯреА рдбреЗрдЯрд╛. рд╣рдореЗрдВ рдбрд┐рд╕реНрдХ рдХрд╛ рдирд╛рдо рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреИрд╡, рдЬреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХ_рдЕрдиреБрд░реЛрдз(), рдФрд░ рдЗрд╕реЗ рдЙрд╕реА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ рддрд┐рдерд┐. рдЕрдВрддрд┐рдо рдЪрд░рдг рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝рдирд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╕реЗ рд▓реМрдЯрдиреЗ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХ_рдЕрдиреБрд░реЛрдз():

void stop(struct pt_regs *ctx) {
    u64 pid = bpf_get_current_pid_tgid();
    u64 ts = bpf_ktime_get_ns();
    struct data_t* data = p.lookup(&pid);
    if (data != 0 && data->ts > 0) {
        bpf_get_current_comm(&data->comm, sizeof(data->comm));
        data->lat = (ts - data->ts)/1000;
        if (data->lat > MIN_US) {
            FACTOR
            data->pid >>= 32;
            events.perf_submit(ctx, data, sizeof(struct data_t));
        }
        p.delete(&pid);
    }
}

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреЗ рд╕рдорд╛рди рд╣реИ: рд╣рдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдкреАрдЖрдИрдбреА тАЛтАЛрдФрд░ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдирдИ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдХреБрдВрдЬреА == рд╡рд░реНрддрдорд╛рди рдкреАрдЖрдИрдбреА тАЛтАЛрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдЦреЛрдЬрддреЗ рд╣реИрдВред рдпрджрд┐ рд╕рдВрд░рдЪрдирд╛ рдорд┐рд▓ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдо рдЪрд▓ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдирд╛рдо рдвреВрдВрдврддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдВ рд╣рдо рдЬрд┐рд╕ рдмрд╛рдЗрдирд░реА рд╢рд┐рдлреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рдереНрд░реЗрдб рдЬреАрдЖрдИрдбреА тАЛтАЛрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╡реЗред рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдкреАрдЖрдИрдбреА тАЛтАЛрдЬрд┐рд╕рдиреЗ рдереНрд░реЗрдб рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд┐рд╕рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣рдо рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЬрд┐рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣рдо рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ 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")

рд╣рдореЗрдВ рднреА рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рд╕рдВрд░рдЪрдирд╛ рдбреЗрдЯрд╛_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 рдореЙрдирд┐рдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ:

рдИрдмреАрдкреАрдПрдл/рдмреАрд╕реАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд╛рдИ рд╕реЗрдл рд▓реЗрдЯреЗрдВрд╕реА рд╕реЗ рдХрд░реНрдиреЗрд▓ рдкреИрдЪ рддрдХ
рдЕрдВрдд рдореЗрдВ! рдЕрдм рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЬреЛ рд░реБрдХрд╛ рд╣реБрдЖ bcache рдбрд┐рд╡рд╛рдЗрд╕ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рдерд╛ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд░реБрдХреА рд╣реБрдИ рдХреЙрд▓ рд╣реИ рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХ_рдЕрдиреБрд░реЛрдз() рдХреИрд╢реНрдб рдбрд┐рд╕реНрдХ рдХреЗ рд▓рд┐рдП.

рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдЦреЛрджреЛ

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

рдпрджрд┐ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЗрдЦреЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХ_рдЕрдиреБрд░реЛрдз(), рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЕрдиреБрд░реЛрдз рд▓реЗрдЦрд╛рдВрдХрди рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рджреЛ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ - рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХ_рдЕрдиреБрд░реЛрдз_рдЪреЗрдХ(), рдбрд┐рд╕реНрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреА рд╡реИрдзрддрд╛ рдкрд░ рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ - 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 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдХреЗ рдпрд╛ рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦрдХрд░ рдлреНрд░реАрдЬ рдХрд░ рд░рд╣реА рд╣реИрдВред рд╣рдо рдмреАрд╕реАрд╕реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рднреА рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ рдирд┐рд╢рд╛рди, рдЬреЛ рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдФрд░ рдпреВрдЬрд░рд╕реНрдкреЗрд╕ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛ 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 рдИрд╡реЗрдВрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдХрд░реНрдиреЗрд▓ рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рди рд╣реЛ рддреЛ рдЕрдиреБрд░реЛрдз рдХрддрд╛рд░ рдХреЛ рдлреНрд░реАрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреАрди рдЫреЛрдЯрд╛ рдкреНрд░рддрд┐рдмрджреНрдз рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд░реЗрдВ.

рдирд┐рд╖реНрдХрд░реНрд╖

eBPF рдПрдХ рдмрд╣реБрдд рд╣реА рд▓рдЪреАрд▓рд╛ рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИред рд▓реЗрдЦ рдореЗрдВ рд╣рдордиреЗ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдорд╛рдорд▓реЗ рдХреЛ рджреЗрдЦрд╛ рдФрд░ рдЬреЛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЙрд╕рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдк рдмреАрд╕реАрд╕реА рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рджреЗрдЦрдиреЗ рд▓рд╛рдпрдХ рд╣реИ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓, рдЬреЛ рдореВрд▓ рдмрд╛рддреЛрдВ рдХрд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ