Linux рдореЗрдВ eBPF рдФрд░ bpftrace рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдлреБрд▓ рдбрд╛рдпрдиреЗрдорд┐рдХ рдЯреНрд░реЗрд╕рд┐рдВрдЧ



рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ, "рдЯреНрд░реЗрд╕ рдореЛрдб рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдЗрд╕ рдЪрд░рдг рдкрд░ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдЕрдиреБрдХреНрд░рдо рдФрд░ рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред" рдЦреБрдж рд▓рд┐рдирдХреНрд╕ рдХреЗ рдкреНрд░рд╢рдВрд╕рдХ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рд╕рд╡рд╛рд▓ рдкрд░ рдЖрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдХрд░рдг рд╕рд░реНрд╡реЛрддреНрддрдо рд╣реИрдВред рдФрд░ рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реЛрдВрдЧрд▓реЗ рд▓рд╛рдИ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд▓реЗрдЦ рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ bpftrace рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ: "bpftrace is the future"ред рддреЛ рдЙрдиреНрд╣реЛрдВрдиреЗ рд▓рд╛рдИ рдХреЗ рд╕рд╣рдпреЛрдЧреА рдХреЛ рдЗрддрдирд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХреНрдпреЛрдВ рдХрд┐рдпрд╛? рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдЬрд╡рд╛рдмред

рд▓рд┐рдирдХреНрд╕ рдкрд░ рджреЛ рдореБрдЦреНрдп рдЯреНрд░реЗрд╕ рдЙрдкрдХрд░рдг рд╣реИрдВ:
рд╕реНрдЯреНрд░реЗрд╕ рдЖрдкрдХреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ;
ltrace рдЖрдкрдХреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

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

2019 рдореЗрдВ, рд╣рдореЗрдВ рдЕрдВрддрддрдГ Linux: bpftrace рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЗрди рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЬрд╡рд╛рдм рдорд┐рд▓рд╛ред Bpftrace рдЖрдкрдХреЛ рдЫреЛрдЯреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╣рд░ рдмрд╛рд░ рдПрдХ рдШрдЯрдирд╛ рд╣реЛрддреА рд╣реИред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╡рд░реНрдгрди рдХрд░реВрдБрдЧрд╛ рдХрд┐ bpftrace рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рдореВрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рдХреИрд╕реЗ рд╕рд┐рдЦрд╛рдПрдБред рдореИрдВ рдпрд╣ рднреА рдмрддрд╛рдКрдБрдЧрд╛ рдХрд┐ рдЯреНрд░реЗрд╕ рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдИрдПрдлрд╝рдкреАрдПрдл рдХреНрдпрд╛ рд╣реИ?") рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдФрд░ рдХреИрд╕реЗ рдпрд╣ рдЖрдЬ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИред



рдЯреНрд░реЗрд╕ рдХреНрдпрд╛ рд╣реИ?


рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, bpftrace рдЖрдкрдХреЛ рдЫреЛрдЯреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╣рд░ рдмрд╛рд░ рдПрдХ рдШрдЯрдирд╛ рд╣реЛрддреА рд╣реИред

рдПрдХ рдШрдЯрдирд╛ рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЯрд╛рдЗрдорд░ рдпрд╛ рдПрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдШрдЯрдирд╛ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "50 рдПрдордПрд╕ рдПрдХ рд╣реА рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЖрдЦрд┐рд░реА рдХреЗ рдмрд╛рдж рд╕реЗ рдкрд╛рд░рд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ", "рдкреГрд╖реНрда рд╡рд┐рдлрд▓рддрд╛ рд╣реБрдИ", "рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рд╣реБрдЖ" рдпрд╛ "рдХрд╛рд╢-рдорд┐рд╕ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реБрдЖ"ред

рдХрд┐рд╕реА рдШрдЯрдирд╛ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЖрдк рдХреБрдЫ рдкреНрд░рддрд┐рдЬреНрдЮрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╢реЗрд▓ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрджрд░реНрдн рдЬрд╛рдирдХрд╛рд░реА рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдЧреА, рдЬреИрд╕реЗ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдкреАрдЖрдИрдбреА, рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕, рд╕рдордп, рдХреЙрд▓ рддрд░реНрдХ, рд╡рд╛рдкрд╕реА рдорд╛рди рдЖрджрд┐ред

рдХрдм рдХрд░реЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓? рдмрд╣реБрддреЛрдВ рдореЗрдВред рдЖрдк рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдмрд╕реЗ рдзреАрдореА рдХреЙрд▓ рдХреА рд╕реВрдЪреА рдХрд╛ рд╕рдВрдХрд▓рди рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдзреАрдорд╛ рдХреНрдпреЛрдВ рд╣реИред рдЖрдк рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдореЗрдореЛрд░реА рд▓реАрдХ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХрд╣рд╛рдВред рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд░реВрдмреА рдЗрддрдиреА рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рддреА рд╣реИред

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

DTrace: рдЯреНрд░реЗрд╕ рдХрд╛ рдкрд┐рддрд╛


рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрд░реЗрдЦрдг рдЙрдкрдХрд░рдг DTrace рдерд╛, рдПрдХ рдкреВрд░реНрдг рдЧрддрд┐рд╢реАрд▓ рдЕрдиреБрд░реЗрдЦрдг рдврд╛рдВрдЪрд╛ рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рди рдорд╛рдЗрдХреНрд░реЛрд╕рд┐рд╕реНрдЯрдореНрд╕ (рдЬрд╛рд╡рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ) рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред Bpftrace рдХреА рддрд░рд╣, DTrace рдЖрдкрдХреЛ рдЫреЛрдЯреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЗ рдХрдИ рдкреНрд░рдореБрдЦ рддрддреНрд╡ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдмреНрд░реЗрдВрдбрди рдЧреНрд░реЗрдЧ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЬреЛ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз DTrace рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реИрдВ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдиреЗрдЯрдлреНрд▓рд┐рдХреНрд╕ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЬреЛ DTrace рдФрд░ bpftrace рдХреЗ рдмреАрдЪ рд╕рдорд╛рдирддрд╛ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред


рдПрд╕ред рддреНрд░рд┐рдкрд╛рдареА, рд╕рди рдорд╛рдЗрдХреНрд░реЛрд╕рд┐рд╕реНрдЯрдореНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕реЛрд▓рд╛рд░рд┐рд╕ рд░рд┐рдЯреНрд░реЗрд╕ рдкрд░рд┐рдЪрдп (2009)

рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рд╕реВрд░реНрдп рдиреЗ DTrace рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдЦреЛрд▓рд╛ред рдЖрдЬ, DTrace Solaris, FreeBSD, рдФрд░ macOS рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ macOS рд╕рдВрд╕реНрдХрд░рдг рдЖрдорддреМрд░ рдкрд░ рдЕрдХреНрд╖рдо рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдЗрдВрдЯреАрдЧреНрд░рд┐рдЯреА рдкреНрд░реЛрдЯреЗрдХреНрд╢рди, SIP, рдХрдИ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рддреЛрдбрд╝ рдЪреБрдХрд╛ рд╣реИ рдЬреЛ DTrace рдЪрд▓рддрд╛ рд╣реИ)ред

рд╣рд╛рдВ, рдЖрдкрдиреЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рджреЗрдЦрд╛ ... рд▓рд┐рдирдХреНрд╕ рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХреА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред DTD рдХреЛ GPL рдХреЗ рдмрдЬрд╛рдп CDDL рдХреЗ рддрд╣рдд рдЦреЛрд▓рд╛ рдЧрдпрд╛ рдерд╛ред рд▓рд┐рдирдХреНрд╕ DTrace рдкреЛрд░реНрдЯ 2011 рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрднреА рднреА рдкреНрд░рдореБрдЦ рд▓рд┐рдирдХреНрд╕ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред 2018 рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдУрд░реЗрдХрд▓ рдиреЗ рдЬреАрдкреАрдПрд▓ рдХреЗ рддрд╣рдд рд░рд┐рдЯреНрд░реЗрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓ рджрд┐рдпрд╛ , рд▓реЗрдХрд┐рди рддрдм рддрдХ рдкрд╣рд▓реЗ рд╣реА рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рдЪреБрдХреА рдереАред

рд▓рд┐рдирдХреНрд╕ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо


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

рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдХрд╛рд░рдг, рдпрд╣ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдереЛрдбрд╝рд╛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЬреВрд▓рд┐рдпрд╛ рдЗрд╡рд╛рдВрд╕ рдиреЗ рдЗрд╕ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ (рдзреНрдпрд╛рди, рдкреНрд░рдХрд╛рд╢рди рдХреА рддрд╛рд░реАрдЦ - 2017, bpftrace рдХреЗ рдЖрдЧрдорди рд╕реЗ рдкрд╣рд▓реЗ) рдХреА рд╕рдореАрдХреНрд╖рд╛ рд▓рд┐рдЦреАред


рдЬреВрд▓рд┐рдпрд╛ рдЗрд╡рд╛рдВрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд▓рд┐рдирдХреНрд╕ рдЯреНрд░реЗрд╕ рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо

рд╕рднреА рддрддреНрд╡ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред рдореБрдЭреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдПрдВ рдХрд┐ рдореИрдВ рдХрд┐рди рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рдирддрд╛ рд╣реВрдВред

рдШрдЯрдирд╛ рдХреЗ рд╕реВрддреНрд░

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


рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдЯреНрд░реЗрд╕ рдХрд┐рдП рдЧрдП рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди

рдХрд░реНрдиреЗрд▓ рд╕рд╛рдЗрдб рдкрд░, kprobes рд╣реИ ( "рдХрд░реНрдиреЗрд▓ рдЬрд╛рдВрдЪ", "рдХрд░реНрдиреЗрд▓ рд╕реЗрдВрд╕рд░", рд▓рдЧрднрдЧ рдкреНрд░рддрд┐ )) - рдПрдХ рддрдВрддреНрд░ рдЬреЛ рдЖрдкрдХреЛ рдХрд░реНрдиреЗрд▓ рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде, рдЖрдк рди рдХреЗрд╡рд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╕реНрд╡рдпрдВ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЙрдирдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдЕрдиреНрдп рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ)ред рдЖрдк рдХрд░реНрдиреЗрд▓ рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП kprobes рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирд╣реАрдВ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдмрдлрд░ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХ рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ", "рдЯреАрд╕реАрдкреА рдкреИрдХреЗрдЯ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рднреЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ" рдпрд╛ "рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИ"ред

рдХрд░реНрдиреЗрд▓ рдЯреНрд░реЗрд╕рдкреНрд╡рд╛рдЗрдВрдЯ рдХрд░реНрдиреЗрд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧреИрд░-рдорд╛рдирдХ рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпреЗ рдШрдЯрдирд╛рдПрдБ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд╕реНрддрд░ рдкрд░ рдирд╣реАрдВ рд╣реИрдВред рдРрд╕реЗ рдмрд┐рдВрджреБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд░реНрдиреЗрд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ TRACE_EVENT рдореИрдХреНрд░реЛ рдХреЛ рдХрд░реНрдиреЗрд▓ рдХреЛрдб рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред

рджреЛрдиреЛрдВ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рд╣реИрдВред Kprobes "рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ" рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди kprobe рдШрдЯрдирд╛рдПрдБ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдХрд░реНрдиреЗрд▓ рдХреЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреА рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд▓рдЧрд╛рддрд╛рд░ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ - рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдирд╛рдо рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ kprobes - upboards рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред рдЗрд╕реЗ рдпреВрдЬрд░ рд╕реНрдкреЗрд╕ рдореЗрдВ рдлрдВрдХреНрд╢рди рдХреЙрд▓реНрд╕ рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпреВрдПрд╕рдбреАрдЯреА рд╕реЗрдВрд╕рд░ ("рд╕реНрдЯреЗрдЯрд┐рдХрд▓реА рдбрд┐рдлрд╛рдЗрдВрдб рдпреВрдЬрд░ рд╕реНрдкреЗрд╕ рдЯреНрд░реИрд╕") рдпреВрдЬрд░ рд╕реНрдкреЗрд╕ рдореЗрдВ рдХрд░реНрдиреЗрд▓ рдЯреНрд░реЗрд╕ рдкреЙрдЗрдВрдЯреНрд╕ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдпреВрдПрд╕рдбреАрдЯреА рд╕реЗрдВрд╕рд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рджрд┐рд▓рдЪрд╕реНрдк рддрдереНрдп: рдбреАрдЯреНрд░реЗрд╕ рдиреЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдпреВрдПрд╕рдЯреА рд╕реЗрдВрд╕рд░ рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрдирд╛рд▓реЙрдЧ (DTRACE_PROP рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реА рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИред рд▓рд┐рдирдХреНрд╕ рдкрд░ рдЯреНрд░реЗрд╕ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рднреА DTRACE_PROBE рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ USDT рд╕реЗрдВрд╕рд░ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ!

рдЗрд╕рд▓рд┐рдП, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕реНрдЯреНрд░реЛрдХреНрд╕ рдХреЛ рдХреНрд░реЛрдмреЗрдмреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдкрдЯреЛрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЗрдЯреНрд░реЗрд╕ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрднреНрдпрд╛рд╕ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЗрдВрдЯрд░рдлреЗрд╕

рдЗрдВрдЯрд░рдлреЗрд╕ рдРрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдИрд╡реЗрдВрдЯ рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╡реЗрдВрдЯ рд╕реНрд░реЛрдд рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

  1. рдХрд░реНрдиреЗрд▓ рдПрдХ рддрдВрддреНрд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ - рдЖрдо рддреМрд░ рдкрд░ / proc рдпрд╛ sys рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реА рд╣реЛрддреА рд╣реИ - рдЬреЛ рдХрд┐ рдШрдЯрдирд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдЗрд░рд╛рджреЗ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдШрдЯрдирд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  2. рдкрдВрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХрд░реНрдиреЗрд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдХрд░реНрдиреЗрд▓ / рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдпреВрдЬрд░ рд╕реНрдкреЗрд╕ / рдЯреНрд░реЗрд╕ рдкреЙрдЗрдВрдЯ / рдпреВрдПрд╕рдбреАрдЯреА-рд╕реЗрдВрд╕рд░реЛрдВ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЙрдирдХрд╛ рдХреЛрдб рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреБрдЫ рдФрд░ рд╣реЛ рд╕рдХреЗред
  3. рдЗрд╕ "рдХреБрдЫ рдФрд░" рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдмрд╛рдж рдореЗрдВ рдХреБрдЫ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдпрд╣ рд╕рдм рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛! рдЗрд╕рд▓рд┐рдП, рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдЖрддреЗ рд╣реИрдВ: рд╡реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдм рдХрд░рддреЗ рд╣реИрдВред

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

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ bpftrace - рдирд╡реАрдирддрдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ - рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реИ рдФрд░ DTrace рдХреА рддрд░рд╣ рд▓рдЪреАрд▓рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдлреА рдирдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЪрдордХрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

eBPF


eBPF рдПрдХ рдирдпрд╛ рд▓рд┐рдирдХреНрд╕ рдЯреНрд░реЗрд╕ рд╕реНрдЯрд╛рд░ рд╣реИ рдЬрд┐рд╕ рдкрд░ bpftrace рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЬрдм рдЖрдк рдХрд┐рд╕реА рдИрд╡реЗрдВрдЯ рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдХреБрдЫ рдШрдЯрд┐рдд рд╣реЛред рдпрд╣ "рдХреБрдЫ" рдХреНрдпрд╛ рд╣реИ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рд▓рдЪреАрд▓рд╛ рддрд░реАрдХрд╛ рд╣реИ? рдмреЗрд╢рдХ, рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ (рдпрд╛ рдорд╢реАрди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред

EBPF (рдмрд░реНрдХрд▓реЗ рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдиреНрдирдд рд╕рдВрд╕реНрдХрд░рдг)ред рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рд╡рд╛рд▓реА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╣реИ рдЬреЛ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдЪрд▓рддреА рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдг / рд╕реАрдорд╛рдПрдБ рд╣реИрдВ:

  • рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдВрддрд░рд┐рдХреНрд╖ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдИрдЬреАрдкреАрдПрдл "рдХрд╛рд░реНрдб" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рд╣реИрдВред
  • рдХреЛрдИ рдЪрдХреНрд░ рдирд╣реАрдВ рд╣реИ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдИрдПрдХреНрд╕рдкреАрдПрдл рдХрд╛рд░реНрдпрдХреНрд░рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдордп рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПред
  • рд░реБрдХреЛ, рд╣рдордиреЗ рдХрд╣рд╛ рдХрд┐ рдмреИрдЪ рдлрд╝рд┐рд▓реНрдЯрд░? рдЖрдк рд╕рд╣реА рд╣реИрдВ: рд╡реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдереЗред рдпрд╣ рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдп рд╣реИ: рдЬрдм рдЕрдЧреНрд░реЗрд╖рдг рдкреИрдХреЗрдЯ (рдХрд┐рд╕реА рдШрдЯрдирд╛ рдХреА рдШрдЯрдирд╛) рдЖрдкрдХреЛ рдХреБрдЫ рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдПрдХ рдкреИрдХреЗрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛, рдЫреЛрдбрд╝рдирд╛, рдкрддреНрд░рд┐рдХрд╛ рдпрд╛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдирд╛, рдЖрджрд┐) рдРрд╕реА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрднрд╛рд╕реА рдорд╢реАрди рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдЬреЗрдЖрдИрдЯреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде) -kompilyatsii)ред рдПрдХ "рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд" рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐, рдмрд░реНрдХрд▓реЗ рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдиреЗрдЯрд╡рд░реНрдХ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд╛рд╣рд░ eBPF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╡рд╣рд╛рдВ рддреБрдо рдЬрд╛рдУред рдмреАрдкреАрдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде, рдЖрдк рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рди рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред Bpftrace рдЖрдкрдХреЗ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп bpftrace рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ eBPF bytecode рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ, рдФрд░ bytecode рдХреЛ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред

EBPF рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рдХрд╛рд▓реЗ рджрд┐рди


EBPF рд╕реЗ рдкрд╣рд▓реЗ, рд╕рдорд╛рдзрд╛рди рд╡рд┐рдХрд▓реНрдк рдереЗ, рдЗрд╕реЗ рд╣рд▓реНрдХреЗ рдврдВрдЧ рд╕реЗ, рдЕрдЬреАрдм рд░реВрдк рд╕реЗ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдПред SystemTap рд▓рд┐рдирдХреНрд╕ рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ bpftrace рдХреЗ рд▓рд┐рдП "рд╕рдмрд╕реЗ рдЧрдВрднреАрд░" рдкреВрд░реНрд╡рд╡рд░реНрддреА рдХрд╛ рдПрдХ рд╕рд╛ рд╣реИред SystemTap рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ C рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рддрдм рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

Bpftrace рд╕реНрдерд╛рдкрдирд╛


рдпрд╣ рдЕрдкрдиреА рдЖрд╕реНрддреАрди рдКрдкрд░ рд░реЛрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рд╣реИ! рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ, рд╣рдо Ubuntu 18.04 рдкрд░ bpftrace рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗред рд╡рд┐рддрд░рдг рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рджреМрд░рд╛рди, рд╣рдореЗрдВ рдЙрди рдкреИрдХреЗрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рдЕрднреА рддрдХ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реИрдВред

рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдерд╛рдкрдирд╛

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, Clang 5.0, lbclang 5.0, рдФрд░ LLVM 5.0, рд╕рднреА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕рд╣рд┐рдд рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рд╣рдо llvm.org рджреНрд╡рд╛рд░рд╛ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдП рдЧрдП рдкреИрдХреЗрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдмрдВрдЯреВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓реЛрдЧ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИрдВ ред

wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - cat <<EOF | sudo tee -a /etc/apt/sources.list deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial main deb-src http://apt.llvm.org/xenial/ llvm-toolchain-xenial main deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-5.0 main deb-src http://apt.llvm.org/xenial/ llvm-toolchain-xenial-5.0 main EOF sudo apt update sudo apt install clang-5.0 libclang-5.0-dev llvm-5.0 llvm-5.0-dev 

рдЕрдЧрд▓рд╛:

 sudo apt install bison cmake flex g++ git libelf-dev zlib1g-dev libfl-dev 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЙрдмрдВрдЯреВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдирд╣реАрдВ, рдЕрдкрд╕реНрдЯреНрд░реАрдо рд╕реЗ рд▓рд┐рдмрдлреЗрдХ-рджреЗрд╡ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рдЙрдмрдВрдЯреВ рдореЗрдВ рдЬреЛ рдкреИрдХреЗрдЬ рд╣реИ рдЙрд╕рдореЗрдВ рдХреЛрдИ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓ рдирд╣реАрдВ рд╣реИред рдФрд░ рдпрд╣ рд╕рдорд╕реНрдпрд╛ 18.10 рдкрд░ рднреА рд╣рд▓ рдирд╣реАрдВ рд╣реБрдИред

 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4052245BD4284CDD echo "deb https://repo.iovisor.org/apt/$(lsb_release -cs) $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/iovisor.list sudo apt update sudo apt install bcc-tools libbcc-examples linux-headers-$(uname -r) 

Bpftrace рдореБрдЦреНрдп рд╕реНрдерд╛рдкрдирд╛

рдпрд╣ рд╕реНрд░реЛрдд рд╕реЗ рдЦреБрдж bpftrace рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ! рдЪрд▓реЛ рдЗрд╕реЗ рдХреНрд▓реЛрди рдХрд░реЗрдВ, рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ / usr / рд╕реНрдерд╛рдиреАрдп рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

 git clone https://github.com/iovisor/bpftrace cd bpftrace mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=DEBUG .. make -j4 sudo make install 

рдФрд░ рдЖрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВ! рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп / usr / рд╕реНрдерд╛рдиреАрдп / рдмрд┐рди / bpftrace рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк cmake рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрдВрддрд╡реНрдп рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 DCMAKE_INSTALL_PREFIX=/usr/local. 

рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдЙрджрд╛рд╣рд░рдг

рдЪрд▓реЛ рд╣рдорд╛рд░реА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ bpftrace рд╕рд┐рдВрдЧрд▓-рд▓рд╛рдЗрдирд░реНрд╕ рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдмреНрд░реЗрдВрдбрди рдЧреНрд░реЗрдЧ рдХреЗ рдЧрд╛рдЗрдб рд╕реЗ рд▓рд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рд╣реИред

# 1. рд╕реЗрдВрд╕рд░ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ

 bpftrace -l 'tracepoint:syscalls:sys_enter_*' 

2. тАЬрдЕрднрд┐рд╡рд╛рджрди

 bpftrace -e 'BEGIN { printf("hello world\n"); }' 

3. 3. рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рдирд╛

 bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s %s\n", comm, str(args->filename)); }' 

# 4. рдкреНрд░рддрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛

 bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }' 

5. "рд░реАрдб рдСрдл () рдХреЙрд▓ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛

 bpftrace -e 'tracepoint:syscalls:sys_exit_read /pid == 18644/ { @bytes = hist(args->retval); }' 

6. 6. рд░реАрдб () рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╕рд░реНрдЬрд┐рдХрд▓ рдЕрдиреБрд░реЗрдЦрдг

 bpftrace -e 'kretprobe:vfs_read { @bytes = lhist(retval, 0, 2000, 200); }' 

# 7. рдкрдврд╝рдиреЗ () рдХреЙрд▓ рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рдордп

 bpftrace -e 'kprobe:vfs_read { @start[tid] = nsecs; } kretprobe:vfs_read /@start[tid]/ { @ns[comm] = hist(nsecs - @start[tid]); delete(@start[tid]); }' 

* 8. рдЧрдгрдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрддрд░ рдХреА рдШрдЯрдирд╛рдУрдВ

 bpftrace -e 'tracepoint:sched:sched* { @[name] = count(); } interval:s:5 { exit(); }' 

# 9. рдХрд░реНрдиреЗрд▓ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдвреЗрд░ рдХреЛ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд░рдирд╛

 bpftrace -e 'profile:hz:99 { @[stack] = count(); }' 

# 10. рдЯреНрд░реЗрд╕ рдкреНрд▓рд╛рдирд░

 bpftrace -e 'tracepoint:sched:sched_switch { @[stack] = count(); }' 

11. 11. рдЯреНрд░реЗрд╕ рдЕрд╡рд░реБрджреНрдз I / O

 bpftrace -e 'tracepoint:block:block_rq_complete { @ = hist(args->nr_sector * 512); }' 

рдЙрдкрд░реЛрдХреНрдд рдЯреАрдореЛрдВ рдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ , рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░реЗрдВрдбрди рдЧреНрд░реЗрдЧ рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рджреЗрдЦреЗрдВред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ I / O рдЯрд╛рдЗрдорд┐рдВрдЧ рдЙрджрд╛рд╣рд░рдг

'-рдИ' рд╕реНрд╡рд┐рдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ bpftrace рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛, рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ, рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ:

 <event source> /<optional filter>/ { <program body> } 

рдЖрдЗрдП рд╕рд╛рддрд╡реЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ, рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд░реАрдб рдСрдкрд░реЗрд╢рдВрд╕ рдХреЗ рд╕рдордп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:

 kprobe:vfs_read { @start[tid] = nsecs; } <- 1 -><-- 2 -> <---------- 3 ---------> 

рд╣рдо kprobe рддрдВрддреНрд░ рд╕реЗ рдШрдЯрдирд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рд╣рдо рдХрд░реНрдиреЗрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред
рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдлрд╝рдВрдХреНрд╢рди vfs_read рд╣реИ , рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рддрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХрд░реНрдиреЗрд▓ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд░реАрдб рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИ ("рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рд╛рдЗрд▓рд╕рд┐рд╕реНрдЯрдо рд╕реЗ VFS", рдХрд░реНрдиреЗрд▓ рдХреЗ рдЕрдВрджрд░ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯ)ред

рдЬрдм vfs_read рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ (рдпрд╛рдиреА рдЬрдм рдлрд╝рдВрдХреНрд╢рди рдиреЗ рдХреЛрдИ рдЙрдкрдпреЛрдЧреА рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ), bpftrace рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк (рдиреИрдиреЛрд╕реЗрдХрдВрдб рдореЗрдВ) рдХреЛ рд╕реЗрдВрдЯ рдЖрд░реНрдЯ рдирд╛рдордХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгреА рдореЗрдВ рдмрдЪрд╛рддрд╛ рд╣реИред рдХреБрдВрдЬреА tid рд╣реИ , рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдЖрдИрдбреА рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИред

 kretprobe:vfs_read /@start[tid]/ { @ns[comm] = hist(nsecs - @start[tid]); delete(@start[tid]); } <-- 1 --> <-- 2 -> <---- 3 ----> <----------------------------- 4 -----------------------------> 

1. рд╣рдо kretprobe рддрдВрддреНрд░ рд╕реЗ рдШрдЯрдирд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ , рдЬреЛ рдХрд┐ kprobe рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЬрдм рдлрд╝рдВрдХреНрд╢рди рдЕрдкрдиреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

2. рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдлрд╝рдВрдХреНрд╢рди vfs_read рд╣реИ ред

3. рдпрд╣ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдлрд┐рд▓реНрдЯрд░ рд╣реИред рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдкреНрд░рд╛рд░рдВрдн рд╕рдордп рдкрд╣рд▓реЗ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдлрд┐рд▓реНрдЯрд░ рдХреЗ рдмрд┐рдирд╛, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рджреМрд░рд╛рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдЕрдВрдд рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдордп nsecs - 0 , nsecs рдХреЗ рдмрдЬрд╛рдп - рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ ред

4. рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧред

nsecs - st art [tid] рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ vfs_read рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж рдХрд┐рддрдирд╛ рд╕рдордп рдмреАрдд рдЪреБрдХрд╛ рд╣реИред
@ns [comm] = hist (...) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рдХреЛ @ns рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рджреЛ-рдЖрдпрд╛рдореА рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ ред рдХреЙрдо рдХреБрдВрдЬреА рд╡рд░реНрддрдорд╛рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдирд╛рдо рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреА рд╣реИред рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рдХрдорд╛рдВрдб рд╣реЛрдЧреАред

рд╣рдЯрд╛рдПрдВ (...) рдкреНрд░рд╛рд░рдВрдн рд╕рдордп рдХреЛ рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгреА рд╕реЗ рд╣рдЯрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдЕрдВрддрд┐рдо рдирд┐рд╖реНрдХрд░реНрд╖ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рднреА рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░рд┐рдВрдЯ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рдХрдорд╛рдВрдб рдХреЗ рд╕реНрдкрд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред @ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЪрд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рдЗрд╕рдХреЗ рдХрд╛рд░рдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

 @ns[snmp-pass]: [0, 1] 0 | | [2, 4) 0 | | [4, 8) 0 | | [8, 16) 0 | | [16, 32) 0 | | [32, 64) 0 | | [64, 128) 0 | | [128, 256) 0 | | [256, 512) 27 |@@@@@@@@@ | [512, 1k) 125 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | [1k, 2k) 22 |@@@@@@@ | [2k, 4k) 1 | | [4k, 8k) 10 |@@@ | [8k, 16k) 1 | | [16k, 32k) 3 |@ | [32k, 64k) 144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| [64k, 128k) 7 |@@ | [128k, 256k) 28 |@@@@@@@@@@ | [256k, 512k) 2 | | [512k, 1M) 3 |@ | [1M, 2M) 1 | | 


USDT рд╕реЗрдВрд╕рд░ рдЙрджрд╛рд╣рд░рдг

рдЖрдЗрдП рдЗрд╕ C рдХреЛрдб рдХреЛ рд▓реЗрдВ рдФрд░ рдЗрд╕реЗ tracetest.c рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ :

 #include <sys/sdt.h> #include <sys/time.h> #include <unistd.h> #include <stdio.h> static long myclock() { struct timeval tv; gettimeofday(&tv, NULL); DTRACE_PROBE1(tracetest, testprobe, tv.tv_sec); return tv.tv_sec; } int main(int argc, char **argv) { while (1) { myclock(); sleep(1); } return 0; } 

рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдПрдХ рдмрд╛рд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб myclock () рдХрд╣рдХрд░ рдЪрд▓рд╛рддрд╛ рд╣реИред myclock () рд╡рд░реНрддрдорд╛рди рд╕рдордп рдкрд░ рд╕рд╡рд╛рд▓ рдЙрдард╛рддрд╛ рд╣реИ рдФрд░ рдпреБрдЧ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рд╕реЗрдХрдВрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдВ DTRACE_PROBE1 рдкрд░ рдХреЙрд▓ рдПрдХ рд╕реНрдерд┐рд░ USDT рдЯреНрд░реЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред

  • рдореИрдХреНрд░реЛ DTRACE_PROBE1 sys / sdt.h рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ USDT рдореИрдХреНрд░реЛ, рдЬреЛ рдРрд╕рд╛ рд╣реА рдХрд░рддрд╛ рд╣реИ, STAP_PROBE1 ( рд╕рд┐рд╕реНрдЯрдордЯреИрдк рд╕реЗ STAP, рдЬрд┐рд╕реЗ рдпреВрдПрд╕рдбреАрдЯреА рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдкрд╣рд▓рд╛ рд▓рд┐рдирдХреНрд╕ рддрдВрддреНрд░ рдерд╛) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ USDT DTrace рдпреВрдЬрд░ рд╕реНрдкреЗрд╕ рд╕реЗрдВрд╕рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ, DTRACE_PROBE1 рд╕рд┐рд░реНрдл STAP_PROBE1 рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИред
  • рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдирд╛рдо рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ DTrace рд╕реЗ рдмрдЪрд╛ рд╣реБрдЖ рдПрдХ рд╡реЗрд╕реНрдЯреЗрд╕реНрдЯрд┐рдпрд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ bpftrace рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИ ( рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ 328 рдЕрдиреБрд░реЛрдз рдкрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдбреАрдмрдЧ рдХрд░рддреЗ рд╕рдордп рдЦреЛрдЬрд╛ рдерд╛ ): рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдирд╛рдо рдЖрд╡реЗрджрди рдХреЗ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ bpftrace рдЯреНрд░реЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
  • рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЯреНрд░реЗрд╕ рдмрд┐рдВрджреБ рдХрд╛ рдирд╛рдо рд╣реИред
  • рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕рдВрджрд░реНрдн рд╣реИрдВред DTRACE_PROBE1 рдореЗрдВ рдирдВрдмрд░ 1 рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЖрдЗрдП рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ sys / sdt.h рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ, рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрд╛ рдЬрд╛рдП:

 sudo apt install systemtap-sdt-dev gcc tracetest.c -o tracetest -Wall -g 

рд╣рдо рдкреАрдЖрдИрдбреА тАЛтАЛрдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП bpftrace рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рднреА рдЯреЗрд╕реНрдЯрдкреНрд░реЙрдм рдкрд╣реБрдБрдЪрддрд╛ рд╣реИ рддреЛ "рд╕рдордп [рд╕рдВрдЦреНрдпрд╛]" рд╣реЛрддрд╛ рд╣реИ :

 sudo bpftrace -e 'usdt:/full-path-to/tracetest:testprobe { printf("%d: time is %d\n", pid, arg0); }' 

Ctrl-C рджрдмрд╛рддреЗ рд╕рдордп Bpftrace рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдирдпрд╛ рдЯрд░реНрдорд┐рдирд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рд╡рд╣рд╛рдВ рдЯреНрд░реЗрд╕рдЯреЗрд╕реНрдЯ рдЪрд▓рд╛рдПрдВ :

# рдирдП рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ
./tracetest

Bpftrace рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ, рд╡рд╣рд╛рдВ рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

 Attaching 1 probe... 30909: time is 1549023215 30909: time is 1549023216 30909: time is 1549023217 ... ^C 

рдЙрджрд╛рд╣рд░рдг рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди glibc ptmalloc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ

рдореИрдВ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП bpftrace рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд░реВрдмреА рдЗрддрдиреА рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рддреА рд╣реИред рдФрд░ рдореЗрд░реЗ рд╢реЛрдз рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЧреНрд▓рд┐рдмрдХ рдХреЗ рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрдЯрд░ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ ред

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

рд▓реЗрдХрд┐рди рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрдЪрд░рд╛ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░реВрдмреА рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдЙрдЪреНрдЪ рдореЗрдореЛрд░реА рдЦрдкрдд рдареАрдХ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рд╣реИред рдЗрд╕ рдХрдЪрд░реЗ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛: рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ "рдРрд╕рд╛ рдХреНрд╖реЗрддреНрд░ рдЪреБрдиреЗрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рди рд╣реЛ"? рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

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

рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрддреНрддрд░ рдирд╣реАрдВ рд╣реИ, рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рдЖрдкрдХреЛ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЧреНрд▓рд┐рдмрдХ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛, рдЬреЛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рд╡рд┐рдХрд▓реНрдк 3 рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рд░реВрдк рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ glibc рдореЗрдВ рдХреЛрдб рдбреАрдмрдЧрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рд╕рд╣реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рд╣реИред

рдпрд╣рд╛рдБ glibc рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рдирдпрд╛ рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рд▓рд┐рдорд┐рдЯ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдмрд╛рдж рд╣реА рдЗрд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 static mstate _int_new_arena(size_t size) { mstate arena; size = calculate_how_much_memory_to_ask_from_os(size); arena = do_some_stuff_to_allocate_memory_from_os(); LIBC_PROBE(memory_arena_new, 2, arena, size); do_more_stuff(); return arena; } 

рдХреНрдпрд╛ рдореИрдВ _int_new_arena рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдмреЛрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдирд╣реАрдВред рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдпрд╣ рдкреНрд░рддреАрдХ рдЧреНрд▓рд┐рдм рдЙрдмрдВрдЯреВ 18.04 рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреАред

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ USDT рд╕реЗрдВрд╕рд░ рд╣реИред LIBC_PROBE STAP_PROBE рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдереВрд▓ рдЙрдкрдирд╛рдо рд╣реИред
рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдирд╛рдо libc рд╣реИред
рд╕реЗрдВрд╕рд░ рдХрд╛ рдирд╛рдо memory_arena_new рд╣реИред
рдирдВрдмрд░ 2 рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ 2 рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рд╣реИрдВред
рдЕрдЦрд╛рдбрд╝рд╛ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдкрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдУрдПрд╕ рд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЖрдХрд╛рд░ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рд╣реИред

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЗрд╕ рд╕реЗрдВрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ, рд╣рдореЗрдВ рд▓рдЧрднрдЧ рдЕрдВрдХ 328 рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рд╣рдореЗрдВ рдирд╛рдо libc рдХреЗ рд╕рд╛рде рдХрд╣реАрдВ рди рдХрд╣реАрдВ glibc рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд▓рд┐рдВрдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ bpftrace рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдирд╛рдо (рдЬреЛ рдЕрдиреНрдпрдерд╛ libc-2.27.so рд╣реЛрдЧрд╛) рдкреНрд░рджрд╛рддрд╛ рдирд╛рдо (libc) рдХреЗ рд╕рдорд╛рди рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИред

 ln -s /lib/x86_64-linux-gnu/libc-2.27.so /tmp/libc 

рдЕрдм рд╣рдо bpftrace рдХреЛ USDT memory_arena_new рд╕реЗрдВрд╕рд░ рдкрд░ рд╣реБрдХ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рд╡рд┐рдХреНрд░реЗрддрд╛ рдирд╛рдо libc рд╣реИ :

 sudo bpftrace -e 'usdt:/tmp/libc:memory_arena_new { printf("PID %d: created new arena at %p, size %d\n", pid, arg0, arg1); }' 

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

 ruby -e '3.times { Thread.new { } }; sleep 1' 

Bpftrace рдХреЗ рд╕рд╛рде рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рд▓реМрдЯрддреЗ рд╣реБрдП, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ:

 Attaching 1 probe... PID 431: created new arena at 0x7f40e8000020, size 576 PID 431: created new arena at 0x7f40e0000020, size 576 PID 431: created new arena at 0x7f40e4000020, size 576 

рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рд╣реИ! рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рд░реВрдмреА рдореЗрдВ рдПрдХ рдирдпрд╛ рдзрд╛рдЧрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рдирдП рдХреНрд╖реЗрддреНрд░ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЯреНрд░реЗрд╕ рдкреЙрдЗрдВрдЯ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ? рдореБрдЭреЗ рдХреНрдпрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЖрдк рд╕рднреА рд╣рд╛рд░реНрдбрд╡реЗрдпрд░, рдЯрд╛рдЗрдорд░, kprobe рдФрд░ рд╕реНрдЯреЗрдЯрд┐рдХ рдХрд░реНрдиреЗрд▓ рдЯреНрд░реЗрд╕ рдкреЙрдЗрдВрдЯ рдХреЛ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдХрд░ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 sudo bpftrace -l 

рдЖрдк рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рднреА рдЕрдкрд╡рд░реНрдб рдЯреНрд░реЗрд╕ рдкреЙрдЗрдВрдЯреНрд╕ (рдлрдВрдХреНрд╢рди рдХреИрд░реЗрдХреНрдЯрд░) рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 nm /path-to-binary 

рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХреЛ рдЪрд▓рд╛рдХрд░ USDT рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рднреА рдЯреНрд░реЗрд╕ рдкреЙрдЗрдВрдЯреНрд╕ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 /usr/share/bcc/tools/tplist -l /path-to/binary 

рдХрд┐рд╕ рдЯреНрд░реЗрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдк рдЬреЛ рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рджреБрдЦ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдореИрдВ рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред

рдпреБрдХреНрддрд┐: рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдЯреНрд░реЗрд╕ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рд╛рд░реВрдк

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рдореИрдбрд╡рд╛рдЗрдЬрд╝ (..., MADV_DONTNEED) рдХреЛ рдХреЙрд▓ рдЯреНрд░реЗрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

 sudo bpftrace -l | grep madvise 

- рд╣рдореЗрдВ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рд╣рдо рдЯреНрд░реЗрд╕рдкреЙрдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: syscalls: sys_enter_madviseред

 sudo cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_madvise/format 

- рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рджреЗрдВрдЧреЗ:

 name: sys_enter_madvise ID: 569 format: field:unsigned short common_type; offset:0; size:2; signed:0; field:unsigned char common_flags; offset:2; size:1; signed:0; field:unsigned char common_preempt_count; offset:3; size:1; signed:0; field:int common_pid; offset:4; size:4; signed:1; field:int __syscall_nr; offset:8; size:4; signed:1; field:unsigned long start; offset:16; size:8; signed:0; field:size_t len_in; offset:24; size:8; signed:0; field:int behavior; offset:32; size:8; signed:0; print fmt: "start: 0x%08lx, len_in: 0x%08lx, behavior: 0x%08lx", ((unsigned long)(REC->start)), ((unsigned long)(REC->len_in)), ((unsigned long)(REC->behavior)) 

рдореИрдиреБрдЕрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░ Madvise рд╣рд╕реНрддрд╛рдХреНрд╖рд░: (рд╢реВрдиреНрдп * addr, size_t рд▓рдВрдмрд╛рдИ, int рд╕рд▓рд╛рд╣) ред рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдВрддрд┐рдо рддреАрди рдХреНрд╖реЗрддреНрд░ рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ!

MADV_DONTNEED рдХрд╛ рдЕрд░реНрде рдХреНрдпрд╛ рд╣реИ? Grep MADV_DONTNEED / usr / рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдХреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ 4 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:

 /usr/include/x86_64-linux-gnu/bits/mman-linux.h:80:# define MADV_DONTNEED 4 /* Don't need these pages. */ 

рддреЛ рд╣рдорд╛рд░реА bpftrace рдЯреАрдо рдмрди рдЬрд╛рддреА рд╣реИ:

 sudo bpftrace -e 'tracepoint:syscalls:sys_enter_madvise /args->behavior == 4/ { printf("madvise DONTNEED called\n"); }' 

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


Bpftrace рдЕрджреНрднреБрдд рд╣реИ! Bpftrace рднрд╡рд┐рд╖реНрдп рд╣реИ!

рдпрджрд┐ рдЖрдк рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдиреЗрддреГрддреНрд╡ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдмреНрд░реЗрдВрдбрди рдЧреНрд░реЗрдЧ рдХреЗ рдмреНрд▓реЙрдЧ рдкрд░ 2019 рдХреА рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВред

рдЕрдЪреНрдЫрд╛ рдбрд┐рдмрдЧрд┐рдВрдЧ!

Source: https://habr.com/ru/post/hi441258/


All Articles